はてなスターのautopagerize対応(でもこれは、はてなダイアリーとかはてなグループのダイアリーとかだけ)

はてなスターautopagerize対応がされていた。今、気がついた。
でもこれは、はてなダイアリーとかはてなグループのダイアリーとか用でした。
twitter.comとかだと効いてなかった。

動いていなかったのを修正してCodeReposに移動しました。これからはこっちでよろしくお願いします。

// ==UserScript==
// @name           AutoPagerize + Hatena::Star
// @namespace      http://tokyoenvious.xrea.jp/
// @description    AutoPagerize + Hatena::Star Filter
// @include        *
// ==/UserScript==

if (typeof window.AutoPagerize != 'undefined'
        && typeof unsafeWindow.Hatena != 'undefined'
        && typeof unsafeWindow.Hatena.Star != 'undefined'
        && typeof unsafeWindow.Hatena.Star.EntryLoader != 'undefined') {
    window.AutoPagerize.addFilter(function(docs) {
        docs.forEach(function(d) { unsafeWindow.Hatena.Star.EntryLoader.loadNewEntries(d) });
    });
}

どこをどう見てもこれだけじゃ動かないねェ。どうも本体が別にあるみたいだ。unsafeWindow.Hatena.Star.EntryLoader っていうのがポイントかいな?

ところで、はてなダイアリーではこんなスクリプトを読んできています。

<script type="text/javascript" src="http://s.hatena.ne.jp/js/HatenaStar.js"></script>

<script type="text/javascript">
Hatena.Star.SiteConfig = {
  entryNodes: {
    'div.section': {
      uri: 'h3 a',
      title: 'h3',
      container: 'h3'
    }
  }
};
</script>

そんでもって読んできているのがこれ。


これは、どこでもスターグリースモンキーには対応していなかった。twitter.com/homeとかだと2ページ目ははてなスター表示されないもん。
で、どこでもスターグリースモンキーは、これ。

で、おんなじ HatenaStar.js を呼んで来てる。

// ==UserScript==
// @name           Hatena Star Everywhere
// @namespace      http://s.hatena.ne.jp/
// @include        *
// ==/UserScript==
// version: 20070927
// merged with http://rails2u.com/misc/greasemonkey/hatenastareverywhere_for_fub.user.js

var VERSION        = '20070927';

var SITECONFIG_URL = 'http://s.hatena.ne.jp/siteconfig.json';
var SCRIPT_URL     = 'http://s.hatena.ne.jp/js/HatenaStar.js';
var CACHE_EXPIRE   = 24 * 60 * 60 * 1000;

var localConfig = { };
/*
var localConfig = {
    '*.g.hatena.ne.jp': [
        {
            path: '^/bbs/\\d+',
            entryNodes: {
                'div.day': {
                    uri: 'h2 a:nth-child(1)',
                    title: 'h2',
                    container: 'h2'
                }
            }
        }
    ]
};
*/

var isFirefox = navigator.userAgent.indexOf('Firefox') != -1;

if (isFirefox) {
    var documentLoaded = false;
    window.addEventListener('load', function() { documentLoaded = true }, true);
}

function ensure(object, prop, value) {
    if (typeof object[prop] == 'undefined')
        object[prop] = value || { };
}

function loadHatenaStar(siteConfig) {
    var host = location.hostname;
    var config = siteConfig[host];
    if (!config && host.match(/^[\w-]+(\..+)$/))
        config = siteConfig['*' + RegExp.$1];
    if (config) {
        for (var i = 0; i < config.length; i++) {
            if (location.pathname.match(new RegExp(config[i].path))) {
                ensure(unsafeWindow, 'Hatena');
                ensure(unsafeWindow.Hatena, 'Star');
                unsafeWindow.Hatena.Star.SiteConfig = config[i];
                var script = document.createElement('script');
                script.charset = 'utf-8';
                script.src = SCRIPT_URL;
                if (isFirefox) {
                    if (documentLoaded)
                        script.addEventListener('load', loadEntryLoader, true);
                } else {
                    loadEntryLoader();
                }
                document.getElementsByTagName('head')[0].appendChild(script);
                break;
            }
        }
    }
}

function loadEntryLoader() {
    var EntryLoader = unsafeWindow.Hatena.Star.EntryLoader;
    if (typeof EntryLoader == 'undefined')
        return setTimeout(loadEntryLoader, 200);

    if (EntryLoader && !EntryLoader.entries)
        new EntryLoader();
}

function configLoaded(siteConfig) {
    siteConfig = siteConfig || { };
    for (var h in localConfig)
        siteConfig[h] = localConfig[h];
    if (isFirefox)
        window.Hatena.Star.SiteConfig = siteConfig;
    loadHatenaStar(siteConfig);
}

if (isFirefox) {
    ensure(window, 'Hatena');
    ensure(window.Hatena, 'Star');
}

if (typeof unsafeWindow.Hatena == 'undefined'
        || typeof unsafeWindow.Hatena.Star == 'undefined'
        || !unsafeWindow.Hatena.Star.loaded) {
    if (isFirefox) {
        var config = eval(GM_getValue('config')) || { };
    } else {
        var config = { };
        if (GM_getValue('configSiteConfig')) {
            config.siteConfig = eval('(' + GM_getValue('configSiteConfig') + ')');
            config.expire = eval('(' + GM_getValue('configExpire') + ')');
        }
    }

    if (!config.expire || config.expire < (new Date()).getTime()) {
        GM_xmlhttpRequest({
            method: 'GET',
            url: SITECONFIG_URL,
            onload: function(res) {
                config.siteConfig = eval('(' + res.responseText + ')');
                config.expire = (new Date()).getTime() + CACHE_EXPIRE;
                if (isFirefox) {
                    GM_setValue('config', config.toSource());
                } else {
                    GM_setValue('configSiteConfig', res.responseText);
                    GM_setValue('configExpire', config.expire + 0);
                }
                configLoaded(config.siteConfig);
            },
            onerror: function() {
                configLoaded(config.siteConfig);
            }
        });
    } else {
        configLoaded(config.siteConfig);
    }
}

if (typeof GM_registerMenuCommand != 'undefined') {
    GM_registerMenuCommand('Hatena Star Everywhere - clear cache', function() { 
        if (isFirefox) {
            GM_setValue('config', '');
        } else {
            GM_setValue('configSiteConfig', ''); 
            GM_setValue('configExpire', ''); 
        }
    });
}

なんかヒントになるかいな?