Plagger::Plugin::Publish::Excel 作ってみた


昨日の Notify::YahooMessenger に続いて、今度は Publish::Excel を作ってみた。

1 Feed を 1 シート に保存する。


Excel だと見た目仕事してるっぽいので、うるさい会社にいる人はこれ使って livedoor Reader or BloglinesExcel で見たりすると怒られなくて済むかも??


あとは Filter::EntryFullText で取ってきて、ネット環境が無いところで読んだりとか。

職場でネット使えないと悲惨すぎるけど、開発現場で外部のメールすら読めないところもまだあるみたいなので。


現状では出力してるだけでレイアウトを触ってないのでかなり読みにくいけど(どうしようか)。

さらにまだ追記が出来ない・・・

Spreadsheet::ParseExcel とか使ったらいいのかな。


ソースは以下。

package Plagger::Plugin::Publish::Excel;
use strict;
use warnings;
use base qw(Plagger::Plugin);

use Plagger::Util qw(strip_html);
use Spreadsheet::WriteExcel;

sub init {
    my $self = shift;
    $self->SUPER::init(@_);
    Plagger->context->error("filename is missing")
        unless exists $self->conf->{filename};
}

sub register {
    my ($self, $context) = @_;
    $context->register_hook(
        $self,
        'publish.init' => \&initialize,
        'publish.feed' => \&feed,
    );
}

sub initialize {
    my ($self, $context) = @_;
    my $workbook = Spreadsheet::WriteExcel->new($self->conf->{filename});
    $self->{workbook} = $workbook;
    $self->{body_format} = $workbook->add_format(text_wrap => 1);
}

sub feed {
    my ($self, $context, $args) = @_;
    my $feed = $args->{feed};
    my $worksheet = $self->{workbook}->add_worksheet(escape_sheet_name($feed->title));
    my $row = 0;
    for my $entry ($feed->entries) {
        my $col = 0;
        $worksheet->write($row, $col++, $entry->date->format('Mail'));
        $worksheet->write($row, $col++, $entry->title);
        $worksheet->write($row, $col++, $entry->permalink);
        $worksheet->write($row, $col++, strip_html($entry->body), $self->{body_format});
        $row++;
    }
}

sub escape_sheet_name {
    my $name = shift;
    $name =~ s![\[\]:*?/\\]! !g;
    $name;
}

1;
__END__

=head1 NAME

Plagger::Plugin::Publish::Excel - Publish feeds as Excel workbook

=head1 SYNOPSIS

  - module: Publish::Excel
    config:
      filename: /path/to/workbook.xls

=head1 DESCRIPTION

This plugin creates Excel workbook.

=head1 AUTHOR

Jiro Nishiguchi

=head1 SEE ALSO

L<Plagger>, L<Spreadsheet::WriteExcel>

=cut

configは

- module: Publish::Excel
  config:
    filename: /path/to/workbook.xls

こんな感じで。

実際はこんな感じになる。(Feed は Plagger の timeline)