Widget::Simpleを使ってテンプレートをDRYに

皆さんがHackthon中*1なので、Plaggerでも新顔のプラグインWidget::Simpleで遊んで見ました。

Widgetは面白いものの、使用しているテンプレートはmiyagawaさん謹製のP::GmailとP::Planet、P::PSPでしか使われていません(P::GmailをパクッたP::MaildirとP::IMAPも使用していますが…)。で、使用している箇所を見て見たらほとんど同じになっていたので、ちょっとハックして見ました。


ハック内容としては、Widgetを配置する場所の前に必ず記述してあるpostedtimeやpermalink、feedlinkもWiget::Simpleで記述しようと言うものです。

うまく使えれば、他のPublishでも面白い使い方が出来るのでは?

plagger/lib/Plagger/Plugin/Widget/Simple.pm

W::SimpleはYAMLにlink:があることを期待しているようで、必ずリンクを作成するのですが、posted_timeの様にリンク先が無いものも許すように改造。また、EFTやStripRSSAdの様に読み込んだYAMLを出力する様にも変更。

 --- svn/plagger/lib/Plagger/Plugin/Widget/Simple.pm     (revision 1381)
+++ svn/plagger/lib/Plagger/Plugin/Widget/Simple.pm (working copy)
@@ -23,9 +23,11 @@
$self->load_assets(
File::Find::Rule->name("$name.yaml"),
sub {
- my $data = YAML::LoadFile(shift);
+ my $file = shift;
+ my $data = YAML::LoadFile($file);
$self->{conf} = { %{$self->{conf}}, %$data };
$found++;
+ $context->log(debug => "loading $file");
},
);

@@ -94,8 +96,11 @@
} else {
$content = $self->plugin->conf->{content};
}
-
- return qq(<a href="$url">$content</a>);
+ if ($url) {
+ return qq(<a href="$url">$content</a>);
+ } else {
+ return $content;
+ }
}

1;

plagger/assets/plugins/Publish-Gmail/gmail_notify.tt

postedtimeやpermalink、feedlinkをW::Simpleで表示させるので、テンプレートを修正。とりあえず自分が使うP::Gmailのみ。

本当は[% IF entry.widgets %]で処理を分岐したく無いのですが、とりあえず後方互換性と言うことで残してあります。coreでentry.widgetsが空なら以前の内容を表示する等の対応をしてもらえればここら辺はかなりすっきりしそう。

 --- svn/plagger/assets/plugins/Publish-Gmail/gmail_notify.tt    (revision 1381)
+++ svn/plagger/assets/plugins/Publish-Gmail/gmail_notify.tt (working copy)
@@ -17,7 +17,7 @@
[% IF entry.body -%]
[% IF entry.body.match('(?i)^<p[ >]') %][% entry.body %][% ELSE %]<div style="padding: 1em 0">[% entry.body %]</div>[% END %]
[% ELSE %]<br />[% END %]
-<div style="font-size:0.8em">[% IF entry.date %]Posted on [% entry.date.format('Mail') %][% END %] | <a href="[% entry.permalink | html %]">permalink</a> | <a href="[% feed.link | html %]">[% feed.title | html %]</a>[% FOREACH widget = entry.widgets %] | [% widget.html(entry) %][% END %]<br clear="all" /></div>
+<div style="font-size:0.8em">[% IF entry.widgets %][% FOREACH widget = entry.widgets %] | [% widget.html(entry) %][% END %][% ELSE %][% IF entry.date %]Posted on [% entry.date.format('Mail') %][% END %] | <a href="[% entry.permalink | html %]">permalink</a> | <a href="[% feed.link | html %]">[% feed.title | html %]</a>[% END %]<br clear="all" /></div>
</div>
[% UNLESS loop.last %]<hr />[% END %]
[%- END %]

plagger/assets/plugins/Widget-Simple/feed_link.yaml

content_dynamic: <a href="[% feed.link | html %]">[% feed.title | html %]</a>

plagger/assets/plugins/Widget-Simple/permalink.yaml

content_dynamic: <a href="[% entry.permalink | html %]">permalink</a>

plagger/assets/plugins/Widget-Simple/feed_link.yaml

content_dynamic: <a href="[% feed.link | html %]">[% feed.title | html %]</a>

config.yaml

config.yamlへは以下の通り記述すれば以前と同様の表示になります。

これで、feed_linkの表示がFeedのタイトルになるので長くてうざいというという時には、テンプレートを修正しなくても設定ファイルで調整できるので楽かも?

 - module: Widget::Simple
config:
widget: posted_time
- module: Widget::Simple
config:
widget: permalink
- module: Widget::Simple
config:
widget: feed_link

*1:自分はまたもや行けませんでしたが…