Re: LDR、フィード描画完了フック

id:brazil さんのエントリーを受けて。

complete_printfeedが、ありそでない。

この一文を見た時、「なるほど」と思いました。

と言いますのは、livedoor Reader で特定のサイトや記事の本文を非表示にするの中で、描画完了のフックが無いことに気付いていながら、「じゃぁ作ろう」という発想には至らなかったからです。「ありそでない」じゃなく、「ない」で止まってしまったんですね。

しかも、"complete_printfeed" という、そのものずばりなフックが存在することにも気付いていませんでした。


手元で調べてみたところ、バージョン 0.0.6 と 0.0.8 との差分にて、[before|after]_printfeed と共に宣言が入っているのを確認しました (それ以前はフィード描画関連のフックは無かったようです)。

以来この "complete_printfeed" フックは使用されないままになっている、と。


ということで、(個人的にはオフィシャルの実装を待ちたいところではありますが) やってみました。

"after_printfeed" を使えば出来るんじゃないかと思います:

register_hook("after_printfeed", function(feed) {
  if (State.writer  && !State.writer.complete ||
      State.writer2 && !State.writer2.complete) {
    var self = arguments.callee;
    return setTimeout(function(){ self(feed) }, 200);
  }
  complete_printfeed.exec(feed);
});

// test (最後の記事が描画されたかどうか)
register_hook("complete_printfeed", function(feed) {
  message([feed.channel.title, null != $("item_count_"+(feed.items.length))]);
});

State.writer と State.writer2 が必ずセットで使われることに注目しています。

例えば、最初に表示するフィードに1件しか記事が無かった場合、writer も writer2 も共に未定義です。従って if テストに失敗し、フックが実行されるわけです。

定義済みであれば、両方の "complete" の値が真になるまで再帰を繰り返します。


特に問題なく動いているようなんですが、少し気になる点もあります。フィード描画中に過去記事や別のフィードに移動してしまった場合、どうなってしまうのかがよく分かりません。


外部から出来ることの限界、という感じもしますが、いかがでしょう?


追記 [20061010]:

writing_complete という、記事の描画完了状態を知る関数が元からありましたね。うっかりしてました。watch を使用する場合は別ですが、setTimeout で状態を監視するなら素直にこの関数を使うのが良いでしょう。