Need help with bbmustache?
Click the “chat” button below for chat support from the developer who created it, or find similar developers for support.

About the developer

soranoba
154 Stars 44 Forks MIT License 199 Commits 0 Opened issues

Description

Binary pattern match Based Mustache template engine for Erlang/OTP.

Services available

!
?

Need anything else?

Contributors list

# 79,483
Erlang
Shell
swift-f...
Objecti...
142 commits
# 77,049
Erlang
erlang-...
gRPC
compile
8 commits
# 275,195
PHP
Shell
mustach...
Erlang
3 commits
# 98,863
Elixir
Erlang
Haskell
supervi...
2 commits
# 719,010
mustach...
Erlang
templat...
1 commit

bbmustache

CircleCI hex.pm version

Binary pattern match Based Mustache template engine for Erlang/OTP.

Overview

  • Binary pattern match based mustache template engine for Erlang/OTP.
    • It means do not use regular expressions.
  • Support maps and associative arrays.
  • Officially support is OTP17 or later.

What is Mustache ?

A logic-less templates. - {{mustache}}

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> bbmustache:render(<>, #{"name" => "hoge"}). <> 2> bbmustache:render(<>, [{"name", "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]}.

How to use simple Mustache

Map ```erlang 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 ```erlang 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">> ```

Use as a command-line tool

make escriptize
echo '{"name", "hoge"}.' > vars.config
echo '{{name}}' > template.mustache
./bbmustache -d vars.config template.mustache
hoge

Data files (-d) support a single assoc list, a single map, and consult format.
Note: the behind term has a high priority in all cases. it is a result of supporting to allow for embedding relative file paths as in config.

More information

  • For the alias of mustache, Please refer to ManPage and Specification
  • For the options of this library, please see doc
  • For the functions supported by this library, please see here

FAQ

Avoid http escaping

%% Please use `{{{tag}}}`
1> bbmustache:render(<{{{title}}}">>, #{"title" => "I like Erlang & mustache"}).
<I like Erlang & mustache">>

%% If you should not want to use {{{tag}}}, escape_fun can be use. 1> bbmustache:render(<{{title}}">>, #{"title" => "I like Erlang & mustache"}, [{escape_fun, fun(X) -> X end}]). <I like Erlang & mustache">>

Already used
{
and
}
for other uses (like escript)

1> io:format(bbmustache:render(< {{=<< >>=}}
1> {deps, [
1>   <>
1>   {<>, \"<>\"}<>,<>
1>   <>
1> ]}.
1> ">>, #{"deps" => [
1>   #{"name" => "bbmustache", "version" => "1.6.0"},
1>   #{"name" => "jsone", "version" => "1.4.6", "last?" => true}
1> ]})).

{deps, [ {bbmustache, "1.6.0"}, {jsone, "1.4.6"} ]}. ok

Want to use something other than string for key

1> bbmustache:render(<{{{title}}}">>, #{title => "I like Erlang & mustache"}, [{key_type, atom}]).
<I like Erlang & mustache">>

2> bbmustache:render(<{{{title}}}">>, #{<> => "I like Erlang & mustache"}, [{key_type, binary}]). <I like Erlang & mustache">>

Want to provide a custom serializer for Erlang Terms

1> bbmustache:render(<{{title}}">>, #{title => "I like Erlang & mustache"}, [{key_type, atom}, {value_serializer, fun(X) -> X end}]).
<I like Erlang & mustache">>

2> bbmustache:render(<{{{title}}}">>, #{<> => "I like Erlang & mustache"}, [{key_type, binary}, {value_serializer, fun(X) -> <> end}]). <replaced">>

3> bbmustache:render(<{{{title}}}">>, #{<> => #{<> => <>}}, [{key_type, binary}, {value_serializer, fun(X) -> jsone:encode(X) end}]). <{"nested": "value"}">>

4> bbmustache:render(<{{title}}">>, #{<> => #{<> => <>}}, [{key_type, binary}, {value_serializer, fun(X) -> jsone:encode(X) end}]). <{"nested":"value"}">>

Attention

  • Lambda expression is included wasted processing.
    • Because it is optimized to
      parse_binary/1
      +
      compile/2
      .

Comparison with other libraries

Benchmarks and check the reference implementation

Contribute

Pull request is welcome =D

License

MIT License

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.