Показать дельту времени в шаблоне Perl - PullRequest
2 голосов
/ 14 июля 2011

Я хочу указать целое число в шаблоне 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, который делает это.

Нужно ли делать это форматирование вне ТТ?

Спасибо

Ответы [ 3 ]

3 голосов
/ 14 июля 2011

Я не знаю ни о каком таком плагине, но вы можете определить свой собственный виртуальный метод для скаляров, который будет делать это:

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

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

Тогда в вашем шаблоне используйте его так:

Duration: [% var.duration %]
1 голос
/ 14 июля 2011

Есть некоторый код, который подходит близко, если вы используете DateTime::Duration для представления длительности. DateTime::Format::Human::Duration может делать большую часть того, что вам нужно, но будет иметь тенденцию включать дополнительные части длительности сверх того, что вас интересует. Поскольку средство форматирования является объектом, как и продолжительность, оба могут быть введены в шаблон как переменные. Вы также просто используете единицы измерения длительности напрямую, чтобы сделать это в шаблоне, но это может быть много логики.

Time::Duration делает более точную вещь, поэтому он предусматривает ограничение для двух типов модулей, но не имеет объектного интерфейса, поэтому вы не можете вставить его непосредственно как переменную, но это может быть хорошая основа для пользовательского фильтра.

Если бы это был я, я бы обернул нужную мне функцию в новый класс форматирования, который занимает время, которое вам нужно, сделал бы экземпляр и вставил бы это как переменную в шаблон. Как правило, таким образом проще выполнить модульное тестирование.

0 голосов
/ 26 июля 2011

Вы также можете использовать любой модуль, который выполняет вычисления даты и времени. Либо define_vmethod, как показано выше, либо просто назначьте экземпляр вашего класса вычисления Time для TT stash и используйте его методы прямо в ваших шаблонах.

Пример:

#perl
my $tpiece = Time::Piece->new();
$tt->process('my/template.tt', {tpiece=>$tpiece}, \$out);
...
#TT
[% tpiece.add_months(6); %]
...