Perl: альтернативы шаблону инструментария - программирование

Perl: альтернативы шаблону инструментария

Я использую шаблонный инструментарий для расширения существующего языка домена (verilog) уже более 3 лет. Хотя в целом я им доволен, основным раздражителем является то, что при наличии ошибки синтаксиса /undef сообщение об ошибке не содержит правильной информации о номере линии для отладки ошибки.

например. Я бы получил сообщение, указывающее, что "0 не определено", поскольку я использовал [% x.0%], и подобные конструкции в нескольких местах в файле, выясняя, какая из строк имеет проблему, становится трудной.

TT3, по-видимому, находится в разработке неопределенно

Мой вопрос к гуру - это лучшая альтернатива ТТ. Мои требования

  • Поддержка сложных структур данных
  • Хорошие отчеты об ошибках и возможности отладки.
  • Стабильные и проверенные (без альфа/бета-уровней)
  • Расширяемый (плагин и т.д.)
  • Не следует ограничивать данный язык (html и т.д.).
  • поддержка IF/Else, цикл (foreach while), индексация цикла и т.д.
  • Предпочтительно perl
  • Поддержка дампера данных или эквивалентного плагина из шаблона - это плюс
4b9b3361

Ответ 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 для чистой абстракции шаблона