素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

continue_readingとSITEINFOの連携

continue_readingはTwitterでうまく継ぎ足しができない。
PagerizationみたいにSITEINFOがある場合はSITEINFOを使い、ない場合は自動推測にしたいのでGreasemonkeyスクリプトを書いた。
ただ、continue_readingがmicroformatsのpageElement部分しか見ないので、結局Twitterでは崩れてしまう。
本体を弄らなければこれはどうしようもない。
Twitterでは駄目だが、他のいくつかのサイトでうまく動くようになる。
下のGreasemonkeyスクリプトは、continue_readingより先に実行する。

// ==UserScript==
// @name           AutoPagerizeMicroformats
// @namespace      http://d.hatena.ne.jp/javascripter/
// @include        http*
// ==/UserScript==
(function() {
  if (window.self != window.top) return;
  const SITEINFO_IMPORT_URL = 'http://wedata.net/databases/AutoPagerize/items.json';

  function getCache(fn) {
    var cache = eval(GM_getValue('cache', '[]'));
    if (cache.length)
      fn(cache);
    else GM_xmlhttpRequest({
      method: 'get',
      url: SITEINFO_IMPORT_URL,
      onload: function({
        responseText: v
      }) {
        GM_setValue('cache', v);
        fn(eval(v));
      }
    });
  }
  function cacheCallback(siteinfo) {
    for each(var { data: i } in siteinfo)
      if (new RegExp(i.url).test(location.href) &&
          document.evaluate(i.nextLink, document, null, XPathResult.BOOLEAN_TYPE, null).booleanValue &&
          document.evaluate(i.pageElement, document, null, XPathResult.BOOLEAN_TYPE, null).booleanValue)
        return i;
  }
  function addMicroformats(doc, info) {
    doc.evaluate(info.nextLink, doc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.rel += ' next';
    var pageElements = doc.evaluate(info.pageElement, doc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
    for (var i = 0; i < pageElements.snapshotLength; i++)
      pageElements.snapshotItem(i).className += ' autopagerize_page_element';
    if (info.insertBefore)
      doc.evaluate(info.insertBefore, doc, null, XPathResult.FIRST_ORDEERD_NODE_TYPE, null).singleNodeValue.className += ' autopagerize_insert_before';
  };

  function hookAutoPagerize(info) {
    if ('AutoPagerize' in window) window.AutoPagerize.addDocumentFilter(function(doc) {
      addMicroformats(doc, info)
    });
  }
  getCache(function(siteinfo) {
    var info = cacheCallback(siteinfo);
    if (info) {
      addMicroformats(document, info);
      setTimeout(hookAutoPagerize, 0, info);
    }
  });
})();