Greasemonkey0.8の@requireを試してみた
自分なりに使い方が理解出来たのでメモ的にまとめてみた
たとえば以下のようなユーザスクリプトで
// ==UserScript== // @name Amazon Iwaki City Lib linky for Greasemonkey // @namespace natu-n.com // @description Iwaki City Library Lookup from Amazon book listings. // @include http*://*.amazon.* // @resource config http://natu-n.com/data/iwaki1.js // @require http://natu-n.com/data/libsearch1.js // ==/UserScript==
という形で定義ファイルを@resource、共通部を@requireで指定すると
@requireで指定したスクリプトが// ==UserScript==以降に展開され
(function(){ eval(GM_getResourceText("config")); /********************************************************************** メイン関数 **********************************************************************/ var FlgRes = false; if (!document.getElementById("ASIN")) { return }; var header; var isbn = document.getElementById("ASIN").value; if (isbn.match(/(\d{9}[\d|X])/)) { if (header = document.evaluate("//div[@class='buying']//b[@class='sans']", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue || null) { checkLibrary(header, isbn); } }
更に、eval(GM_getResourceText("config"))で以下のスクリプトが評価され変数としてアクセス出来る
//■検索ページのURL。プログラム内では、このURLにISBNを付加して呼び出します const QUERY_URL_PREFIX = "https://library.city.iwaki.fukushima.jp/wehome/we/opac/kensakucheck.jsp?" + "kensaku.x=35&kensaku.y=22&sryskb0=1&allsryskb0=1&sryskb1=2&allsryskb1=2&" + "sryskb2=3&allsryskb2=3&sryskb_length=3&taisyokan1=0&kanmei_length=6&" + "max_kensu=10&KSKNO1=019&KEYWORD1=&ITTI1=1&f_kanzen1=0&ANDOR2=0&" + "KSKNO2=020&KEYWORD2=&ITTI2=1&f_kanzen2=0&ANDOR3=0&KSKNO3=005&KEYWORD3=&" + "ITTI3=1&f_kanzen3=0&ANDOR4=0&KSKNO4=070&KEYWORD4=&ITTI4=1&f_kanzen4=0&" + "tandoku=120&tandoku_keyword="; const QUERY_URL_SUFFIX = "&siborikomi=040&hanni1=&hanni2="; const DETAIL_URL = "https://library.city.iwaki.fukushima.jp/wehome/we/opac/"; //■検索結果の文字列。_1は英字、_2はUNICODEにエンコードされた全角文字を設定 const LIB_NAME_1 = "To Iwaki City Library"; const LIB_NAME_2 = "\u3044\u308f\u304d\u5e02\u7acb\u56f3\u66f8\u9928"; const ID = "iwaki"; //■ハイフンを付与するか否か 1:付けない 2:付ける const DASH = 1; //■書籍の有無の目印 const XPATH = "//p[3]/table/tbody/tr/td[3]/a";
なんて感じで動作して一見便利なようですが、一回resourceなりrequireで取得したスクリプトはクライアント側のプロファイル/gm_scripts/ユーザスクリプト名/配下に格納されてユーザスクリプトをアンインストールしない限り二度と更新する術がない*1
全く同じスクリプトでもユーザスクリプト別にそれぞれ持ってしまうのでかなり意味がない*2
ユーザスクリプト名のディレクトリを掘るのではなく、perlのrequire(use) foo::bar::buzzみたいにrequireで指定したurlでディレクトリを掘ってくれれば使い廻しが出来るのになというのが正直な感想でした