Perl: alternatywy dla szablonu toolkit
Używam szablonowego zestawu narzędzi do rozszerzenia istniejącego języka specyficznego dla domeny (verilog) od ponad 3 lat. Chociaż ogólnie jestem z tego zadowolony, głównym irytującym jest to, że gdy występuje błąd składni/undef komunikat o błędzie nie zawiera prawidłowej informacji o numerze linii, aby debugować błąd.
Np. otrzymałbym komunikat wskazujący "0 nie jest zdefiniowane", ponieważ używałbym [%x.0%] i podobnych konstrukcji w wielu miejscach w pliku, zastanawiając się, która linia ma problem staje się trudny.
TT3 wydaje się być w fazie rozwoju
Moje pytanie do guru brzmi: czy istnieje lepsza alternatywa dla TT. Moje wymagania to
- Wsparcie dla złożonych struktur danych
- dobre możliwości raportowania błędów i debugowania.
- stabilny i sprawdzony ( brak silników na poziomie alfa/beta)
- Extensible (plugin ' s etc)
- nie powinny być ograniczone do danego języka (html itp.)
- wsparcie dla IF / Else, zapętlanie (foreach while), indeksowanie pętli itp.
- najlepiej perl
- Wsparcie dla Data dumper lub równoważnej wtyczki z szablonu jest plusem
5 answers
Obecnie eksperymentuję z Template::Alloy i wydaje się być w zasadzie zamiennikiem TT. Template:: Alloy:: TT wymienia różnice między TT i stopem, z których większość ma postać " to działa / jest dozwolone w stopie, ale nie w TT."Rozwiązując twój konkretny problem, lista zawiera:
- Stop ma lepszą informację o linii
Gdy debug dirs jest włączony, dyrektywy w różnych liniach rozdzielone dwukropki pokazują linia, na której się znajdują, a nie ogólny zakres linii.
Błędy parsowania rzeczywiście wiedzą, w jakiej linii i znaku wystąpiły.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-09 18:25:02
Mogę tylko polecić Text:: Xslate tutaj. Jest lepszy od TT pod każdym względem i przebija większość konkurencji. I wreszcie, pasuje do wszystkich twoich wymagań. Dosłownie. Wszystkie.
Jest to nawet sprawdzone w praktyce, ponieważ jest używany przez jedną z 100 najlepszych stron internetowych na świecie i jedną z 10 najlepszych stron internetowych w Japonii: LivedoorXslate w porównaniu do TT:
- szybsze uruchamianie
- szybsze przetwarzanie
- strict mode by default Znacznie bardziej zaawansowany tryb ścisły, który łapie niespójności poza "var is undef"]}
- szczegółowe błędy pokazujące dokładną pozycję szablonu
- automatyczne usuwanie encji HTML (XSS-safe)
- aktywnie utrzymywane i nie tylko pozostawione do pokutowania
- składnia jest prostym i nowoczesnym perlem
Dwie rzeczy do zapamiętania w Twoim szczególnym przypadku:
- podczas portowania Z TT, możesz chcieć przekaż
syntax => 'TTerse'
do konstruktora, aby uzyskać składnię, która jest zaprojektowana tak, aby była jak najbardziej zbliżona do TT. - podczas generowania Nie-HTML, chcesz przekazać
type => 'text'
do konstruktora, aby wyłączyć interpolacjęhtml_escape
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-15 16:04:37
Mojolicious posiada własny system szablonów Mojo::Template . Jest lekki i może być używany nawet poza systemem mojolicious. Oto przykład z docs:
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;
I inne
# 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;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-14 15:08:46
Mogę zaproponować HTML::Template:Compiled (ale zauważ, że jestem autorem ;-)
Jest całkiem kompatybilny z szablonem HTML::, ale ma dodatkowe funkcje.
Wsparcie dla złożonych struktur danych
TAK
Dobre możliwości raportowania błędów i debugowania.
Możesz debugować trafienia, chybienia pamięci podręcznej, automatycznie dodawać nazwę pliku szablonu do wyjścia i możesz użyć filtru "zrzut" dla bieżącej zmiennej w stash (lub dowolnej zmiennej). If it ' s easy to wdrożenie będę szczęśliwie dodać więcej przydatnych debugowania.
Stabilny i sprawdzony (brak silników na poziomie alfa / beta)
Uznałbym teraz, że jest stabilny, z udokumentowanymi ograniczeniami/błędami (na przykład query ())
Extensible (plugin ' s etc)
Obsługuje wtyczki escape (filter) i nie tylko, choć ta ostatnia nie jest jeszcze dobrze udokumentowana.
Nie powinny być ograniczone do danego języka (html itp.)
TAK
Wsparcie dla IF / Else, loopingu (foreach while), indeksowania pętli, itp.
TAK
Najlepiej perl
TAK
Wsparcie dla data dumper lub równoważnej wtyczki z poziomu szablonu to plus
Jak wspomniano powyżej, użyj escape=dump
Wszystkie dodatkowe funkcje są wymienione w dokumentacji: https://metacpan.org/release/HTML-Template-Compiled w "dodatkowe funkcje"
Edit: odnośnie sprawozdawczości błędy uruchomieniowe: niestety H::T:: C również nie zgłasza numeru linii szablonu pod kątem błędów, które zdarzają się podczas wykonywania, ponieważ kompiluje szablon do kodu Perla (myślę, że eksperymentowałem kiedyś z manipulowaniem numerami linii, może przyjrzę się innym). Błędy składniowe szablonu są zgłaszane z prawidłowym numerem wiersza.
Edit2: Oto przykład z nowymi opcjami warnings i line_info:
T/templates / line_info1.html:
test
test2
test3
foo:<%= foo %> undef line 4
test4
Skrypt:
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-10 14:20:30
Spójrz na Template:: Semantic dla czystej abstrakcji szablonu
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-13 09:07:39