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

Gerry on the Shore

長かった。向ヶ丘遊園で初動・下北沢あたりからひどくなった。

mixi をRSSリーダーとして使う

Plagger でどっかに吐いてそれを自分のフィードに設定する。

CSS IE

a:hover 時にマージンだかなんだかが変わるバグでハマり中。全然わからない。手探りもいいとこだ

一通り margin. padding, border 変えたけどだめだ。

テスト機が重すぎて自動リロードがつかえない。fuck IE

全然関係ない要素がいっしょにズレんだよなぁ。しかも position absolute なのにズレる。どういうフローだ

Use of uninitialized value in subroutine entry at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/Socket.pm line 370.
Bad arg length for Socket::unpack_sockaddr_in, length is 0, should be 16 at /usr/lib/perl5/5.8.8/i386-linux-thread-multi/Socket.pm line 370.
exit 107

Win IE のセキュリティ設定を高にして Fedora で動いてる Catalyst 叩くと50%ぐらいの再現率で落ちる。トライアンドエラーもままならないなぁ。ああああ

CGI 版で起動、と思いきや、CGI 動作の重さをあまく見てました。ぜんぜんレスポンス帰ってこない。

hatena.vim

& が正常がなぜか置換されないため増殖する。なんでだろう。ちゃんと置換してるっぽいのに。

:echo substitute('&', '&', '&', 'g')

が & のままだ。なんか特殊文字入ってるんだろうか

substitute('&', '&', '\&', 'g')

としないとだめらしい
:h sub-replace-special
& 単体だとマッチ文字列になるので、何も変わらないという理屈らしい

Publish::Diary SmartFeed::Diary

どうするのがいいかなぁ。SmartFeed::Diary は書いたけど、Publish をどうすればいいんだろう。ディレクトリ掘って保存するなら、Publish が頑張らないといけないだろうし、でもそこで XSLT もかましたい、とすると……
あー、プラグインで Publish のあとにさらに、Publish::Diary とか作って、保存済みの smartfeed_diary_\d{4}(_\d\d(_\d\d)?)? をリネームするやつを作ればいいのかな。やってみよう。