「マクロ・関数をメニューで呼び出す」の版間の差分

提供:MeryWiki
ナビゲーションに移動 検索に移動
(ページの作成:「 == menu.js == <source lang="javascript"> #title = "Menu" var fso = new ActiveXObject("Scripting.FileSystemObject"), libdir = fso.GetParentFolderName(Editor.FullNa...」)
 
編集の要約なし
1行目: 1行目:
お盆休みにマクロ作成に挑戦してみました.
関数やマクロをメニュー形式で呼び出すためのマクロです.
マクロの本体(コード)のファイル '''menu.js''' と,メニューそのものをオブジェクトリテラルで定義するファイル '''menu.json''' から成ります.
いずれのファイルもインストールしたフォルダの下の '''My Macro''' の下におきます.
(マクロの中でそのマクロファイルのパスを取得する方法が分からなかったので,'''My Macro''' 決め打ちの,ちょっと不細工なコードになっています)


== menu.js ==
== menu.js ==
58行目: 64行目:
}
}
</source>
</source>
--[[特別:投稿記録/202.215.166.72|202.215.166.72]] 2013年8月19日 (月) 19:15 (JST)

2013年8月19日 (月) 19:15時点における版

お盆休みにマクロ作成に挑戦してみました. 関数やマクロをメニュー形式で呼び出すためのマクロです.

マクロの本体(コード)のファイル menu.js と,メニューそのものをオブジェクトリテラルで定義するファイル menu.json から成ります. いずれのファイルもインストールしたフォルダの下の My Macro の下におきます. (マクロの中でそのマクロファイルのパスを取得する方法が分からなかったので,My Macro 決め打ちの,ちょっと不細工なコードになっています)

menu.js

#title = "Menu"

var fso = new ActiveXObject("Scripting.FileSystemObject"),
    libdir = fso.GetParentFolderName(Editor.FullName) + "\\My Macros\\",
    menu = eval('(' + fso.OpenTextFile(libdir + "menu.json").ReadAll() + ')');

execMenu(menu);

function execMenu(menu) {
  var n, i = 1, a = [null], m = CreatePopupMenu(), f;
  for (n in menu) {
    a.push(n);
    f = undefined;
    if (n.match(/^---/)) f = meMenuSeparator;
    else if (!menu[n]) f = meMenuGrayed;
    else if (menu[n].constructor == Number) f = menu[n];
    else if (menu[n].constructor == Object) n += '\t≫';
    m.Add(n, i++, f);
  }
  if (i = m.Track(mePosMouse)) execItem(menu[a[i]]);
}

function execItem(item) {
  switch (item.constructor) {
  case Function: item(); break;
  case String: execMacro(item); break;
  case Object: execMenu(item); break;
  }
}

function execMacro(fn) {
  eval(fso.OpenTextFile(libdir + fn).ReadAll().replace(/^#.*/, ""));
}

menu.json

// 関数を定義する場合は,事前に関数定義をコンマで区切って並べておきます.
// (全体を式として評価するため,実際は式をコンマ演算子で並べていることに
//  なります)
function message2() { alert("Good Luck!"); },
flag = false,
// メニュー項目を Object で表記します.
{
	"Hello":	function () { alert("Hello!"); },	// 値が関数オブジェクトなら,それを実行します.
	"---":		null,				// --- で始まるプロパティはセパレータになります.
	"重複行の削除":	"連続する重複行を削除.js",	// 値が文字列なら,マクロを呼び出します.
	"Good Luck":	flag && message2,		// 値が false なら,無効に(灰色に)なります.
	"----":		null,				// 複数のセパレータを用いる場合はプロパティをを変えてください.
	"Sub": {					// 値が Object なら,サブメニューになります.
		"Good Luck":	flag || message2,
		"Good Bye":	meMenuGrayed		// これでも無効に(灰色に)なります.
	}
}

--202.215.166.72 2013年8月19日 (月) 19:15 (JST)

スポンサーリンク