2006年 09月 06日

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 も吐くから継承関係はいいといえばいいのかなぁ。そもそも元のフィードは吐くべきでない気がするけど