wata.dev

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 タグで囲われたリンクに

ブログの記事一覧