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

  1. Wsparcie dla złożonych struktur danych
  2. dobre możliwości raportowania błędów i debugowania.
  3. stabilny i sprawdzony ( brak silników na poziomie alfa/beta)
  4. Extensible (plugin ' s etc)
  5. nie powinny być ograniczone do danego języka (html itp.)
  6. wsparcie dla IF / Else, zapętlanie (foreach while), indeksowanie pętli itp.
  7. najlepiej perl
  8. Wsparcie dla Data dumper lub równoważnej wtyczki z szablonu jest plusem
Author: vijayvithal, 2013-01-09

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.

 11
Author: Dave Sherohman,
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: Livedoor

Xslate 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:

  1. 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.
  2. podczas generowania Nie-HTML, chcesz przekazać type => 'text' do konstruktora, aby wyłączyć interpolację html_escape.
 20
Author: Mithaldu,
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;
 9
Author: Joel Berger,
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
 5
Author: tinita,
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

 2
Author: vividsnow,
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