[英]Perl: Alternatives to template toolkit
我一直在使用模板工具包擴展現有的域特定語言(verilog)超過3年。 雖然整體而言我很滿意,但主要的刺激是當出現語法/ undef錯誤時,錯誤消息不包含正確的行號信息來調試錯誤。
例如,我會得到一條消息,指示“0未定義”,因為我將使用[%x.0%]和文件中多個位置的類似結構,確定哪一行有問題變得困難。
TT3似乎無限期地在開發中
我對大師的問題是有更好的替代TT。 我的要求是
我只能在這里推薦Text :: Xslate 。 它在各方面都優於TT,也擊敗了大部分比賽。 最后,它符合您的所有要求。 從字面上看。 他們都是。
它在實踐中得到了證明,因為它被全球100強網站之一和日本十大網站之一使用: Livedoor
Xslate與TT相比:
特殊情況需要注意兩點:
syntax => 'TTerse'
傳遞給構造函數,以獲得盡可能接近TT的語法。 type => 'text'
傳遞給構造函數以禁用html_escape
插值。 我目前正在試驗Template :: Alloy ,它似乎總體上是TT的直接替代品。 Template :: Alloy :: TT列出了TT和Alloy之間的差異,其中大多數的形式為“這樣可以在合金中使用,但在TT中不允許”。 針對您的具體問題,該清單包括:
- Alloy有更好的生產線信息
當debug dirs打開時,由冒號分隔的不同行上的指令顯示它們所在的行而不是一般行范圍。
解析錯誤實際上知道它們出現在哪個行和字符處。
Mojolicious帶有自己的模板系統Mojo :: Template 。 它重量輕,甚至可以在mojolicious系統之外使用。 以下是文檔中的示例:
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;
我可以推薦HTML :: Template:Compiled(但請注意我是作者;-)
它與HTML :: Template完全兼容,但具有其他功能。
支持復雜的數據結構
是
良好的錯誤報告和調試功能。
您可以調試緩存命中,未命中,自動將模板文件名添加到輸出,並可以使用過濾器“DUMP”作為存儲(或任何變量)中的當前變量。 如果它易於實現,我將很樂意添加更多有用的調試。
穩定且經過驗證(沒有alpha / beta級引擎)
我現在認為它穩定,有記錄的限制/錯誤(例如query())
可擴展(插件等)
支持轉義(過濾)插件等等,雖然后者尚未得到很好的記錄。
不應限於給定的語言(HTML等)
是
支持IF / Else,循環(foreach while),循環索引等。
是
優選perl
是
從模板中支持數據轉儲器或等效插件是一個優點
如上所述,使用escape = dump
文檔中列出了所有其他功能: https ://metacpan.org/release/HTML-Template-編譯為“附加功能”
編輯:關於報告運行時錯誤:遺憾的是,H :: T :: C也沒有報告運行時發生的錯誤的模板行號,因為它將模板編譯為perl-code(我想我曾經嘗試過操作一次行號,也許我會再看看)。 使用正確的行號報告模板語法錯誤。
edit2:所以這是一個帶有新選項警告和line_info的示例:
T /模板/ line_info1.html:
test
test2
test3
foo:<%= foo %> undef line 4
test4
腳本:
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
看一下Template :: Semantic的純模板抽象
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.