NAME

Mojo::Template - Perlish Templates

SYNOPSIS

use Mojo::Template;
my $mt = Mojo::Template->new;

# Simple
print $mt->render(<<'EOF');
<html>
  <head></head>
  <body>
    Time: <%= localtime(time) %>
  </body>
</html>
EOF

# More complicated
print $mt->render(<<'EOF', 23, 'foo bar');
%= 5 * 5
% my ($number, $text) = @_;
test 123
foo <% my $i = $number + 2 %>
% for (1 .. 23) {
* some text <%= $i++ %>
% }
EOF

DESCRIPTION

Mojo::Template is a minimalistic and very Perl-ish template engine, designed specifically for all those small tasks that come up during big projects. Like preprocessing a config file, generating text from heredocs and stuff like that. For bigger tasks you might want to use HTML::Mason or Template.

<% Inline Perl %>
<%= Perl expression, replaced with result %>
<%# Comment, useful for debugging %>
% Perl line
%= Perl expression line, replaced with result
%# Comment line, useful for debugging

Mojo::Template templates work just like Perl subs (actually they get compiled to a Perl sub internally). That means you can access arguments simply via @_.

% my ($foo, $bar) = @_;
% my $x = shift;
test 123 <%= $foo %>

Note that you can't escape Mojo::Template tags, instead we just replace them if neccessary.

my $mt = Mojo::Template->new;
$mt->line_start('@@');
$mt->tag_start('[@@');
$mt->tag_end('@@]');
$mt->expression_mark('&');
$mt->render(<<'EOF', 23);
@@ my $i = shift;
<% no code just text [@@& $i @@]
EOF

There is only one case that we can escape with a backslash, and thats a newline at the end of a template line.

This is <%= 23 * 3 %> a\
single line

If for some strange reason you absolutely need a backslash in front of a newline you can escape the backslash with another backslash.

% use Data::Dumper;
This will\\
result <%=  Dumper {foo => 'bar'} %>\\
in multiple lines

Templates get compiled to Perl code internally, this can make debugging a bit tricky. But by setting the MOJO_TEMPLATE_DEBUG environment variable to 1, you can tell Mojo::Template to trace all errors that might occur and present them in a very convenient way with context.

Template error around line 4.
-----------------------------------------------------------------
2: </head>
3: <body>
4: % my $i = 2; xx
5: %= $i * 2
6: </body>
-----------------------------------------------------------------
Bareword "xx" not allowed while "strict subs" in use at (eval 13)
line 4.

Mojo::Template does not support caching by itself, but you can easily build a wrapper around it.

# Compile and store code somewhere
my $mt = Mojo::Template->new;
$mt->parse($template);
$mt->compile;
my $code = $mt->code;

# Load code and template (template for debug trace only)
$mt->template($template);
$mt->code($code);
my $result = $mt->interpret(@arguments);

ATTRIBUTES

code

my $code = $mt->code;
$mt      = $mt->code($code);

comment_mark

my $comment_mark = $mt->comment_mark;
$mt              = $mt->comment_mark('#');

expression_mark

my $expression_mark = $mt->expression_mark;
$mt                 = $mt->expression_mark('=');

line_start

my $line_start = $mt->line_start;
$mt            = $mt->line_start('%');

template

my $template = $mt->template;
$mt          = $mt->template($template);

tree

my $tree = $mt->tree;
$mt      = $mt->tree($tree);

tag_start

my $tag_start = $mt->tag_start;
$mt           = $mt->tag_start('<%');

tag_end

my $tag_end = $mt->tag_end;
$mt         = $mt->tag_end('%>');

METHODS

Mojo::Template inherits all methods from Mojo::Base and implements the following new ones.

new

my $mt = Mojo::Template->new;

compile

$mt = $mt->compile;

interpret

my $result = $mt->interpret;
my $result = $mt->interpret(@arguments);

parse

$mt = $mt->parse($template);

render

my $result = $mt->render($template);
my $result = $mt->render($template, @arguments);

renter_file

my $result = $mt->render($template_file);
my $result = $mt->render($template_file, @arguments);

renter_file_to_file

my $result = $mt->render($template_file, $result_file);
my $result = $mt->render($template_file, $result_file, @arguments);

renter_to_file

my $result = $mt->render($template, $result_file);
my $result = $mt->render($template, $result_file, @arguments);