MeryWikiのマクロライブラリに投稿しました。
Meryのマクロ、ではないのですがライブラリのよーなものを書きました。
ポップアップメニューを手軽に扱う - MeryWiki
MeryWikiはMediaWikiなんですね。ページにヘルプが見つからなくて最初は記法が分からなかった。
以下裏話的なもの
簡単な使い方
var x = ShowPopupMenu(["Spring","Summer","Autumn","Winter"] ); Document.Write(x);
ESCキーでメニューを閉じたときの挙動
一関数にスクリプト自体を落とすほどの権限を与えていいか悩みましたが、この方が直感的だろうということでこういう風にしました。最初の例も2行で書けるしね。そんな訳で挙動は変えれるように。関数オブジェクトを指定できるので割と何でもできます。
再帰定義されたオブジェクトの話
普段ならこのような特殊なケースは見逃すことが多いのですが、今回は冴えていました。ちなみにこうすると
var menu = {}; menu["怖くね"] = 0; menu["無限ループって"] = menu;
使われ方
文字列を挿入するなら
var menu = {}; menu["svn"] = "static void Main()"; menu["cw"] = "Console.WriteLine"; Document.Write(ShowPopupMenu(menu));
と値に文字列を指定してほかの関数に渡すのが楽かな。
実行したいことが全くの別物なら関数オブジェクトを指定する方が簡単か。
var menu = {}; menu["ソート"] = SortSuruFunction; menu["重複行を削除"] = ChofukuKesuyoFunction; ShowPopupMenu(menu);
Tips
基本的にメニュー選択時に返り値を決定したいならfunctionでくるむ。実行する関数に引数を渡したい時も
menu["Insert"] = function(){Document.Write("挿入する");};
こんな感じ
おまけのShowMenuMini関数
実は一度Wikiに載せた後テストしたら動かなくて(昨日は動いたのに……)いったん削除していた。そのあと使用例の関数名を間違えていたことが分かったので再投稿しました。動的にメニューを作成したい時はこっちの方が便利かな。そういう使い方を想定しているのでセパレーター機能は標準ではオフになっている。これを一行の変更で切り替えれるようにするためだいぶ頭をひねったり。