Amazonに図書館の検索結果を差し込むGreasemonkey

だいぶほったらかしになっていたAmazonの商品詳細ページから図書館の蔵書の有無を調べるGreasemonkeyの更新なのですが、
大まかに動作が確認出来たので再度途中経過など

大きな変更点としては、所増の有無の判定にXPathを使う事と検索中のメッセージを表示する事の2点
GM_xmlhttpRequestのレスポンスからノードに変換するのはhttp://userscripts.org/scripts/show/8551を参考にさせていただきました

サンプル

〜略〜
var XPATH = "//table[5]/tbody/tr/td[3]/a";
〜略〜
    GM_xmlhttpRequest({
        method : "GET",
        url    : QUERY_URL_PREFIX + isbn + QUERY_URL_SUFFIX,
        headers: {
                    'User-Agent'  : 'Mozilla/4.0 (compatible) Greasemonkey',
                    'Content-type': 'application/x-www-form-urlencoded'
                 },
        onerror : function(response) {
                var tx = STTS_NAME_5 + LIB_NAME_2;
                lk.appendChild(document.createTextNode(tx))
                loading.removeChild(loading.lastChild);
                loading.appendChild(df);
        },
        onload : function(response) {
            FlgRes = true;

            var htmlDoc = createHTMLDocumentByString(response.responseText);
            var nodes = document.evaluate(
                        XPATH, htmlDoc, null,
                        XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
            switch(nodes.snapshotLength) {
                case 0:     // 所蔵なし
                    var tx   = STTS_NAME_1;
                    var href = QUERY_URL_PREFIX + isbn + QUERY_URL_SUFFIX;
                    break;
                case 1:     // 1件所蔵
                    var tx   = STTS_NAME_2;
                    var href = DETAIL_URL
                             + nodes.snapshotItem(0).getAttribute("href");
                    break;
                default:    // 複数所蔵
                    var tx   = STTS_NAME_3;
                    var href = DETAIL_URL
                             + nodes.snapshotItem(0).getAttribute("href");
            }
            lk.setAttribute('title', LIB_NAME_2);
            lk.setAttribute('href',  href);
            lk.appendChild(document.createTextNode(tx + LIB_NAME_2))
            df.appendChild(lk);
            loading.removeChild(loading.lastChild);
            loading.appendChild(df);
      }
    });

// utility functions.
function createHTMLDocumentByString(str) {
    var html = str.replace(/<!DOCTYPE.*?>/, '').replace(/<html.*?>/, '').replace(/<\/html>.*/, '')
    var htmlDoc  = document.implementation.createDocument(null, 'html', null)
    var fragment = createDocumentFragmentByString(html)
    try {
        fragment = htmlDoc.adoptNode(fragment)
    } catch(e) {
        fragment = htmlDoc.importNode(fragment, true)
    }
    htmlDoc.documentElement.appendChild(fragment)
   return htmlDoc
}

function createDocumentFragmentByString(str) {
    var range = document.createRange()
    range.setStartAfter(document.body)
    return range.createContextualFragment(str)
}

}
})();

雑感

全然やる気は無いのだけれどアイデアとして図書館固有の情報*1をサーバーに持つ形式にすると便利になるのかな?やらないけど

*1:館名とかurlとかXPath式など