閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

ブックマークのタグを使用順にソート

はてなブックマークでは、タグを使用頻度の高いものをフォントサイズを大きくして示していますが、これを使用頻度順にソートして、ついでに li 要素の display: inline も取っ払って普通のリスト表示にするユーザスクリプト。

実際にはどれだけそのタグが使用されているかは解らないので、 a 要素にある style 属性の、フォントサイズでソートしています。ソートしているところとか、結構適当です。動いているからいいや、程度に。

以下ソース(別ページに分けるのはめんどくさいのでやめた……)。

// Copyright (C) 2005, wata_d.
//
// ==UserScript==
// @name         Hatena Bookmark TagSort
// @namespace    http://d.hatena.ne.jp/wata_d
// @include      http://b.hatena.ne.jp/*
// ==/UserScript==

(function()
{
    function getTag(val)
    {
        return document.evaluate(val, document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0);
    }
    
    // style属性中の font-size の値を取ってくる
    function getFontSize(li)
    {
        if(li.childNodes.length)
        {
            var size = li.childNodes[0].style.getPropertyValue("font-size");
            return size.substring(0, size.length-2);
        }
        return -1;
    }
    
    function sort()
    {
        var ul = getTag("//ul[@class='taglist']");
        if(!ul) { return; }
        
        var arr = new Array();
        for(var i = 0, n = 0; i < ul.childNodes.length; ++i)
        {
            if(!ul.childNodes[i].childNodes.length) { continue; }
            
            arr[n++] = ul.childNodes[i].cloneNode(true);
        }
        while(ul.childNodes.length)
        {
            ul.removeChild(ul.childNodes[ul.childNodes.length - 1]);
        }
        
        // てきとうに
        for(var i = arr.length - 1; i >= 0; --i)
        {
            for(var j = 0; j < i; ++j)
            {
                var lhs = getFontSize(arr[i]);
                var rhs = getFontSize(arr[j]);
                if(lhs > rhs)
                {
                    var tmp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = tmp;
                }
            }
        }
         
        for(var i = 0; i < arr.length; ++i)
        {
            var obj = arr[i];
            obj.childNodes[0].style.removeProperty("font-size");
            obj.style.display = "block";
            ul.appendChild(obj);
        }
    }

    sort();
}
)();

idea:2018 辺りを見て作ってみました。タグの数が多い時に display: block にすると長くなってしまうなあ。当たり前だけど。