カエルチュウイホウ - 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__