AutoPagerize API

AutoPagerize の提供する API に関して。 http://autopagerize.jottit.com/ の一番下に書いてあるんだけど addFilter を使って新規読み込み部分に対する処理を行うらしい。んだけどこれだけじゃ正直よくわからない。 addFilter と addDocumentFilter の違いもパッとしないのでソースを追ってわかったことを以下に書いていく。

とりあえず最初のページを baseDoc と呼ぶことにするとページ追加の処理は以下の感じになってる。

  1. 指示された次のページ取得。
  2. 取得したページを元に document オブジェクトを作る ( この document オブジェクトを newDoc と呼ぶことにする ) 。
  3. newDoc に対して addDocumentFilter で指定された関数群を適用する。
  4. htmlDoc から SITEINFO 内の pageElement で指定された部分を抜き出す ( 抜き出した部分を newPageElements と呼ぶことにする ) 。 newPageElements は複数であることもある。
  5. baseDoc に newPageElements をつっこむ。
  6. newPageElements に対して addFilter で指定された関数群を適用する。

一番の違いは addDocumentFilter は新しいページが document オブジェクトとして渡されるのに対して addFilter では ( document オブジェクトではなく ) node の集合が渡されること。

そして addFilter 適用時にはすでに baseDoc には newPageElements がつっこまれていることに注意。つまり addFilter された側で document と指定するとすでに新しいページがくっついているものが選択される。以下の図で緑枠で囲まれたでかい箱が document 、その中でも点線以下が新しくくっついたページ、オレンジの箱が newPageElements ってことね。

なので addFilter で evaluate とかする場合は XPath の書き方に気をつけないと余計なものまでヒットしてしまう ( see also: http://d.hatena.ne.jp/janus_wel/20080908/1221034110 ) 。簡単に言うと先頭に '.' をつけろってことなんだけど。

addDocumentFilter は新しいページそれ自体が引数として渡されてくるのでこういう落とし穴はないみたい。ていうか evaluate をするんなら書き方の制限がない分 addDocumentFilter を使うべきだともいえる。 XPath 式を自分で書くとは限らない場合はなおさら。

今いろいろ試してみたんだけど addDocumentFilter で変更を加えても newDoc までその変更がいかないみたい…。んなバカなと思ったんだけど

if(window.AutoPagerize && window.AutoPagerize.addDocumentFilter) {
    window.AutoPagerize.addDocumentFilter(
        function(newDocument, requestURL, siteinfo){
            newDocument = '';
        }
    );
}

で何事もなく動作するからマジくさい。情報取得のみにしか使えないのかな。

おれの勘違い。非同期通信を絡めてしまうと意図通りにならないだけだった ( http://d.hatena.ne.jp/janus_wel/20080911/1221141817 ) 。

ちなみに AutoPagerize ソース内の該当箇所は requestLoad 関数。