Text::Caml is a Mustache-like (http://mustache.github.com/) template engine. That means it tends to have no logic in template files.
my $view = Text::Caml->new; my $output = $view->render_file('template', {title => 'Hello', body => 'there!'}); # template <html> <head> <title>{{title}}</title> </head> <body> {{body}} </body> </html> $output = $view->render('{{hello}}', {hello => 'hi'});
Context is the data passed to the template. Context can change during template rendering and be specific in various cases.
Variables are inserted using {{foo}} syntax. If a variable is not defined or empty it is simply ignored.
{{foo}}
Hello {{user}}!
By default every variable is escaped when parsed. This can be omitted using & flag.
&
# user is '1 > 2' Hello {{user}}! => Hello 1 > 2! Hello {{&user}}! => Hello 1 > 2!
Using a . syntax it is possible to access deep hash structures.
.
# user => {name => 'Larry'} {{user.name}} Larry
Comments are ignored. They can be multiline too.
foo{{! Comment}}bar foo{{! Comment }}bar
Sections are like iterators that iterate over your data. Depending on a variable type different iterators are created.
Boolean, have_comments is defined, not zero and not empty.
have_comments
# have_comments => 1 {{#have_comments}} We have comments! {{/have_comments}} We have comments!
Array, list is a non-empty array reference. Special variable {{.}} is created to point to the current element.
list
{{.}}
# list => [1, 2, 3] {{#list}}{{.}}{{/list}} 123
Hash, hash is a non-empty hash reference. Context is swithed to to the elements.
hash
# hash => {one => 1, two => 2, three => 3} {{#hash}} {{one}}{{two}}{{three}} {{/hash}} 123
Lambda, lambda is an anonymous subroutine, that's called with three arguments: current object instance, template and the context. This can be used for subrendering, helpers etc.
lambda
wrapped => sub { my $self = shift; my $text = shift; return '<b>' . $self->render($text, @_) . '</b>'; }; {{#wrapped}} {{name}} is awesome. {{/wrapped}} <b>Willy is awesome.</b>
Inverted sections are run in those situations when normal sections don't. When boolean value is false, array is empty etc.
# repo => [] {{#repo}} <b>{{name}}</b> {{/repo}} {{^repo}} No repos :( {{/repo}} No repos :(
Partials are like inludes in other templates engines. They are run with the current context and can be recursive.
inludes
{{#articles}} {{>article_summary}} {{/articles}}
To install Text::Caml, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Text::Caml
CPAN shell
perl -MCPAN -e shell install Text::Caml
For more information on module installation, please visit the detailed CPAN module installation guide.