The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

Text::Caml is a Mustache-like (http://mustache.github.com/) template engine. That means it tends to have no logic in template files.

Example

    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'});

Syntax

Context

Context is the data passed to the template. Context can change during template rendering and be specific in various cases.

Variables

Variables are inserted using {{foo}} syntax. If a variable is not defined or empty it is simply ignored.

    Hello {{user}}!

By default every variable is escaped when parsed. This can be omitted using & flag.

    # user is '1 > 2'
    Hello {{user}}! => Hello 1 &gt; 2!

    Hello {{&user}}! => Hello 1 > 2!

Using a . syntax it is possible to access deep hash structures.

    # user => {name => 'Larry'}
    {{user.name}}

    Larry

Comments

Comments are ignored. They can be multiline too.

  foo{{! Comment}}bar

  foo{{!
  Comment
  }}bar

Sections

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 => 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 => [1, 2, 3]
        {{#list}}{{.}}{{/list}}
    
        123
  • Hash, hash is a non-empty hash reference. Context is swithed to to the elements.

        # 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.

        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

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

Partials are like inludes in other templates engines. They are run with the current context and can be recursive.

    {{#articles}}
    {{>article_summary}}
    {{/articles}}