nowaのAutoPagerizeの定義

{
    // nowa
    url:            'http://.+.nowa.jp/\*',
    nextLink:       '//li[@class="next-page"]/a',
    insertBefore:   'id("first-inner")/\*[last()]',
    pageElement:    'id("first-inner")/div',
},

: Software 虚像幻影(nowa)からインポート

CustomFeed::ConfigはAggregator::Simpleベースにできないか

CustomFeed::ConfigをAggregator::Simpleベースにできないかなぁ。

この二つの共通点としては、

  • Webからデータ取ってくる
  • とってきたデータをパースしてPlagger::Feedを生成する

辺りで、違う点は

  • HTMLをXPathや正規表現を使ってパースする (CustomFeed::Config)
  • Feedをパースする (Aggregator::Simple)

辺り。利点としてはAggregator::Xango見たいなのを比較的簡単に作れる(かもしれない)。

と書いてみて思ったけど、Plagger::FeedParserをプラグイン化したらいいんじゃないかなぁ。少なくとも他のAggregator系のプラグインで使えるし、CustomFeed::Config::Xango見たいなのを作らなくてすむ。で、プラグインはParser::FeedとかParser::ConfigとかParser::JSONとか作ればいい感じとか。

でもそれをするとCustomFeed::ConfigとFilter::EntryFullTextの統合が難しくなるんだよなぁ。

っていうか要するにWebからデータ取ってくるのとデータをパースするのを分離すればいいのかな。

とりあえずとりとめもなく考えてみた。

: Software 虚像幻影(nowa)からインポート

Plaggerのフェーズ改造試案その2

plugin.init
subscription.load
customfeed.handle
crawler.crawl
crawler.finalize
  # この二つはcrawlerフェーズのどこかで呼ばれる
  parser.parse.feed
  parser.entry.fixup
udpate.entry.fixup
update.feed.fixup
update.fixup
smartfeed.init
smartfeed.entry
smartfeed.feed
smartfeed.finalize
publish.init
publish.entry.fixup
publish.entry
publish.feed
plguin.finalzie
---
searcher.search
useragent.init
useragent.request

でプラグインを

Aggregator::\*       => Crawler::\*
Plagger::FeedParser => Parser::\*

こんな感じにする。

って前考えたのとほとんどかわってねぇ。

: Software 虚像幻影(nowa)からインポート

customfeed.handleで動作するプラグインは読み込む順番に注意

さっき気づいたけど、customfeed.handleはPlagger->run_hook_onceで呼ばれてるから、読み込む順番に気をつけないと想定した動作と異なる場合がある。

って前にそれではまったような。

: Software 虚像幻影(nowa)からインポート

Plaggerの実行フェーズメモ

PlaggerがWebからデータ取ってくる場合、

  • $feed->aggregatorがセットされている場合そっちを呼ぶ
  • customfeed.handleをrun_hook_onceで呼ぶ
  • aggregator.filter.feedとaggregator.entry.fixupはデータをパースする時に呼ばれる

ってことはaggreagtor.filter.feedあたりでHTMLとかをパースできるようにすれば、今まで書いた試案1試案2見たいにしなくても、データ取ってくるのとデータをパースするのは分離できる。

で、さっきもしかしてと思ってPlaggerのticket見てたら、Aggregator::Simple to be loaded ealier than CustomFeed?とかあった。

今まで見てなかったよ。ticket。

Aggregator::Simple改造してみるなぁ。

: Software 虚像幻影(nowa)からインポート

Aggregator::Simpleを改造してみた

Aggregator::SimpleでFeed以外のものをパースされる差分

=== lib\\Plagger\\Plugin\\Aggregator\\Simple.pm
==================================================================
--- lib\\Plagger\\Plugin\\Aggregator\\Simple.pm (revision 45)

+++ lib\\Plagger\\Plugin\\Aggregator\\Simple.pm (local)

@@ -71,7 +71,19 @@

     my $context = Plagger->context;

-    my $args = \{ content => $$xml\_ref \};
+    my $args = \{
+        content => $$xml\_ref,
+        feed    => $feed || Plagger::Feed->new,
+    \};
+
+    my $result = $context->run\_hook\_once('aggregator.parse', $args);
+    if ( ref $result eq 'Plagger::Feed' ) \{
+        $context->log(info => "Aggregate $url success: " . $result->count . " entries.");
+        $context->update->add($result);
+        return 1;
+    \}
+
+    $args = \{ content => $$xml\_ref \};
     $context->run\_hook('aggregator.filter.feed', $args);

     my $remote = eval \{ Plagger::FeedParser->parse(\\$args->\{content\}) \};

aggregator.parseというフェーズを作って、Plagger::Feedオブジェクトが返ってきたら$context->update->addするようにしてみた。

テストしようと思ったんだけど、Aggregator::Simpleのテストが見つけられなかったのでテストはしてない。

: Software 虚像幻影(nowa)からインポート

Plaggerのticket:393に対する改造案まとめ

とりとめもなく書き過ぎたので一回まとめる

  1. aggregator.filter.feedでHTMLとかをパースできるようにする
  2. HTMLとかをパースするフェーズを作って専用プラグインを作る
  3. Plagger::FeedParserをプラグイン化

2と3は似たもの同士。たぶんどっちもフェーズ作ってプラグイン作ってってなると思う。

1に関しては今の所いい案が思いつかない。っていうかaggregator.filter.feedはデータソースの修正のためのフェーズってイメージがあるんだけど、実際はどうなんだろう。

: Software 虚像幻影(nowa)からインポート