catlxom で RSS や TrackBack 等の Auto Discovery データを追加するためのプラグインを書こうと思い、まずは Account Auto-Discovery データを追加するプラグインを書いてみた。
blosxom でも 同様のプラグイン を書いているのですが、一番大きな違いは、blosxom プラグインはテンプレートの修正が必要なのに対し、catlxom プラグインはテンプレートの修正が一切必要ありません。XML::TreeBuilder を利用して、HTML ヘッダにデータを追加するような作りにしています。
利用上の注意点として、Template::TT よりも後にこのプラグインをロードしなければいけいのですが、自動ロードを有効にしてると先にロードされちゃうので、自動ロードをオフにして yaml で明示的に利用プラグインを指定する必要があります。
package Catlxom::Plugin::Format::AccountAutoDiscovery; use strict; use warnings; use base qw/Catlxom::Plugin/; use NEXT; use XML::TreeBuilder; sub interpolate { my ( $self, $c ) = @_; my $accounts = $c->config->{account_auto_discovery}; my $tree = XML::TreeBuilder->new(); $tree->parse($c->res->body); my $head = $tree->find('head'); for ( @$accounts ){ my $rdf = XML::Element->new( 'rdf:RDF', 'xmlns:rdf' => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'xmlns:foaf' => 'http://xmlns.com/foaf/0.1/', ); my $rdf_description = XML::Element->new( 'rdf:Description', 'rdf:about' => $c->req->uri, ); my $foaf_maker = XML::Element->new( 'foaf:maker', 'rdf:parseType' => 'Resource', ); my $foaf_holds_acount = XML::Element->new( 'foaf:holdsAccount' ); my $foaf_online_account = XML::Element->new( 'foaf:OnlineAccount', 'foaf:accountName' => $_->{account_name}, ); my $foaf_account_service_homepage = XML::Element->new( 'foaf:accountServiceHomepage', 'rdf:resource' => $_->{account_service_homepage}, ); $head->push_content($rdf); $rdf->push_content($rdf_description); $rdf_description->push_content($foaf_maker); $foaf_maker->push_content($foaf_holds_acount); $foaf_holds_acount->push_content($foaf_online_account); $foaf_online_account->push_content($foaf_account_service_homepage); } $c->res->{body} = $tree->as_HTML; $self->NEXT::interpolate($c); } 1; __END__ =head1 NAME Catlxom::Plugin::Format::AccountAutoDiscovery =head1 SYNOPSIS account_auto_discovery: - account_name: gosukenator account_service_homepage: http://www.hatena.ne.jp/ - account_name: xxxx account_service_homepage: http://xxx.ne.jp/ =head1 DESCRIPTION This plugin inserts Account Auto-Discovery data into HTML header. =head1 AUTHOR Gosuke Miyashita =head1 SEE ALSO L<http://b.hatena.ne.jp/help?mode=tipjar#autodiscovery> =cut