続・ScriptRegisterをフォークする

久々の Sleipnir 2 用新作プラグイン

Sleipnir 2 と Sleipnir Mobile のブックマークを同期させる「Fenrir Pass Bookmark プラグイン」のα版が公開されましたね。
まだ、αなので気になった点があれば TwitterFacebook2ch やなんやらで要望投げていきましょう。

個人的には"Sleipnir 2 のブックマークとは独立"しているらしいし、使ってみようかな。
何だかんだでまだ必要無いしと Fenrir Pass 取って無かったのですが、遂に年貢の納め時(?)が来たようですw

Sleipnir Mobile とブックマークの共有ができる Sleipnir 2 用プラグインα版をリリースしました

[追記 2012 Feb. 9th 00:30ごろ]
Fenrir Pass Bookmark と Nun! Extension の相性が悪いっぽいらしいです。

Fenrir Pass Bookmark と Nun! Extension の相性が悪いみたいなので調整中です。調整が完了したらアップデートしますので、終了時エラーが発生する場合は Nun! の仕様を一時中止してください。(と、言ってみるテスト。

https://twitter.com/t_o/status/167267906432929792

[/追記]

とあるエントリを読んで考えてみた

Sleipnirを初心者がいじりまくるブログさんが3年ぶりに復活されたみたいですね。
で、ScriptRegisterを導入してスクリプトをどんどん導入しようを読んで改めて考えさられました。
残念ながら Firefox とか Chrome と比較して Sleipnir 2 はスクリプトを導入するときなどに手間がかかります。
いや、Fenrir 謹製なら SmartInstaller でワンクリックなんですけどね。SAHK もワンクリックでおkですけどそこに至るまでの準備が必要ですし。
要するに慣れた人なら呼吸と同じくらい特に考えるまでも無くさくっとインストール可能ですが、慣れない人には結構な負担です。
かくいう私も使い始めの頃はスクリプトの種類の違いとかフォルダ階層とか混乱していたような記憶があります。

そんなことを思いながら読んでいたら、もうちょっとどうにかできないかと灰色の脳をこねくり回して搾り出してみました。

その方法とは Sleipnir スクリプト を使うことである。*1
ちなみに Sleipnirスクリプトには勘違いしやすい部分がかぁーなぁーりあるので、注意されたし。
Sleipnirのスクリプトがわかりにくいので整理してみる。とか読むと多少理解の手助けになるかもしれない。

話を戻してこの結論に至った過程としては、上でも触れているがフォルダ階層が分かりにくいので、そこん所を考えないようにできる方法があるからだ。
という訳で少し書いてみる。


0.事前にやっておくべきこと
Sleipnirオプションの「クライアント>全般≫スクリプトによるクライアントの操作を許可する」にチェックを入れておく。
UserAction Extension をインストールしておく。


1.Sleipnir スクリプト が入っているフォルダを開く
最近の Sleipnir のデフォルト「advance」スタイルならメニューの「ツール>スクリプトスクリプトの整理」をクリックすれば良い。
sleipnir」スタイルであるならば、「スクリプトスクリプトの整理」である。

2.Sleipnir スクリプトをいくつか作る
先ほど開いたフォルダに以下で紹介する内容のファイルを作ってください。拡張子は".js"です。
ファイルを作成したあとメニューから「スクリプトの再読み込み」を行ってください。先ほどの「スクリプトの整理」の近くにあります。

(function(){new ActiveXObject("Shell.Application").Open(new ActiveXObject('Sleipnir.API').AppPath.replace(/bin\\$/, 'plugins\\scripts'));})();

UAスクリプトを置くフォルダを開くスクリプトです。

(function(){new ActiveXObject("Shell.Application").Open(new ActiveXObject('Sleipnir.API').AppPath.replace(/bin\\$/, 'plugins\\seahorse'));})();

Seahorseスクリプトを置くフォルダを開くスクリプトです。今回の話には関係ないんですけど作っておくと便利なときもあるかも。

    • フォルダを開く - ユーザ設定フォルダ.js
(function(){new ActiveXObject("Shell.Application").Open(new ActiveXObject('Sleipnir.API').UserPath);})();

※ユーザ設定各種のファイルがある場所を開きます。これも今回の話には関係ないんですけど作っておくと便利なときもあるかも。

    • ScriptRegisterBranch.js
// Original source code is "ScriptRegister"( http://community.tabbrowser.jp/forum/viewtopic.php?p=3619#3619 )
// Origin is Sleipnir User Action Script
// Written by Puyo2

var pnir = new ActiveXObject('Sleipnir.API');
if (pnir != null) {
	var document;
	if(document == null) {
		id = pnir.GetDocumentID(pnir.ActiveIndex);
		document = pnir.GetDocumentObject(id);
	}
	var targetDocument = document;
	while ((/frame/i).test(targetDocument.activeElement.tagName)) {
		targetDocument = targetDocument.activeElement.contentWindow.document;
	}
	
	var selectedText = targetDocument.selection.createRange().text;
	
	if(selectedText) {
		selectedText = selectedText.replace(/ *[|\r]\n/g, "\n");
		var end = (pnir.AppPath+'..\\plugins\\scripts\\hoge').lastIndexOf("\\");
		end = (pnir.AppPath+'..\\plugins\\scripts\\hoge').lastIndexOf("\\", end - 1);
		var path = (pnir.AppPath+'..\\plugins\\scripts\\hoge').substring(0, end);
		path = path.replace(/[^\\]+\\\.\.\\/, "");
		if((/==User[S]cript==/).test(selectedText)) {
			var extension = ".user.js";
			path += "\\seahorse\\";
			var message = "登録するSeaHorseスクリプトの名前を入力してください(拡張子不要)";
		}
		else if((/javascript:/).test(selectedText)){
			var extension = ".js";
			path += "\\..\\bookmarklet\\";
			var message = "登録するBookmarkletの名前を入力してください(拡張子不要)";
		}else {
			var extension = ".js";
			path += "\\scripts\\";
			var message = "登録するUserActionスクリプトの名前を入力してください(拡張子不要)";
		}
		
		var fileName = pnir.InputBox(message, "");
		if(fileName) {
			var fso = new ActiveXObject("Scripting.FileSystemObject");
			var file = fso.CreateTextFile(path + fileName + extension, true, false);
			try {
				if(file) {
					file.Write(selectedText);
					
					pnir.MessageBox("正常にスクリプトを登録できました");
				}
				else {
					pnir.MessageBox(path + fileName + extension + "を開けない?ファイル名に使えない文字が含まれているかもしれません");
				}
			}
			finally {
				file.Close();
			}
		}
		else {
			pnir.MessageBox("処理を中止しました");
		}
	}
	else {
		pnir.MessageBox("選択文字列の取得に失敗しました");
	}
}
else {
	pnir.MessageBox("オプションの\n クライアント|全般|スクリプトによるクライアントの操作を許可する\nにチェックがないと動作しません");
}

UAスクリプトの ScriptRegister を Sleipnirスクリプトに移植したものです。*2

3.オリジナルの UserAction版 ScriptRegister を作成する。
UserAction スクリプト配布で ScriptRegister のコードをトリプルクリックして選択状態にしたままメニューの「スクリプト」に「ScriptRegisterBranch*3」が追加されているので実行するとScriptRegisterがUAスクリプトとして作成される。*4
念のため同じく先ほど作ったはずの「フォルダを開く - UAスクリプト」を実行してみて、作ったファイルがあるか確認してみよう。
あとは、Sleipnirを一度再起動させて、Sleipnirのメニューに登録すればおk。
この辺はネタ元のScriptRegisterを導入してスクリプトをどんどん導入しように書いてあるので詳細は割愛。

ふと思ったこと

そう言えばVista以降はUACとかVirtualStoreとかセキュリティ的に厳しくなったんだけど。
そういう制限があってもScriptRegisterとかちゃんと動くのかな?
メインはアーカイブ版だし、Adminユーザだし、普段ScriptRegister使わないし、検証するの面倒だし試さないけどw

*1:Sleipnirスクリプト」「1.xx 互換スクリプト」「WSH スクリプト」などとも言われる

*2:正確には1年前に書いたエントリ「ScriptRegisterをフォークする」で紹介したものを移植

*3:ファイル名を別のにしたならそのファイル名

*4:ファイル名の入力が必要なのだが、UAスクリプトの名前は半角英数と"_"(半角アンダーバー)のみなので注意。よって「ScriptRegister」が無難