del.icio.us の recommended tags を。

del.icio.us にはポストするときに "こんなタグつけたらいいんじゃないの" ってのが recommended tags と popular tags と 2 つある。
popular tags はそのページに多く付けられたタグ。
recommended tags は popular tags のうち自分が過去に使っているタグ。*1


問題なのが recommended tags に追加されるべきタグなのに、アルファベットの大文字小文字の違いで追加されない場合があること。


その問題を直すスクリプトを書いた。

// ==UserScript==
// @name           del.icio.us recommended tags fix
// @namespace      http://opera.higeorange.com/
// @include        http://del.icio.us/*?*url=*
// ==/UserScript==

(function(w) {
    window.addEventListener('load', function() {
        var tags = getKeys(w.tags);
        var tagRec = w.tagRec;
        var tagPop = w.tagPop;
        var tagPlus = [];

        if(tagPop.length == 0 || tagRec.length == 0) return;

        for(var i = 0, l = tagPop.length; i < l; i++) {
            if(contains(tags, tagPop[i]) && !contains(tagRec, tagPop[i])) {
                tagPlus.push(tagPop[i].toLowerCase());
            }
        }
        tagRec = tagPlus.sort();

        var a;
        for(var i = 0, l = tagPlus.length; i < l; i++) {
            a = document.createElement("a");
            a.className = "tag recommended"
            a.href = 'javascript:swap("' + tagPlus[i] + '");';
            a.innerHTML = tagPlus[i];
            w.sections[3][tagPlus[i]] = a;
            $("rectags").appendChild(document.createTextNode(" "));
            $("rectags").appendChild(a);
        }
        function getKeys(obj) {
            var r = [];
            var i = 0;
            for(r[i++] in obj) {};
            return r;
        }
        function $(el) {
            return $[el] || ($[el] = document.getElementById(el));
        }
        function contains(target, o) {
            return (" " + target.join(" ").toLowerCase() + " ").indexOf(" " + o.toLowerCase() + " ") >= 0;
        }
    }, false);
})(this.unsafeWindow || window);


このスクリプトの問題として recommended tags に新たに追加されたタグはすべて小文字となっていること*2 と、 recommended tags を追加したときに選択状態にならないこと。

修正

選択状態にならないことを直した。 include がおかしかったのを直した。あと追加したタグは最後に持ってくるようにした。

*1:多分

*2:私はほぼタグを小文字で打っているため