del.icio.us のポストページに関連エントリを表示する

同じタグを付けている過去のポストを表示。


// ==UserScript==
// @include http://del.icio.us/*
// ==/UserScript==

(function() {
    function relatedPost() {
        var user = location.href.split('/')[3].split('?')[0];
        var tags = document.getElementById('tags').value.replace(/^\s+|\s$/, "").split(' ');
        if(tags[0] != "") {
            getJSON(user, tags);
        }
    }

    function getJSON() {
        var user = arguments[0];
        var tags = arguments[1].join('+')
        var xhr = new XMLHttpRequest();
        xhr.open('GET', 'http://del.icio.us/feeds/json/' + user + '/' + tags);
        xhr.onreadystatechange = function() {
            if(xhr.readyState == 4 && xhr.status == 200) {
                eval(xhr.responseText);
                var posts = Delicious.posts;
                var relatedposts = []
                var related = '<div class="label"><span>related posts</span></div>';
                relatedposts.push(related);
                for(var i=0, len=(posts.length >= 5)?5:posts.length;i<len;i++) {
                    var p = '<p><a href="'+posts[i].u+'">'+posts[i].d+'</a></p>';

                    relatedposts.push(p);
                }

                var ul = document.evaluate(
                    '//ul[@class="bundles"]',
                    document,
                    null,
                    XPathResult.FIRST_ORDERED_NODE_TYPE,
                    null
                ).singleNodeValue;
                if(!document.getElementById('related-post')){
                    var li = document.createElement('li');
                    li.setAttribute('class', 'bundle fold');
                    li.id = 'related-post'
                    li.style.display = 'block';
                    li.innerHTML = relatedposts.join("");
                    ul.appendChild(li)
                } else {
                    document.getElementById('related-post').innerHTML = relatedposts.join("");
                }
            }
        }
        xhr.send(null);
    }

    if(location.href.match(/http:\/\/del\.icio\.us\/[\w\/\?%=]+url=/)) {
        window.addEventListener('load', function() {
            document.getElementById('tags').addEventListener('blur', relatedPost, false);
        }, false);
    }
})();


XMLHttpRequest をするタイミングがタグの入力欄からフォーカスが外れたときなので入力されているタグと関連エントリが一致しないときがある。このタイミングが微妙だなぁ。無駄にリクエストが発生していることだろうし。
あと,おりたためるようにもしたかったけど断念。


実際はこれのはてなダイアリー版をつくりたい。つまり。見出しに付けたカテゴリから過去の同じカテゴリのエントリを列挙。でその中から簡単に関連エントリとしてリンクを挿入できるようなものを作りたい。