Xpath使えるんだからGM_も使いたいよね
ということでGM系関数を実装してみたが、その前に普通の言語やサイト上での利用と異なり、SleipnirScriptでは*1直接的なライブラリ呼び出し手段が無い。さらに、GM_xmlhttpRequestを非同期で使うには毎回@type SleipnirScriptで起動して_windowにオブジェクト渡して、といった処理がいる。ライブラリ呼び出しのための定型文はコピペでいいものの、ライブラリの内容よりライブラリ呼び出しが複雑になっては本末転倒なので、橋渡し的なスクリプトにそのあたりの処理とライブラリのロードをまとめて行なわせることにした。
ラボの製作中:ライブラリブリッジがそのためのスクリプトで、Sleipnir\plugins\seahorse\bridge.jsに保存しておき、
var include = [ "GMWrapper", //GM_系を使えるようにするラッパー ""//ダミー。無くてもいい ]; RunScriptEx(ScriptFullName.replace(ScriptName, '').replace(/(seahorse|scripts)\\(|\.js)/, '') + "seahorse\\bridge.js", "loadlib", [todo, include, ScriptName]); function todo() { //todo }
のようにして使う。
ラボの製作中:GMラッパーは、このライブラリブリッジから呼び出すことを想定している。Sleipnir\plugins\seahorse\lib\GMWrapper.js*2に保存してあれば、上記のように"GMWapper"を指定するだけで読み込める。GM_registerMenuCommandはキー関連が未実装。右下隅にウサギのアイコンが出るので左クリックしてメニューを表示する。メインメニューへの追加は無理な話なので諦めてくれ。
GM_xmlhttpRequestはonerror, onreadystatechangeが未実装。postメソッドやshift_jisでの取得は大丈夫だと思う。ライブラリブリッジから呼び出す分には非同期だしクロスドメインも大丈夫なはず。まだ完成度は低く本家との互換性も怪しいものの、GM_logとかGM_getValue, GM_setValueなんかは移植用途でなくてもそれなりに便利に使えると思う。
GM系ではないが、Tridentではdataスキームが使えないので、base64のコードを受け取ってデコード結果をファイルに保存するbase64toFile関数を用意した*3。
ライブラリブリッジでGMラッパーとJavaScript-Xpathを利用するサンプル
アイコンクリックででてくるメニューにいくつかのコマンドを追加する。UIがわかりづらいが検索バーのスクリプトを実行*4はISleipnirやAPI、GM_、Xpathもつかえるブックマークレットのように使える。
var include = [ "GMWrapper", //GM_系を使えるようにするラッパー "javascript-xpath-latest*", //Xpath使えるようにするライブラリ ""//ダミー。無くてもいいけど ]; RunScriptEx(ScriptFullName.replace(ScriptName, '').replace(/(seahorse|scripts)\\(|\.js)/, '') + "seahorse\\bridge.js", "loadlib", [todo, include, ScriptName]); function todo() { GM_registerMenuCommand("検索バーのスクリプトを実行", evalScript, "", "", ""); GM_registerMenuCommand("検索バーのスクリプトを一時登録", registerScript, "", "", ""); GM_registerMenuCommand("リンクの数", countLink, "", "", ""); GM_registerMenuCommand("ヘッダの取得", showHeader, "", "", ""); function countLink() { var r = document.evaluate('//a[@href!=""]', document, null, 7, null); GM_log("リンクの数は" + r.snapshotLength); } function showHeader() { GM_xmlhttpRequest({ method:"get", url:location.href, //charset:"euc-jp",//省略したらADODBの自動判別を使う headers:{ "User-agent":"Sleipnir" }, onload:function(details) { GM_log(details.responseHeaders); //GM_log(details.responseText); } }); } function evalScript() { eval(sleipnir.API.SearchBarString); } function registerScript() { GM_registerMenuCommand( prompt("コマンド名の入力", "一時メニュー"), (function() { var src = sleipnir.API.SearchBarString; return function () {eval(src);} })(), "", "", "" ); } }
28日追記
ScriptNameが拡張子なしのファイル名を返す環境*5があるようなので呼び出し例を修正した。
ライブラリブリッジをmosaで動作しないようにし、ライブラリから利用しそうな変数を整理した(ver0.30)。
GMラッパーのメニュー関係を強化し、accelKey*6とaccessKeyを使えるようにした。メニュー自体はビューにフォーカスがある状態でctrl+Mで開く(ver0.20)。GM_xmlhttpRequestのonreadystatechangeが未実装なままだけどどうしたものか。