Trac用FeedUpgrader#2

昨日書いてうまく動かなかったTrac用FeedUpgraderですが、原因がわかりました。

bloglinesが原因ではありませんでした(plaggerのソースを先に確認すればよかった)。場当たり的ですが、とりあえず回避策を考えました。miyagawaさんからアドバイスをもらい修正できました。


assets/plugins/filter-entryfulltext/trac_chengeset.yamlへ以下を保存してください。

# upgrader trac changelog feed
author: Nobuhito Sato
handle_force: /trac/changeset/
extract: ((?:<dl id="overview">).*?</dl>)
extract_capture: body


以下は古い上に動作しないので読み飛ばしてください。

plaggerのソースではPlugin/Filter/EntryFullText.pmの中で、

 99 if ( !$handler && $args->{entry}->body && $args->{entry}->body =~ /<\w+>/ ) {
100 $self->log(debug => $args->{entry}->link . " already contains body. Skipped");
101 return;
102 }

となっていました。多分コメントを付けることができるHatenaBookmarkやdel.icio.usから取りこんだときに、上書きされないようにこのようになっていると思われます*1

とりあえず以下のFilterを作ったので、plugin_pathへStripEntryBody.pmとして保存してください。config.yamlで指定したパターンがurlにある場合は本文を削除します。

package Plagger::Plugin::Filter::StripEntryBody;
use strict;
use base qw( Plagger::Plugin );

sub register {
my($self, $context) = @_;
$context->register_hook(
$self,
'update.entry.fixup' => \&update,
);
}

sub update {
my($self, $context, $args) = @_;
my $cfg = $self->conf;
Plagger->context->log(info => $cfg->{pattern});
if ($args->{entry}->link =~ m!$cfg->{pattern}!) {
$args->{entry}->body('');
Plagger->context->log(info => "Strip Trac changeset body");
}
}

1;

そして、config.yamlで以下のように指定してください。

plugins:
- module: Filter::StripEntryBody
config:
url_pattern: /trac/hangeset/
- module: Filter::EntryFullText

このとき、必ずEntryFullTextの前にStripEntryBodyを記述してください*2url_patternには正規表現で記述できるはずです*3が、とりあえずtrac_chengeset.yaml用でしたら上記の記述のみでOKです。

あとはassets/plugins/filter-entryfulltext/trac_chengeset.yamlへ以下を保存してください。

  1 # upgrader trac changelog feed
2 author: Nobuhito Sato
3 handle: /trac/changeset/
4 extract: ((?:<dl id="overview">).*?</dl>)
5 extract_capture: body

これで目論見どおりにtrac_changesetが少しリッチになります。

HatenaBookmarkやdel.icio.usのコメントを利用したい場合はconfig.yamlを分けるのがいいでしょう。

*1:例えばHatenaBookmarkからdel.icio.usへコピーする際とか

*2:この順番に気づかず、悩んでしまった。

*3:テストしていません