Perl:模板工具包的替代方案
我已经使用模板工具包来扩展现有的领域特定语言(verilog)三年多了。虽然总的来说我对此很满意,但主要的问题是,当出现语法/undef错误时,错误消息不包含正确的行号信息来调试错误 e、 g.我将收到一条消息,指示“0未定义”,因为我将在文件中的多个位置使用[%x.0%]和类似的构造,很难确定哪一行有问题 TT3似乎正在无限期地开发中 我向大师们提出的问题是,有没有更好的选择来替代TT。我的要求是Perl:模板工具包的替代方案,perl,templates,template-engine,template-toolkit,Perl,Templates,Template Engine,Template Toolkit,我已经使用模板工具包来扩展现有的领域特定语言(verilog)三年多了。虽然总的来说我对此很满意,但主要的问题是,当出现语法/undef错误时,错误消息不包含正确的行号信息来调试错误 e、 g.我将收到一条消息,指示“0未定义”,因为我将在文件中的多个位置使用[%x.0%]和类似的构造,很难确定哪一行有问题 TT3似乎正在无限期地开发中 我向大师们提出的问题是,有没有更好的选择来替代TT。我的要求是 支持复杂的数据结构 良好的错误报告和调试功能 稳定且经验证(无α/β级发动机) 可扩展(插件等)
我可以建议HTML::Template:Compiled(但请注意,我是作者;-) 它与HTML::Template非常兼容,但具有其他特性 支持复杂的数据结构 对 良好的错误报告和调试功能 您可以调试缓存命中、未命中、自动将模板文件名添加到输出中,并且可以对隐藏中的当前变量(或任何变量)使用过滤器“转储”。 如果很容易实现,我很乐意添加更多有用的调试 稳定且经验证(无α/β级发动机)
我认为它是稳定的,有文件化的限制/错误(例如Quices())
可扩展(插件等) 支持escape(filter)插件等,尽管后者还没有很好的文档记录 不应仅限于给定的语言(html等) 对 支持IF/Else、循环(foreach-while)、循环索引等 对 最好是perl 对 支持模板中的数据转储程序或等效插件是一个加号 如上所述,使用escape=dump 文档中列出了所有其他功能: 在“附加功能”中 编辑:关于报告运行时错误:不幸的是,H::T::C也没有报告运行时发生的错误的模板行号,因为它将模板编译为perl代码(我想我曾经尝试过处理行号,也许我会再看一次)。 使用正确的行号报告模板语法错误 编辑2: 下面是一个新选项“警告”和“行信息”的示例: t/templates/line_info1.html:test
test2
test3
foo:<%= foo %> undef line 4
test4
我目前正在试验,总的来说,它似乎是TT的替代品。列出TT和Alloy之间的差异,其中大多数是“Alloy中允许/但TT中不允许”的形式。针对您的具体问题,该列表包括:
- 合金具有更好的线条信息
- 更快的启动
- 更快的处理
- 默认情况下为严格模式
- 更高级的严格模式,它捕获的不一致性不仅仅是“var未定义”
- 显示精确模板位置的详细错误
- 自动HTML实体转义(XSS安全)
- 不仅仅是
- 语法是直接的和现代的perl
对于您的特殊情况,需要注意两件事:
syntax=>'TTerse'
传递给构造函数,以获得尽可能接近TT的语法type=>'text'
传递给构造函数以禁用HTML\u escape
插值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;
使用Mojo::Template;
我的$mt=Mojo::Template->new;
#简单的
我的$output=$mt->render(render)(这是一个旧的writeup。我认为它不完整(例如不包括xslate),但可能仍然对您有帮助:tinita,很遗憾,我希望离开TT,只是因为它没有报告错误的正确行号:(@vijayvithal:我又看了一眼,似乎可以通过为WARN添加一个SIG处理程序和通过#line指令操纵行号来实现。test suite suceeds.噢,我根本不需要SIG处理程序。我想在下一个版本中添加一个选项来激活此功能。@vijayvithal:我上传了1.000#004。添加了选项“Warning”和“line_info”(虽然忘记更新更改文件)今天测试了模板::Alloy。Debug_dirs不适合我的用途,因为它假定我正在生成HTML并插入HTML样式的注释。对于x=[]/*empty array*/在模板模板中的某处后跟x.0 template::Alloy相对更有用,因为它给出了完整的消息x.0未定义,而TT2说0未定义…明天将尝试XSLTE。如果我使用template::Alloy和DEBUG=>DEBUG\u DIRS,我会得到“var.undef error-undefined variable:bar in ln.tt”.但这是米
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;