Plagger::Plugin::Publish::PowerPoint
ファイル名まわりとか、Plagger::Pluginあたりに入れてもらった方がすっきりするかもなあと思いつつ。
package Plagger::Plugin::Publish::PowerPoint;
use strict;
use base qw( Plagger::Plugin );
our $VERSION = '0.01';
use Win32::PowerPoint;
use Encode;
use File::Path;
sub register {
my($self, $context) = @_;
$context->register_hook(
$self,
'publish.init' => \&connect_powerpoint,
'publish.feed' => \&publish_presentation,
);
}
sub publish_presentation {
my ($self, $context, $args) = @_;
my $feed = $args->{feed};
$self->{powerpoint}->new_presentation;
foreach my $entry ($feed->entries) {
my $title_text = $entry->title_text;
my $body_text = $entry->body_text;
$title_text =~ s/^\s+//mg;
$body_text =~ s/^\s+//mg;
$self->{powerpoint}->new_slide;
$self->{powerpoint}->add_text(
encode('shift_jis',$title_text),
{ size => 30, bold => 1, height => 50 },
);
$self->{powerpoint}->add_text(
encode('shift_jis',$body_text),
{ size => 20 },
);
}
# generate file path;
my $file = File::Spec->catfile(
$self->conf->{dir}, $self->gen_filename($feed)
);
$context->log(info => "save feed for " . $feed->link . " to $file");
$self->{powerpoint}->save_presentation($file);
$self->{powerpoint}->close_presentation;
}
sub connect_powerpoint {
my ($self, $context, $args) = @_;
my $dir = $self->conf->{dir};
unless (-e $dir && -d _) {
$context->log(debug => "make dir");
mkpath($dir, 0755) or $context->error("mkdir $dir: $!");
}
$context->log(debug => "hello, PowerPoint");
$self->{powerpoint} = Win32::PowerPoint->new;
}
# stolen from ::Publish::Feed
my %formats = (
'u' => sub { my $s = $_[0]->url; $s =~ s!^https?://!!; $s },
'l' => sub { my $s = $_[0]->link; $s =~ s!^https?://!!; $s },
't' => sub { $_[0]->title },
'i' => sub { $_[0]->id },
);
my $format_re = qr/%(u|l|t|i)/;
sub gen_filename {
my($self, $feed) = @_;
my $file = $self->conf->{filename} || '%i.pps';
$file =~ s{$format_re}{
$self->safe_filename($formats{$1}->($feed))
}egx;
$file;
}
sub safe_filename {
my($self, $path) = @_;
$path =~ s![^\w\s]+!_!g;
$path =~ s!\s+!_!g;
$path;
}
1;
__END__
=head1
Plagger::Plugin::Publish::PowerPoint - publish as PowerPoint slide
=head1 SYNOPSYS
- module: Publish::PowerPoint
config:
dir: /home/foobar/plagger
filename: %l.pps
=head1 CONFIG
Accepts C<dir> and C<filename>. See ::Publish::Feed for details.
=head1 AUTHOR
Kenichi Ishigaki
=head1 SEE ALSO
C<Plagger>, C<Plagger::Plugin::Publish::Feed>, C<Win32::PowerPoint>
=cut