Publish::XSLT
package Plagger::Plugin::Publish::XSLT;
use strict;
use base qw( Plagger::Plugin::Publish::Feed );
use XML::LibXML;
use XML::LibXSLT;
use File::Spec;
our $stylesheet;
sub register {
my ($self, $context) = @_;
$self->SUPER::register($context);
$context->register_hook(
$self,
'publish.feed' => \&publish_feed,
'plugin.init' => \&plugin_init,
);
}
sub plugin_init {
my ($self, $context, $args) = @_;
my $xslt = XML::LibXSLT->new();
$context->log(debug => "loading " . $self->conf->{xsl} . " as StyleSheet");
$stylesheet = $xslt->parse_stylesheet_file($self->conf->{xsl});
}
sub publish_feed {
my ($self, $context, $args) = @_;
$context->log(info => "XSLT processing Start..");
my $f = $args->{feed};
my $filepath = File::Spec->catfile($self->conf->{dir}, $self->gen_filename($f));
my $parser = XML::LibXML->new();
$context->log(debug => "loading $filepath as source XML");
my $source = $parser->parse_file($filepath);
my $result = $stylesheet->output_string(
$stylesheet->transform($source)
);
my $ext = $self->conf->{extension};
$filepath =~ s/\..+?$/.$ext/;
$context->log(info => "save feed for " . $f->link . " to $filepath");
utf8::decode($result) unless utf8::is_utf8($result);
open my $output, ">:utf8", $filepath or $context->error("$filepath: $!");
print $output $result;
close $output;
}
1; - module: Publish::XSLT
config:
format: Atom
dir: /home/cho45/public_html/feeds/
xsl: /home/cho45/test.xsl
extension: htmlとりあえずコピペと見よう見まねで Publish::XSLT だけ作ってみる。普通に TT で十分だからいらないなぁと思った。
継承でハマった。register_hook でフックを登録しているのだから、register で自分の分を登録して、SUPER で親クラスのを登録させないとだめだ。当たり前だ。
むしろ継承する意味あるんだろうか。load_plugin でいけるような。元の Feed も吐くから継承関係はいいといえばいいのかなぁ。そもそも元のフィードは吐くべきでない気がするけど