AutoPagerizeとは

ページの続きを自動的に先読みして、元のページの下部に継ぎ足してくれるように出来るGreasemonkeyスクリプト。グリモンなのでJavaScriptで書かれている。FirefoxGreasemonkeyが前提だが、id:os0x:20091021:1256095620によれば、

AutoPagerizeってのは、次のページを今見ているページの下に継ぎ足して、ページ遷移することなく次のページを見ることができる、ブラウザの機能を拡張するスクリプトです。

このAutoPagerizeは派生スクリプトがたくさんあって、FirefoxだけでみてもGreasemonkey版のAutoPagerize(本家)、cho45さんのjAutoPagerize、Add-onのAutoPagerize(本家)、AutoPager(作者は日本人ではなく、どちらかというと非日本語圏向けかも)などなど。他にもかなりの数があります*1。

で、OperaGoogle Chrome 3、Safariでは拙著のoAutoPagerize(ユーザースクリプト)があり、開発者向けのChrome4ではAutoPatchWorkとAutoPagerize(本家)があります。

とあるように、変種も多い。

JavaScript拡張の出来るブラウザなら誰かしらが移植・自己改良しているようだ。

SITEINFOとは?

AutoPagerizeが自動的に次のページを先読みする際に使用する、サイトの必要最低限の構造をまとめたデータ。こんな感じ。

var SITEINFO = [
    /* sample
    {
        url:          'http://(.*).google.+/(search).+',
        nextLink:     'id("navbar")//td[last()]/a',
        pageElement:  '//div[@id="res"]/div',
        exampleUrl:   'http://www.google.com/search?q=nsIObserver',
    },
    */
    /* template
    {
        url:          '',
        nextLink:     '',
        pageElement:  '',
        exampleUrl:   '',
    },
    */
]

この例はAutoPagerize内の記述。サンプルとして出ているのはGoogle検索に対応している部分。urlは正規表現、nextLinkとpageElementはXPath式。exampleUrlは読んだままにAutoPagerizeを実行可能な実際のURLを示している。テンプレートが用意されていることからわかるように、 [ と ] の間に直接書き込んでもSITEINFOは機能する。
JavaScriptに明るい人ならもうお気付きだろうが、変数SITEINFOの中身はすべてコメントアウトされていて空っぽだ。テンプレ通りに書いて追加すればちゃんと機能するが、現在ではSITEINFOはAutoPagerize内に記述されていない。wedataというデータベースにまとめられており、基本的に外部からSITEINFOを読み込むことでAutoPagerizeが動作するようになっている。

var SITEINFO_IMPORT_URLS = [
    'http://wedata.net/databases/AutoPagerize/items.json',
]

の部分にSITEINFOを提供する他のサイトを記述することで、wedata以外からSITEINFOを読み込むことも可能だ。過去にwedataのサーバーがダウンした際に、代替的にSITEINFOを提供可能なAPIを持つサイトを記述する方法でAutoPagerizeを動作させるという解決手段が取られたことがある*1

SITEINFOの特殊なものとしてはMICROFOTMATがある(という理解をしているが、実態はもう少し違うようだ。AutoPagerizeに関する部分しか必要ないならこの理解で構わないと思う)。あらかじめサイトのHTML内に以下の条件に適合する記述があれば、SITEINFOやwedataのデータベースに一致するものがなくても、AutoPagerizeが動作する。

var MICROFORMAT = {
    url:          '.*',
    nextLink:     '//a[@rel="next"] | //link[@rel="next"]',
    insertBefore: '//*[contains(@class, "autopagerize_insert_before")]',
    pageElement:  '//*[contains(@class, "autopagerize_page_element")]',
}

重要なことは、SITEINFOを書いておけばAutoPagerizeが使えて便利になるということ。wedataにSITEINFOを登録すれば他の人もそのサイトでAutoPagerizeが使えるようになってもっと便利ということ。
まずAutoPagerize内に直接書き込んでSITEINFOが有効であることを確かめる。OKならwedataに登録する。というステップを踏めばいい。

*1:id:os0x:20081224:1230075228 参照

SITEINFOの書き方

おさえるべきポイントは3つ。覚えるべきところは実質2つ。
SITEINFOのテンプレを見ると

    {
        url:          '',
        nextLink:     '',
        pageElement:  '',
        exampleUrl:   '',
    },

AutoPagerizeを適用するサイトのURL、次のページへのリンク、ページの主要素、実例URLの項目がある。このうちexampleUrlはオプションなので書かなくても良い。
ポイントはurl、nextLink、pageElementの3つになる。
参考:http://autopagerize.jottit.com/details_of_siteinfo_%28ja%29
他にもオプショナルな要素があるようだが(incrementとかfaceFunctionとか)、本家以外の独自拡張なのか本家でも有効なのかよくわからない&自分でも効能がよくわからないので今は忘れておく。

url

単純な文字列か正規表現で記述する。
SITEINFO特有の留意すべき点がいくつかあるが、AutoPagerizeを機能させたいページになるべく広い意味でマッチするように記述することが必要。自分だけで使う分なら元のURLそのままでもOK。とりあえずURLそのままのSITEINFOをwedata以外に公開して、知識のある人に修正してもらうのもひとつの手。
参照:http://autopagerize.jottit.com/siteinfo_incomplete

正規表現のテストや例文集のようなサイトはいくつもあるので参考資料には欠かないはず。今回はこのあたりを利用した。特に3つ目がまとまっていて良かった。

pageElement

XPath式で記述する。
アドオンのXPath Checkerが非常に便利。Firebugもあるとますます良し。ここに関しては繰り返し現れて欲しい要素のXPath式をXPath Checkerで確認して、そのまま書けばよい。出来れば一意に指定できるようにidや属性の指定を適切に選ぶことが望ましいが、個人的に使いたい程度なら、出てきた式をそのまま書いても困らない。

nextLink

XPath式で記述する。
基本的にはpageElementと同じ。しかし、nextLinkに関してはちゃんと次へと続くものを選べるようにするのがポイント。次のページだとリンク位置が微妙に違っていたりするのを修正する。資料は山のようにあるのでページに合わせてパターンを選択するのが吉。

サポートツール

こんなのがある。使い方はそれぞれのページ参照。後者は最新版のFirefoxだとインストールできないのでNightly Tester Toolあたりが必要。

続く?

思っていた以上に長くなったのでいったん終わる。