Mustache templates

A Dart library to parse and render mustache templates.

Build Status

Example

	import 'package:mustache/mustache.dart' as mustache;

	main() {
		var source = '{{#names}}<div>{{lastname}}, {{firstname}}</div>{{/names}}';
		var template = mustache.parse(source);
		var output = template.renderString({'names': [
			{'firstname': 'Greg', 'lastname': 'Lowe'},
			{'firstname': 'Bob', 'lastname': 'Johnson'}
		]});
		print(output);
	}

API


abstract class Template { Template(String source, {bool lenient : false, bool htmlEscapeValues : true, String name, PartialResolver partialResolver}); String renderString(values); void render(values, StringSink sink); }

Once a template has been created it can be rendered any number of times.

Both parsing and render throw a TemplateException if there is a problem with the template or rendering the values.

When lenient mode is enabled tag names may use any characters, otherwise only a-z, A-Z, 0-9, underscore and minus. Lenient mode will also silently ignore nulls passed as values.

By default all variables are html escaped, this behaviour can be changed by passing htmlEscapeValues : false.

Supported

 Variables             {{var-name}}
 Sections              {{#section}}Blah{{/section}}
 Inverse sections      {{^section}}Blah{{/section}}
 Comments              {{! Not output. }}
 Unescaped variables   {{{var-name}}} and {{&var-name}}
 Partials
 Lambdas

See the mustache templates tutorial for more information.

Passing all mustache specification tests for interpolation, sections, inverted, comments.

Lambdas are implemented differently from the specification. In this implementation, a lambda is provided with a String containing the rendered body of the template, and the output of the lambda is not re-interpolated. However this is sufficient for common use cases such as:

new Template('{{# foo }}oi{{/ foo }}')
     .renderString({'foo': (s) => '<b>${s.toUpperCase()}</b>'}); // <b>OI</b>

To do

Implement auto-indenting for partials
Set Delimiter tags