README
Raku implementation of Mustache templates, http://mustache.github.io/.
Synopsis
use Template::Mustache;
# Call .render as a class method
Template::Mustache.render('Hello, {{planet}}!', { planet => 'world' }).say;
# Or instantiate an instance
my $stache = Template::Mustache.new: :from<./views>;
# Subroutines are called
say $stache.render('The time is {{time}}', {
time => { ~DateTime.new(now).local }
});
my @people =
{ :name('James T. Kirk'), :title<Captain> },
{ :name('Wesley'), :title('Dread Pirate'), :emcee },
{ :name('Dana Scully'), :title('Special Agent') },
;
# See this template in ./t/views/roster.mustache
$stache.render('roster', { :@people }).say;
my %context =
event => 'Masters of the Universe Convention',
:@people,
;
my %partials =
welcome =>
qq:b{Welcome to the {{event}}! Weβre pleased to have you here.\n\n},
;
# See this result in ./t/50-readme.t
Template::Mustache.render(q:to/EOF/,
{{> welcome}}
{{> roster}}
Dinner at 7PM in the Grand Ballroom. Bring a chair!
EOF
%context,
:from([%partials, './views'])
).say;Description
Logging
Log levels
Messages are logged with varying severity levels (from most to least severe): Fatal, Error, Warn, Info, Verbose, Audit, Debug, Trace, Trace2
By default, only messages of Error or worse are logged. That default can be changed with the TEMPLATE_MUSTACHE_LOGLEVEL environment variable.
TEMPLATE_MUSTACHE_LOGLEVEL=DebugThe default is overridden with the :log-level option to Template::Mustache.new, or a Template::Mustache::Logger object can be passed via the :logger option.
my $stache = Template::Mustache.new: :log-level<Trace>;
my $logger = Template::Mustache::Logger.new: :level<Debug>;
my $stache = Template::Mustache.new: :$logger;Either method can be used with the .render method, as well.
my %data = hello => 'world';
Template::Mustache.render: 'Hello, {{hello}}!', %data, :log-level<Trace>;
my $logger = Template::Mustache::Logger.new: :level<Debug>;
Template::Mustache.render: 'Hello, {{hello}}!', %data, :$logger;Log routine
By default, any messages at level Warn or worse are logged with the warn routine. A CONTROL block can handle such warnings if needed; see Language/phasers for details. Less severe messages (Info and up) are logged with the note routine.
The routine can be set per log level, in the Template::Mustache::Logger.routines hash.
# Use say instead of note for Info and up; the more severe
# levels (C<Warn> down to C<Fatal>) still use the warn routine
my $stache = Template::Mustache.new: :log-routine(&say);
# But even those can be set explicitly
$stache.logger.routines{$_} = &die for <Warn Error Fatal>;
$stache.render: '{{missing}}', {}; # diesmethod log
multi method log(Exception $exception, LogLevel :$level)multi method log(LogLevel :$level, *@msgs)
Emit a message at $level (Info by default).
Extra features
Template inheritence
Support for hogan.js-style template inheritence is available.
Pragma: KEEP-UNUSED-VARIABLES
Specify :pragma<KEEP-UNUSED-VARIABLES> to either Template::Mustache.new or .render, and any variables which are not defined in the data context will be kept in the rendered text. See t/13-pragmas.t for examples.
More Examples and Tests
The Mustache spec provides a wealth of examples to demonstrate exactly how the format behaves.
https://github.com/mustache/spec/tree/master/specs/
All of the official Mustache spec tests pass. A copy of the tests is distributed in t/specs.
To check against the official specs repository, clone it into ../mustache-spec:
git clone --depth=1 https://github.com/mustache/spec.git ../mustache-spec
prove -v -e 'raku -Ilib' t/Extra Specifications
The test file t/specs/inheritable_partials.json is taken from groue/GRMustache.
Other Mustache Implementations
There are many, many Mustache implementations in various languages. Some of note are:
The original Ruby version https://github.com/defunkt/mustache
Twitter's hogan.js https://github.com/twitter/hogan.js
mustache.java https://github.com/spullara/mustache.java
GRMustache (Objective C) https://github.com/groue/GRMustache
mustache.php https://github.com/bobthecow/mustache.php
TODO
full object support (with method calls; currently the object is just stringified)
global helpers (context items that float at the top of the stack)
database loader
pragmas (FILTERS?)
AUTHORS
Tim Smith
Tim Siegel
Source can be located at: https://github.com/raku-community-modules/Template-Mustache . Comments and Pull Requests are welcome.
COPYRIGHT AND LICENSE
Copyright 2014 - 2020 Tim Siegel
Copyright 2021 - 2022 Tim Smith
Copyright 2025 Raku Community
This library is free software; you can redistribute it and/or modify it under the Artistic License 2.0.