Amazonから図書館へのリンクを差し込むユーザスクリプトを(ほぼ)全面的に書き換えた

前回のバージョンUPから大分たってAmazon側の仕様変更等できちんと機能していなかった部分等を見直して多少なりとも見れるようにしたつもり
一通り更新が終わったらGreasemonkey専用版も更新します

確認が取れている環境

OS ブラウザ 拡張等
OSX(10.4.11) Safari3.1 GreaseKit Version 1.4
Opera 9.26  
Firefox 2.0.0.12 Greasemonkey 0.7.20080121.0
XP Home Edition SP2 Sleinir 2.6.2(IE7) SeaHorse 1.1.2
VMware Fusion(1.1.1)
XP Professional Edition SP2
Sleipnir 2.6.2(IE8 Beta)

スクリプトの内容

今回からスクリプトを晒す事でより品質が上がる事を祈るライフハック

// ==UserScript==
// @name          Amazon Iwaki City Lib linky
// @namespace     natu-n.com
// @description   Iwaki City Lookup from Amazon book listings.
// @include       http*://*.amazon.*
// ==/UserScript==

(function(){
var 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=";
var QUERY_URL_SUFFIX
 = "&siborikomi=040&hanni1=&hanni2=";
var LIB_NAME_1 = "To Iwaki City Library";
var LIB_NAME_2 = "\u00BB \u3044\u308F\u304D\u5E02\u7ACB\u56F3\u66F8\u9928";
var DASH       = 1;

var re1 = new RegExp("");
    re1.compile("(?:\\d{9}[\\d|X])");
var re2 = new RegExp("");
    re2.compile("\/(\\d{9}[\\d|X])\/");
var re3 = new RegExp("");
    re3.compile("ysProdImage[.](\\d{9}[\\d|X])");

var headers;
var header;
var result;
var target;
var link;

    if (document.getElementById("ASIN")) {
        var asin = document.getElementById("ASIN").value;
        if (result = re1.test(asin) || null) {
            asin = SetISBN(asin);
            var buyings = getElementsByClassName(document.body, 'buying');
            for (var i=0, j=buyings.length; i<j; i++) {
                var buying = buyings[i];
                if (target = getElementsByClassName(buying,
                                                    'sans')[0] || null) {
                    target.parentNode.insertBefore(SetDf(asin, 1),
                                                   target.nextSibling);
                    break;
                }
            }
        }
    }
    else {
        if (headers = getElementsByClassName(document.body,
                                             'simButton') || null) {
            for (var i=0, j=headers.length; i<j; i++) {
                header = headers[i];
                if (result = re2.exec(header.innerHTML) || null) {
                    var asin = result[1];
                        asin = SetISBN(asin);
                    header.parentNode
                          .insertBefore(SetDf(asin, 1),
                                        header.previousSibling);
                }
            }
        }

        if (headers = getElementsByClassName(document.body,
                                             'dataColumn') || null) {
            for (var i=0, j=headers.length; i<j; i++) {
                header = headers[i];
                link   = header.getElementsByTagName('a')[0];
                if (result = re2.exec(link.getAttribute("href")) || null) {
                    var asin = result[1];
                        asin = SetISBN(asin);
                    target = getElementsByClassName(header,
                                                    'bindingBlock')[0];
                    target.parentNode.insertBefore(SetDf(asin, 1),
                                                   target.nextSibling);
                }
            }
        }

        if (headers = document.getElementsByTagName('a') || null) {
            for (var i=0, j=headers.length; i<j; i++) {
                if (result = re3.exec(headers[i].innerHTML) || null) {
                    var asin   = result[1];
                    var id     = "ysProdLink." + asin;
                        asin   = SetISBN(asin);
                    if (target = document.getElementById(id) || null) {
                        target.parentNode
                              .insertBefore(SetDf(asin, 1),
                                            target.nextSibling);
                    }
                }
            }
        }

        if (headers = getElementsByClassName(document.body,
                                                      'sans') || null) {
            for (var i=0, j=headers.length; i<j; i++) {
                header = headers[i];
                if (link = header.getElementsByTagName('a')[0] || null) {
                    if (result = re2.exec(link.getAttribute("href")) || null) {
                        var asin = result[1];
                            asin = SetISBN(asin);
                        header.parentNode.insertBefore(SetDf(asin, 1),
                                                       header.nextSibling);
                    }
                }
            }
        }
    }

function SetISBN(asin) {
    if (DASH == 2) {
        var pub = asin.substr(1, 2);
        var pos = pub < 20 ? 3
                : pub < 70 ? 4
                : pub < 87 ? 5
                : pub < 90 ? 6
                : pub < 95 ? 7
                :            8
                ;
        asin  = asin.substring(0, 1)
              + '-' + asin.substring(  1, pos)
              + '-' + asin.substring(pos,   9);
    }
    else {
        asin = asin.substring(0, 9);
    };
    return asin;
}

function SetDf(asin, Flg) {
    var df = document.createDocumentFragment();
    var sp = document.createElement('span');
        sp.style.fontWeight = "normal";
    var lk = document.createElement('a');
        lk.setAttribute('href',  QUERY_URL_PREFIX + asin + QUERY_URL_SUFFIX);
        lk.setAttribute('title', LIB_NAME_1);
        lk.appendChild(document.createTextNode(LIB_NAME_2));
        sp.appendChild(lk);
        if (Flg == 1) {
            df.appendChild(document.createElement('br'));
            df.appendChild(sp);
        }
        else {
            df.appendChild(sp);
            df.appendChild(document.createElement('br'));
        }
    return df;
}

function getElementsByClassName(node, classname) {
    var a = [];
    var re = new RegExp('\\b' + classname + '\\b');
    var els = node.getElementsByTagName("*");
    for(var i=0, j=els.length; i<j; i++)
        if(re.test(els[i].className))a.push(els[i]);
    return a;
}

})();

備考

色々直しているので古いスクリプトをアンインストールしてから使用してください

その他

SeahorseってShift-JISで書かないと動作しないのね、最初わからなくて大分混乱しました