bbmustache
Binary pattern match Based Mustache template engine for Erlang/OTP.
Overview
- Binary pattern match based mustache template engine for Erlang/OTP.
- Do not use a regular expression !!
- Support maps and associative arrays.
What is Mustach ?
A logic-less templates.
Usage
Quick start
$ git clone git://github.com/soranoba/bbmustache.git
$ cd bbmustache
$ make start
Erlang/OTP 17 [erts-6.3] [source-f9282c6] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:true]
Eshell V6.3 (abort with ^G)
1> {ok,[bbmustache]}
1> bbmustache:render(<<"{{name}}">>, #{"name" => "hoge"}).
<<"hoge">>
2> bbmustache:render(<<"{{name}}">>, [{"name", "hoge"}]).
<<"hoge">>
Use as a library
Add the following settings.
%% rebar (rebar.config)
{deps,
[
{bbmustache, ".*", {git, "git://github.com/soranoba/bbmustache.git", {branch, "master"}}}
]}.
%% rebar3 (rebar.config)
{deps, [bbmustache]}.
If you don't use the rebar and use the OTP17 or later, this library should be compile with -Dnamespaced_types.
How to use simple Mustache
Map (R17 or later)
1> bbmustache:render(<<"{{name}}">>, #{"name" => "hoge"}).
<<"hoge">>
2> Template1 = bbmustache:parse_binary(<<"{{name}}">>).
...
3> bbmustache:compile(Template1, #{"name" => "hoge"}).
<<"hoge">>
4> Template2 = bbmustache:parse_file(<<"./hoge.mustache">>).
...
5> bbmustache:compile(Template2, #{"name" => "hoge"}).
<<"hoge">>
Associative array
1> bbmustache:render(<<"{{name}}">>, [{"name", "hoge"}]).
<<"hoge">>
2> Template1 = bbmustache:parse_binary(<<"{{name}}">>).
...
3> bbmustache:compile(Template1, [{"name", "hoge"}]).
<<"hoge">>
4> Template2 = bbmustache:parse_file(<<"./hoge.mustache">>).
...
5> bbmustache:compile(Template2, [{"name", "hoge"}]).
<<"hoge">>
Undocumented function
Although present in many of the implementation, there is a function that does not exist in the document of the mustache.
The bbmustache corresponds as much as possible to it.
Render plain lists
If you specify the dot as a key, it points to this function.
%% template.mustache
{{#mylist}}
escape
{{.}}
unescape
{{{.}}}
{{/mylist}}
%% script
1> bbmustache:compile(bbmustache:parse_file("template.mustache"), #{"mylist" => ["<b>1</b>", "<b>2</b>", "<b>3</b>"]}).
<<" escape\n <b>1</b>\n unescape\n <b>1</b>\n escape\n <b>2</b>\n unescape\n "...>>
%% result
escape
<b>1</b>
unescape
<b>1</b>
escape
<b>2</b>
unescape
<b>2</b>
escape
<b>3</b>
unescape
<b>3</b>
However, the types of correspond is only these.
The behavior when given the other types, it is undefined.
[integer() | float() | binary() | string() | atom()]
More information
Please refer to the documentation for how to use the mustache as the need arises.bbmustache supports all of the syntax that is described in it.
If you want more information regarding the use of bbmustache, please see the bbmustache's document.
FAQ
Avoid http escaping
%% please use {{{tag}}}
1> bbmustache:render(<<"<h1>{{{tag}}}</h1>">>, #{"tag" => "I like Erlang & mustache"}).
<<"<h1>I like Erlang & mustache</h1>">>
Want to use symbol of tag
1> bbmustache:render(<<"{{=<< >>=}} <<tag>>, <<={{ }}=>> {{tag}}">>, #{"tag" => "hi"}).
<<" hi, hi">>
Want to change the type of the key
1> bbmustache:render(<<"{{tag}}">>, #{tag => "hi"}, [{key_type, atom}]).
<<"hi">>
Attention
- Lambda expression is included wasted processing.
- Because it is optimized to
parse_string/1+compile/2.
Simple Benchmark
| moyombo/mustache.erl | soranoba/bbmustache | |
|---|---|---|
| score (time) | 1016414 | 33001 |
In this case, it is 30 times faster than moyombo/mustache.erl
Contribute
Pull request is welcome =D