Text::Xslate の twitter 風カスタムフィルタ
time2ago は実際には js で随時更新していくものだと思うけど、それほどリアルタイム性が必要ない場合に。
autolink は Template中のURLを自動で賢くアンカーテキストにしたい - すぎゃーんメモ を参考にして。
use utf8;
use Text::Xslate qw/html_builder/;
use Regexp::Common qw/URI/;
use Template::Filters;
my $view = Text::Xslate->new(
'syntax' => 'TTerse',
'function' => {
time2ago => sub {
my $epoch = shift;
my $diff = time - $epoch;
if ($diff < 60) {
return int($diff) . '秒前';
}
elsif ($diff < 3600) {
return int($diff / 60) . '分前';
}
elsif ($diff < 86400) {
return int($diff / 3600) . '時間前';
}
else {
return int($diff / 86400) . '日前';
}
},
autolink => html_builder {
my $text = shift;
my $re_uri = qr/($RE{URI}{HTTP})/;
my @arr = split $re_uri, $text;
for (0..$#arr) {
if ($_ % 2) {
$arr[$_] = qq|$arr[$_]|;
}
else {
$arr[$_] = $Template::Filters::FILTERS->{html}->($arr[$_]);
}
}
return join '', @arr;
},
},
);
[% modified | time2ago %] # => 15秒前、34分前、7時間前、3日前、など
[% diary.text | autolink %] # => diary.text に http://... が含まれていた場合、その部分が a タグで囲われたリンクに