Perl: альтернативы шаблону инструментария
Я использую шаблонный инструментарий для расширения существующего языка домена (verilog) уже более 3 лет. Хотя в целом я им доволен, основным раздражителем является то, что при наличии ошибки синтаксиса /undef сообщение об ошибке не содержит правильной информации о номере линии для отладки ошибки.
например. Я бы получил сообщение, указывающее, что "0 не определено", поскольку я использовал [% x.0%], и подобные конструкции в нескольких местах в файле, выясняя, какая из строк имеет проблему, становится трудной.
TT3, по-видимому, находится в разработке неопределенно
Мой вопрос к гуру - это лучшая альтернатива ТТ. Мои требования
- Поддержка сложных структур данных
- Хорошие отчеты об ошибках и возможности отладки.
- Стабильные и проверенные (без альфа/бета-уровней)
- Расширяемый (плагин и т.д.)
- Не следует ограничивать данный язык (html и т.д.).
- поддержка IF/Else, цикл (foreach while), индексация цикла и т.д.
- Предпочтительно perl
- Поддержка дампера данных или эквивалентного плагина из шаблона - это плюс
Ответы
Ответ 1
В настоящее время я экспериментирую с Template::Alloy, и, похоже, это замена в целом для TT. Template::Alloy::TT перечислены различия между TT и сплавом, большинство из которых имеют форму "Это работает/разрешено в сплаве, но не в TT". В соответствии с вашей конкретной проблемой список включает в себя:
- Сплав имеет лучшую информацию о линии
Когда debug dirs включен, директивы на разных строках, разделенные двоеточия показывают линию, в которой они находятся, а не общий диапазон линий.
Ошибки анализа действительно знают, в какой строке и характере они произошли.
Ответ 2
Я могу рекомендовать Text::Xslate здесь. Это лучше, чем TT, и превосходит большинство конкурентов. И, наконец, он соответствует всем вашим требованиям. Буквально. Все они.
Это даже доказано на практике, так как оно используется одним из 100 лучших сайтов по всему миру и одним из 10 лучших сайтов в Японии: Livedoor
Xslate по сравнению с TT:
- быстрый запуск
- ускоренная обработка
- строгий режим по умолчанию
- гораздо более продвинутый строгий режим, который улавливает несоответствия за пределами "var is undef"
- подробные ошибки, отображающие точную позицию шаблона
- автоматическое исключение HTML-объекта (XSS-safe)
- активно поддерживается, а не только осталось вяло
Синтаксис
- является прямым и современным perl
Две вещи для вашего особого случая:
- Как вы переносите из TT, вы можете передать
syntax => 'TTerse'
конструктору, чтобы получить синтаксис, который был максимально приближенным к TT.
- При генерации не-HTML вы хотите передать
type => 'text'
в конструктор, чтобы отключить интерполяцию html_escape
.
Ответ 3
Mojolicious поставляется со своей собственной системой шаблонов Mojo:: Template. Его легкий вес и может использоваться даже вне мохолической системы. Вот пример из документов:
use Mojo::Template;
my $mt = Mojo::Template->new;
# Simple
my $output = $mt->render(<<'EOF');
% use Time::Piece;
<!DOCTYPE html>
<html>
<head><title>Simple</title></head>
% my $now = localtime;
<body>Time: <%= $now->hms %></body>
</html>
EOF
say $output;
и еще
# More advanced
my $output = $mt->render(<<'EOF', 23, 'foo bar');
% my ($number, $text) = @_;
%= 5 * 5
<!DOCTYPE html>
<html>
<head><title>More advanced</title></head>
<body>
test 123
foo <% my $i = $number + 2; %>
% for (1 .. 23) {
* some text <%= $i++ %>
% }
</body>
</html>
EOF
say $output;
Ответ 4
Я могу предложить HTML:: Шаблон: Скомпилированный (но заметьте, что я автор; -)
Он вполне совместим с HTML:: Template, но имеет дополнительные функции.
Поддержка сложных структур данных
да
Хорошие отчеты об ошибках и возможности отладки.
Вы можете отлаживать хиты кэшей, промахи, автоматически добавлять имя файла шаблона для вывода и использовать фильтр "DUMP" для текущей переменной в stash (или любой переменной).
Если это будет легко реализовать, я с радостью добавлю более полезную отладку.
Стабильные и проверенные (без альфа/бета-уровней)
Я бы счел его стабильным сейчас, с документированными ограничениями/ошибками (например, query())
Расширяемый (плагин и т.д.)
поддерживает плагины escape (фильтра) и многое другое, хотя последнее еще не задокументировано.
Не следует ограничиваться данным языком (html и т.д.)
да
поддержка IF/Else, цикл (foreach while), индексация цикла и т.д.
да
Предпочтительно perl
да
Поддержка дампера данных или эквивалентного плагина из шаблона - это плюс
как указано выше, используйте escape = dump
все дополнительные функции перечислены в документации:
https://metacpan.org/release/HTML-Template-Compiled
в разделе "ДОПОЛНИТЕЛЬНЫЕ ВОЗМОЖНОСТИ"
edit: относительно ошибок выполнения отчетов: к сожалению, H:: T:: C также не сообщает номер строки шаблона для ошибок, которые происходят во время выполнения, поскольку он компилирует шаблон в perl-код (я думаю, что я экспериментировал с манипулированием строкой цифры один раз, может быть, у меня будет другой взгляд).
ошибки синтаксиса шаблона сообщаются с правильным номером строки.
edit2:
Итак, вот пример с новыми предупреждениями и параметрами line_info:
т/шаблоны/line_info1.html:
test
test2
test3
foo:<%= foo %> undef line 4
test4
script:
use HTML::Template::Compiled;
my $t = HTML::Template::Compiled->new(
filename => "t/templates/line_info1.html",
warnings => 1,
line_info => 1,
);
say $t->output;
__END__
Use of uninitialized value in concatenation (.) or string at t/templates/line_info1.html line 4.
test
test2
test3
foo: undef line 4
test4
Ответ 5
посмотрите Template:: Semantic для чистой абстракции шаблона