2

Template::Toolkit テンプレートに整数を提供したいと考えています。この整数は経過秒数を表します。

この番号を次のようにフォーマットします。

1       => "1 second ago"
2       => "2 seconds ago"
43342   => "12 hours, 2 minutes ago" # ignoring the remaining 42 seconds
4333342 => "1 month, 19 days ago" # ignoring the remaining 17h, 42m & 22s

これを行う TT プラグインが見つかりません。

この書式設定は TT 以外で行う必要がありますか?

ありがとう

4

3 に答える 3

3

そのようなプラグインについては知りませんが、これを行うスカラー用の独自の仮想メソッドを定義できます。

use Template;
my $tt = Template->new({ ... });

$tt->context->define_vmethod('scalar',
    'duration',
    sub {
        my $seconds = shift;
        # calculate the duration
        return $duration;
    }
);

次に、テンプレートで次のように使用します。

Duration: [% var.duration %]
于 2011-07-14T13:19:55.560 に答える
1

DateTime::Duration期間を表すために 使用する場合、近いコードがいくつかあります。DateTime::Format::Human::Duration必要なことのほとんどを実行できますが、関心のあるものを超えて期間の追加部分が含まれる傾向があります。フォーマッターはオブジェクトであり、期間と同様に、両方を変数としてテンプレートに挿入できます。また、期間単位を直接使用してテンプレートでこれを行うこともできますが、これは多くのロジックになる可能性があります。

Time::Duration精度が高くなるため、2つのユニットタイプに制限されますが、オブジェクトインターフェイスがないため、変数として直接挿入することはできませんが、カスタムの基礎としては適切な場合があります。フィルター。

私の場合は、必要な関数を新しいフォーマットクラスにラップします。このクラスには必要な時間がかかり、インスタンスが作成され、それが変数としてテンプレートに挿入されます。通常、その方法で単体テストを行う方が簡単です。

于 2011-07-14T14:37:55.783 に答える
0

日付と時刻の計算を行う任意のモジュールを使用することもできます。上記のように define_vmethod を定義するか、Time 計算クラスのインスタンスを TT スタッシュに割り当てて、そのメソッドをテンプレートで使用します。

例:

#perl
my $tpiece = Time::Piece->new();
$tt->process('my/template.tt', {tpiece=>$tpiece}, \$out);
...
#TT
[% tpiece.add_months(6); %]
于 2011-07-25T21:03:15.893 に答える