Bulknews::Subtech RSSフィード

2006/08/20 (日)

[Plagger] pluggable Summarizer 05:04  [Plagger] pluggable Summarizer - Bulknews::Subtech を含むブックマーク はてなブックマーク -  [Plagger] pluggable Summarizer - Bulknews::Subtech

summary サポートも佳境。

Plagger::Entry は body, summary を持ち、それぞれ html か text かの属性を持つ。Aggregator::Simple でフィード巡回する場合、RSS に description や atom の summary などがあれば、それぞれを $entry->summary にセットする。

summary, body が HTML なのかプレーンテキストなのかは、フォーマットからある程度ヒューリスティックに判定する。Atom の場合は TextConstruct に書いてあるので、これを尊重すべきだろう(= TODO)。詳しくは Plagger::Text あたりを参照。

で、summary がとれない場合、かつ body がある場合(なので EntryFullText でアップグレードしたエントリも対象となる)は Summary::Auto プラグイン(コアから自動で呼び出される)でサマリを自動セットする。

デフォルトでは Plagger::Util::summarize が使われ、

  • HTML なら最初の段落
  • なければ最初の BR タグ
  • なければ全部
  • テキストなら先頭から255 bytes

というようにサマリがつくられる。が、summarizer.summarize をフックするプラグインを書くことによってサマリの生成をプラガブルにすることも可能。

no title

  • Summary::English: Lingua::EN::Summarize を利用 (Filter::GuessLanguage で判定して en のときのみ)
  • Summary::HatenaBookmark: b.hatena.ne.jp/atomfeed を利用して summary を取得。どうも Cookie がないとはじかれるようなのでスクレイプにするか、WSSE で /atom/edit を見るかは検討
  • Summary::TextOriginal: Text::Original を利用して1文目を取得
  • Summary::TrackbackRDF: Trackback RDF に含まれる dc:description を取り出し

という感じの実装を用意しておいた。ほかにも CPAN に Summarize 系のモジュールがあるのでglueプラグインが書けるでしょう。Filter::EntryFullText と Summary::* でそれぞれ本文・サマリを別個にとってこれるのがイカス。

また summarizer.summarize は run_hook_once で実装されているので、処理できない場合は return すれば複数の summarizer が順に使われる (Chain of Responsibilities)。Summary::English は language == 'en' の場合だけだし、HatenaBookmark ははてブで概要が見つかったときだけ。

で、あとはこの summary をどう Publish/Notify で使うかをこれから設定可能にして hackathon-summary ブランチは終了。プラグインごとに summary/body の html/plaintext どちらを使うのかを設定できるようにしたいわけだが書式はまだ未決。

naoyanaoya2006/08/21 10:45Cookie ないと取得できないのはバグすね...なおしときます。