Hatena Bookmark AutoPager お気に入り対応版

勝手にお気に入りに対応させてみた。ついでにページ切り替え用のリンクも削除。

// ==UserScript==
// @name        Hateba Bookmark, autopager
// @description work on bookmark list or favorite list (not entry list)
// @namespace   http://lowreal.net/
// @include     http://b.hatena.ne.jp/*/*
// ==/UserScript==

(function () {
    var loaded = 20;
    var loading = false;
    var url = location.href;
    var c = $X("//div[@class='body']")[0];
    window.addEventListener("scroll", function (e) {
        if (loading) return;
        var sc = document.body.scrollTop;
        var total = (document.body.scrollHeight - document.body.clientHeight);
        var remain = total - sc;
        // window.status = remain;
        if (remain < 500) {
            loading = true;
            window.status = ["Loading... (", loaded, "..", loaded+20, ") .. "].join("");
            GM_xmlhttpRequest({
                method : "GET",
                url : url+"?of="+loaded,
                onload : function (req) {
                    loaded += 20;
                    loading = false;
                    window.status += "loaded";
                    var d = document.createElement("div");
                    d.innerHTML = req.responseText;

                    var taglist = $X(".//div[@class='taglist']", d)[0];
                    if (taglist) {
                        taglist.parentNode.removeChild(taglist);
                    }

                    var favoritelist = $X(".//div[@class='favoritelist']", d)[0];
                    if (favoritelist) {
                        favoritelist.parentNode.removeChild(favoritelist);
                    }

                    var pagers = $X(".//div[@class='pager']", d);
                    for (var i = 0; i < pagers.length; i++) {
                        pagers[i].parentNode.removeChild(pagers[i]);
                    }

                    var main = $X(".//div[@class='main']", d)[0];
                    if ($X("count(.//dl) > 0", main))
                        c.appendChild(main);
                    else
                        loading = true;
                }
            });
        }
    }, false);

    /* template functions  */
    function $N (name, attr, childs) {
        var ret = document.createElement(name);
        for (k in attr) {
            if (!attr.hasOwnProperty(k)) continue;
            v = attr[k];
            if (k == "class") {
                ret.className = v;
            } else {
                ret.setAttribute(k, v);
            }
        }
        switch (typeof childs) {
            case "string": {
                ret.appendChild(document.createTextNode(childs));
                break;
            }
            case "object": {
                for (var i = 0, len = childs.length; i < len; i++) {
                    var child = childs[i];
                    if (typeof child == "string") {
                        ret.appendChild(document.createTextNode(child));
                    } else {
                        ret.appendChild(child);
                    }
                }
                break;
            }
        }
        return ret;
    }
    
    function $X (exp, context) {
        if (!context) context = document;
        var resolver = function (prefix) {
            var o = document.createNSResolver(context)(prefix);
            return o ? o : (document.contentType == "text/html") ? "" : "http://www.w3.org/1999/xhtml";
        }
        var exp = document.createExpression(exp, resolver);

        var result = exp.evaluate(context, XPathResult.ANY_TYPE, null);
        switch (result.resultType) {
            case XPathResult.STRING_TYPE : return result.stringValue;
            case XPathResult.NUMBER_TYPE : return result.numberValue;
            case XPathResult.BOOLEAN_TYPE: return result.booleanValue;
            case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: {
                result = exp.evaluate(context, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
                var ret = [];
                for (var i = 0, len = result.snapshotLength; i < len ; i++) {
                    ret.push(result.snapshotItem(i));
                }
                return ret;
            }
        }
        return null;
    }
    
    function $S (str) {
        return str.replace(/#{([^}]+)}/g, function (w, $1) {
            return eval($1);
        });
    }
})();