Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Perl: Alternatives to template toolkit

I have been using template toolkit for extending an existing domain specific language(verilog) for over 3 years now. While overall I am happy with it, the major irritant is that when there is a syntax/undef error the error message does not contain the correct line number information to debug the error.

e.g. I would get a message indicating "0 is not defined" since I would be using [%x.0%] and similar constructs at multiple locations in the file figuring out which line has the problem becomes difficult.

TT3 seems to be under development indefinitely

My question to the gurus is is there a better alternative to TT. My requirements are

  1. Support for complex data structures
  2. Good error reporting and debug capabilities.
  3. Stable and proven ( no alpha/beta level engines)
  4. Extensible (plugin's etc)
  5. Should not be restricted to a given language (html etc.)
  6. support for IF/Else, looping(foreach while), Loop indexing, etc.
  7. Preferably perl
  8. Support for data dumper or equivalent plugin from within the template is a plus
like image 492
vijayvithal Avatar asked Jan 09 '13 13:01

vijayvithal


3 Answers

I can only recommend Text::Xslate here. It is better than TT in every way and beats out most of the competition as well. And lastly, it fits all your requirements. Literally. All of them.

It is even proven in practice, as it is used by one of the Top 100 websites worldwide and one of the Top 10 websites in Japan: Livedoor

Xslate in comparison to TT:

  • faster startup
  • faster processing
  • strict mode by default
  • much more advanced strict mode that catches inconsistencies beyond just "var is undef"
  • detailed errors that show the exact template position
  • automatic HTML entity escaping (XSS-safe)
  • actively maintained and not just left to languish
  • syntax is straight-forward and modern perl

Two things to note for your special case:

  1. As you're porting from TT, you might want to pass syntax => 'TTerse' to the constructor to get a syntax that's designed to be as close to TT as possible.
  2. When generating non-HTML, you want to pass type => 'text' to the constructor to disable html_escape interpolation.
like image 112
Mithaldu Avatar answered Oct 18 '22 00:10

Mithaldu


I'm currently experimenting with Template::Alloy and it seems to be, by and large, a drop-in replacement for TT. Template::Alloy::TT lists the differences between TT and Alloy, most of which are of the form "This works/is allowed in Alloy, but not in TT." Addressing your specific issue, the list includes:

  • Alloy has better line information

When debug dirs is on, directives on different lines separated by colons show the line they are on rather than a general line range.

Parse errors actually know what line and character they occured at.

like image 31
Dave Sherohman Avatar answered Oct 17 '22 22:10

Dave Sherohman


Mojolicious comes with its own templating system Mojo::Template. Its lightweight and can be used even outside of the mojolicious system. Here is an example from the 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;

and another

  # 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;
like image 10
Joel Berger Avatar answered Oct 18 '22 00:10

Joel Berger