Hatena Asin Info アップデート

はてなASINページがリニューアルして使えなくなっていたGreasemonkeyスクリプトをアップデートした。おまけで広告を削除する機能も付けてみたけど、これはスタイルシートで非表示にしてるだけなので、それ専用の方法(Stylish Extension等)を使った方がいいかも。

// ==UserScript==
// @name           Hatena Asin Info
// @namespace      http://d.hatena.ne.jp/nozom/
// @include        http://d.hatena.ne.jp/asin/*
// ==/UserScript==

(function(){
    function div(s) {
        var d = document.createElement('div');
        with (d.style) {
            border = '1px solid #5279E7';
            margin = '10 5% 10 5%';
            padding = '2';
        }
        d.appendChild(s);
        return d;
    }

    function textfield(value) {
        var node = document.createElement('input');
        node.type = 'text';
        node.size = 150;
        node.value = value;
        node.style.border = 'none';
        node.addEventListener('focus', function(e) { node.select(); }, true);
        return node;
    }

    function killAds() {
        var nodes = document.getElementsByTagName('div');
        for (var i = 0; i < nodes.length; i++) {
            if (nodes[i].className == 'ad-banner') {
                nodes[i].style.display = 'none';
            }
        }
    }

    if (window.location.href.match(/\/asin\/([^\/]+)/)) {
        var asin = RegExp.$1;

        var h1 = document.getElementsByTagName('h1')[0];
        var title = (h1 == undefined) ? '' : h1.textContent;
        var forms = document.forms;

        var dl;
        for (var i = 0; i < forms.length; i++) {
            dl = forms[i].getElementsByTagName('dl')[0];
            if (dl != undefined)
                break;
        }

        if (dl != undefined) {
            var asin_prefix = 'ASIN:';
            var authors = [];
            var dt;
            var nodes = dl.childNodes;
            for (var i = 0; i < nodes.length; i++) {
                var node = nodes[i];
                if (node.tagName == 'DT') {
                    dt = node;
                } else if ((dt != undefined) &&
                           (node.tagName == 'DD')) {
                    var dd = node;
                    if ((dt.textContent == '作者:') ||
                        (dt.textContent == 'アーティスト:')) {
                        authors.push(dd.textContent);
                    } else if (dt.textContent == 'はてな記法:') {
                        var input = dd.getElementsByTagName('input')[0];
                        if ((input != undefined) &&
                            (input.value.match(/^isbn:/i))) {
                            asin_prefix = 'ISBN:';
                        }
                    }
                }
            }

            var authors_sep = (authors.length > 0)
                              ? ' / ' + authors.join(', ') + ' '
                              : ' ';

            var d = div(textfield(title + authors_sep + asin_prefix + asin));
            forms[0].parentNode.appendChild(d);
        }

        killAds();
    }
})();