カエルチュウイホウ - PlaggerでChangeLogを扱う(2)
http://kerolin.jspeed.jp/computer/linux/meadowger060611.html
package Plagger::Plugin::CustomFeed::ChangeLog; use strict; use warnings; use base qw( Plagger::Plugin ); use Parse::RecDescent; use Text::Markdown 'markdown'; $Parse::RecDescent::skip = '[ \r\f\n]*'; sub register { my($self, $context) = @_; $context->register_hook( $self, 'subscription.load' => \&load, ); } sub load { my($self, $context) = @_; my $feed = Plagger::Feed->new; $feed->aggregator(sub { $self->aggregate(@_) }); $context->subscription->add($feed); } sub aggregate { my($self, $context, $args) = @_; my $file = $self->conf->{changelog_file}; $context->log(info => "Load $file"); open my $fh, $file or return $context->log(error => "$file: $!"); my $text; { local $/ = undef; $text = <$fh>; } my $feed = Plagger::Feed->new; $feed->title("ChangeLog"); $feed->type('ChangeLog'); my $grammar = q( parse: entry(s) {@{$return}{entry} = @item[1]} entry: entryheader item(s) {@{$return}{qw(header item)} = @item[1..2]} entryheader: /^(\d{4}-\d{2}-\d{2})\s+(.+) \s+\<(.+)\>/ {@{$return}{qw(date user mail)} = ($1,$2,$3)} item: itemheader itembody(s) { my $body = join ("\n", @{$item[2]}); @{$return}{qw(tag title body)} = ($item[1]->[0], $item[1]->[1], $body) } itemheader: /^\t\* (.*):\s+(.+)/ {[$1,$2]} itembody: /^\t(?!\*)(.*)/ {($1)} ); my $data = Parse::RecDescent->new($grammar)->parse($text); for my $datelog (@{$data->{entry}}){ for my $item (@{$datelog->{item}}){ my $entry = Plagger::Entry->new; $entry->title($item->{title}); $entry->author($datelog->{user}); $entry->date($datelog->{date}); my $htmlized_body = markdown($item->{body}); $entry->body($htmlized_body); $feed->add_entry($entry); } } $context->update->add($feed); } 1; __END__