{
// nowa
url: 'http://.+.nowa.jp/\*',
nextLink: '//li[@class="next-page"]/a',
insertBefore: 'id("first-inner")/\*[last()]',
pageElement: 'id("first-inner")/div',
},
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からデータ取ってくるのとデータをパースするのを分離すればいいのかな。
とりあえずとりとめもなく考えてみた。
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::\*
こんな感じにする。
って前考えたのとほとんどかわってねぇ。
customfeed.handleで動作するプラグインは読み込む順番に注意
さっき気づいたけど、customfeed.handleはPlagger->run_hook_onceで呼ばれてるから、読み込む順番に気をつけないと想定した動作と異なる場合がある。
って前にそれではまったような。
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改造してみるなぁ。
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のテストが見つけられなかったのでテストはしてない。
Plaggerのticket:393に対する改造案まとめ
とりとめもなく書き過ぎたので一回まとめる
- aggregator.filter.feedでHTMLとかをパースできるようにする
- HTMLとかをパースするフェーズを作って専用プラグインを作る
- Plagger::FeedParserをプラグイン化
2と3は似たもの同士。たぶんどっちもフェーズ作ってプラグイン作ってってなると思う。
1に関しては今の所いい案が思いつかない。っていうかaggregator.filter.feedはデータソースの修正のためのフェーズってイメージがあるんだけど、実際はどうなんだろう。