Minimal templating with {{mustaches}} in JavaScript

Overview

mustache.js - Logic-less {{mustache}} templates with JavaScript

What could be more logical awesome than no logic at all?

Build Status

mustache.js is a zero-dependency implementation of the mustache template system in JavaScript.

Mustache is a logic-less template syntax. It can be used for HTML, config files, source code - anything. It works by expanding tags in a template using values provided in a hash or object.

We call it "logic-less" because there are no if statements, else clauses, or for loops. Instead there are only tags. Some tags are replaced with a value, some nothing, and others a series of values.

For a language-agnostic overview of mustache's template syntax, see the mustache(5) manpage.

Where to use mustache.js?

You can use mustache.js to render mustache templates anywhere you can use JavaScript. This includes web browsers, server-side environments such as Node.js, and CouchDB views.

mustache.js ships with support for the CommonJS module API, the Asynchronous Module Definition API (AMD) and ECMAScript modules.

In addition to being a package to be used programmatically, you can use it as a command line tool.

And this will be your templates after you use Mustache:

'stache

Install

You can get Mustache via npm.

$ npm install mustache --save

Usage

Below is a quick example how to use mustache.js:

var view = {
  title: "Joe",
  calc: function () {
    return 2 + 4;
  }
};

var output = Mustache.render("{{title}} spends {{calc}}", view);

In this example, the Mustache.render function takes two parameters: 1) the mustache template and 2) a view object that contains the data and code needed to render the template.

Templates

A mustache template is a string that contains any number of mustache tags. Tags are indicated by the double mustaches that surround them. {{person}} is a tag, as is {{#person}}. In both examples we refer to person as the tag's key. There are several types of tags available in mustache.js, described below.

There are several techniques that can be used to load templates and hand them to mustache.js, here are two of them:

Include Templates

If you need a template for a dynamic part in a static website, you can consider including the template in the static HTML file to avoid loading templates separately. Here's a small example:

// file: render.js

function renderHello() {
  var template = document.getElementById('template').innerHTML;
  var rendered = Mustache.render(template, { name: 'Luke' });
  document.getElementById('target').innerHTML = rendered;
}
<html>
  <body onload="renderHello()">
    <div id="target">Loading...</div>
    <script id="template" type="x-tmpl-mustache">
      Hello {{ name }}!
    </script>

    <script src="https://unpkg.com/mustache@latest"></script>
    <script src="render.js"></script>
  </body>
</html>

Load External Templates

If your templates reside in individual files, you can load them asynchronously and render them when they arrive. Another example using fetch:

function renderHello() {
  fetch('template.mustache')
    .then((response) => response.text())
    .then((template) => {
      var rendered = Mustache.render(template, { name: 'Luke' });
      document.getElementById('target').innerHTML = rendered;    
    });
}

Variables

The most basic tag type is a simple variable. A {{name}} tag renders the value of the name key in the current context. If there is no such key, nothing is rendered.

All variables are HTML-escaped by default. If you want to render unescaped HTML, use the triple mustache: {{{name}}}. You can also use & to unescape a variable.

If you'd like to change HTML-escaping behavior globally (for example, to template non-HTML formats), you can override Mustache's escape function. For example, to disable all escaping: Mustache.escape = function(text) {return text;};.

If you want {{name}} not to be interpreted as a mustache tag, but rather to appear exactly as {{name}} in the output, you must change and then restore the default delimiter. See the Custom Delimiters section for more information.

View:

{
  "name": "Chris",
  "company": "<b>GitHub</b>"
}

Template:

* {{name}}
* {{age}}
* {{company}}
* {{{company}}}
* {{&company}}
{{=<% %>=}}
* {{company}}
<%={{ }}=%>

Output:

* Chris
*
* &lt;b&gt;GitHub&lt;/b&gt;
* <b>GitHub</b>
* <b>GitHub</b>
* {{company}}

JavaScript's dot notation may be used to access keys that are properties of objects in a view.

View:

{
  "name": {
    "first": "Michael",
    "last": "Jackson"
  },
  "age": "RIP"
}

Template:

* {{name.first}} {{name.last}}
* {{age}}

Output:

* Michael Jackson
* RIP

Sections

Sections render blocks of text zero or more times, depending on the value of the key in the current context.

A section begins with a pound and ends with a slash. That is, {{#person}} begins a person section, while {{/person}} ends it. The text between the two tags is referred to as that section's "block".

The behavior of the section is determined by the value of the key.

False Values or Empty Lists

If the person key does not exist, or exists and has a value of null, undefined, false, 0, or NaN, or is an empty string or an empty list, the block will not be rendered.

View:

{
  "person": false
}

Template:

Shown.
{{#person}}
Never shown!
{{/person}}

Output:

Shown.

Non-Empty Lists

If the person key exists and is not null, undefined, or false, and is not an empty list the block will be rendered one or more times.

When the value is a list, the block is rendered once for each item in the list. The context of the block is set to the current item in the list for each iteration. In this way we can loop over collections.

View:

{
  "stooges": [
    { "name": "Moe" },
    { "name": "Larry" },
    { "name": "Curly" }
  ]
}

Template:

{{#stooges}}
<b>{{name}}</b>
{{/stooges}}

Output:

<b>Moe</b>
<b>Larry</b>
<b>Curly</b>

When looping over an array of strings, a . can be used to refer to the current item in the list.

View:

{
  "musketeers": ["Athos", "Aramis", "Porthos", "D'Artagnan"]
}

Template:

{{#musketeers}}
* {{.}}
{{/musketeers}}

Output:

* Athos
* Aramis
* Porthos
* D'Artagnan

If the value of a section variable is a function, it will be called in the context of the current item in the list on each iteration.

View:

{
  "beatles": [
    { "firstName": "John", "lastName": "Lennon" },
    { "firstName": "Paul", "lastName": "McCartney" },
    { "firstName": "George", "lastName": "Harrison" },
    { "firstName": "Ringo", "lastName": "Starr" }
  ],
  "name": function () {
    return this.firstName + " " + this.lastName;
  }
}

Template:

{{#beatles}}
* {{name}}
{{/beatles}}

Output:

* John Lennon
* Paul McCartney
* George Harrison
* Ringo Starr

Functions

If the value of a section key is a function, it is called with the section's literal block of text, un-rendered, as its first argument. The second argument is a special rendering function that uses the current view as its view argument. It is called in the context of the current view object.

View:

{
  "name": "Tater",
  "bold": function () {
    return function (text, render) {
      return "<b>" + render(text) + "</b>";
    }
  }
}

Template:

{{#bold}}Hi {{name}}.{{/bold}}

Output:

<b>Hi Tater.</b>

Inverted Sections

An inverted section opens with {{^section}} instead of {{#section}}. The block of an inverted section is rendered only if the value of that section's tag is null, undefined, false, falsy or an empty list.

View:

{
  "repos": []
}

Template:

{{#repos}}<b>{{name}}</b>{{/repos}}
{{^repos}}No repos :({{/repos}}

Output:

No repos :(

Comments

Comments begin with a bang and are ignored. The following template:

<h1>Today{{! ignore me }}.</h1>

Will render as follows:

<h1>Today.</h1>

Comments may contain newlines.

Partials

Partials begin with a greater than sign, like {{> box}}.

Partials are rendered at runtime (as opposed to compile time), so recursive partials are possible. Just avoid infinite loops.

They also inherit the calling context. Whereas in ERB you may have this:

<%= partial :next_more, :start => start, :size => size %>

Mustache requires only this:

{{> next_more}}

Why? Because the next_more.mustache file will inherit the size and start variables from the calling context. In this way you may want to think of partials as includes, imports, template expansion, nested templates, or subtemplates, even though those aren't literally the case here.

For example, this template and partial:

base.mustache:
<h2>Names</h2>
{{#names}}
  {{> user}}
{{/names}}

user.mustache:
<strong>{{name}}</strong>

Can be thought of as a single, expanded template:

<h2>Names</h2>
{{#names}}
  <strong>{{name}}</strong>
{{/names}}

In mustache.js an object of partials may be passed as the third argument to Mustache.render. The object should be keyed by the name of the partial, and its value should be the partial text.

Mustache.render(template, view, {
  user: userTemplate
});

Custom Delimiters

Custom delimiters can be used in place of {{ and }} by setting the new values in JavaScript or in templates.

Setting in JavaScript

The Mustache.tags property holds an array consisting of the opening and closing tag values. Set custom values by passing a new array of tags to render(), which gets honored over the default values, or by overriding the Mustache.tags property itself:

var customTags = [ '<%', '%>' ];
Pass Value into Render Method
Mustache.render(template, view, {}, customTags);
Override Tags Property
Mustache.tags = customTags;
// Subsequent parse() and render() calls will use customTags

Setting in Templates

Set Delimiter tags start with an equals sign and change the tag delimiters from {{ and }} to custom strings.

Consider the following contrived example:

* {{ default_tags }}
{{=<% %>=}}
* <% erb_style_tags %>
<%={{ }}=%>
* {{ default_tags_again }}

Here we have a list with three items. The first item uses the default tag style, the second uses ERB style as defined by the Set Delimiter tag, and the third returns to the default style after yet another Set Delimiter declaration.

According to ctemplates, this "is useful for languages like TeX, where double-braces may occur in the text and are awkward to use for markup."

Custom delimiters may not contain whitespace or the equals sign.

Pre-parsing and Caching Templates

By default, when mustache.js first parses a template it keeps the full parsed token tree in a cache. The next time it sees that same template it skips the parsing step and renders the template much more quickly. If you'd like, you can do this ahead of time using mustache.parse.

Mustache.parse(template);

// Then, sometime later.
Mustache.render(template, view);

Command line tool

mustache.js is shipped with a Node.js based command line tool. It might be installed as a global tool on your computer to render a mustache template of some kind

$ npm install -g mustache

$ mustache dataView.json myTemplate.mustache > output.html

also supports stdin.

$ cat dataView.json | mustache - myTemplate.mustache > output.html

or as a package.json devDependency in a build process maybe?

$ npm install mustache --save-dev
{
  "scripts": {
    "build": "mustache dataView.json myTemplate.mustache > public/output.html"
  }
}
$ npm run build

The command line tool is basically a wrapper around Mustache.render so you get all the features.

If your templates use partials you should pass paths to partials using -p flag:

$ mustache -p path/to/partial1.mustache -p path/to/partial2.mustache dataView.json myTemplate.mustache

Plugins for JavaScript Libraries

mustache.js may be built specifically for several different client libraries, including the following:

These may be built using Rake and one of the following commands:

$ rake jquery
$ rake mootools
$ rake dojo
$ rake yui3
$ rake qooxdoo

TypeScript

Since the source code of this package is written in JavaScript, we follow the TypeScript publishing docs preferred approach by having type definitions available via @types/mustache.

Testing

In order to run the tests you'll need to install Node.js.

You also need to install the sub module containing Mustache specifications in the project root.

$ git submodule init
$ git submodule update

Install dependencies.

$ npm install

Then run the tests.

$ npm test

The test suite consists of both unit and integration tests. If a template isn't rendering correctly for you, you can make a test for it by doing the following:

  1. Create a template file named mytest.mustache in the test/_files directory. Replace mytest with the name of your test.
  2. Create a corresponding view file named mytest.js in the same directory. This file should contain a JavaScript object literal enclosed in parentheses. See any of the other view files for an example.
  3. Create a file with the expected output in mytest.txt in the same directory.

Then, you can run the test with:

$ TEST=mytest npm run test-render

Browser tests

Browser tests are not included in npm test as they run for too long, although they are ran automatically on Travis when merged into master. Run browser tests locally in any browser:

$ npm run test-browser-local

then point your browser to http://localhost:8080/__zuul

Who uses mustache.js?

An updated list of mustache.js users is kept on the Github wiki. Add yourself or your company if you use mustache.js!

Contributing

mustache.js is a mature project, but it continues to actively invite maintainers. You can help out a high-profile project that is used in a lot of places on the web. No big commitment required, if all you do is review a single Pull Request, you are a maintainer. And a hero.

Your First Contribution

Thanks

mustache.js wouldn't kick ass if it weren't for these fine souls:

  • Chris Wanstrath / defunkt
  • Alexander Lang / langalex
  • Sebastian Cohnen / tisba
  • J Chris Anderson / jchris
  • Tom Robinson / tlrobinson
  • Aaron Quint / quirkey
  • Douglas Crockford
  • Nikita Vasilyev / NV
  • Elise Wood / glytch
  • Damien Mathieu / dmathieu
  • Jakub Kuźma / qoobaa
  • Will Leinweber / will
  • dpree
  • Jason Smith / jhs
  • Aaron Gibralter / agibralter
  • Ross Boucher / boucher
  • Matt Sanford / mzsanford
  • Ben Cherry / bcherry
  • Michael Jackson / mjackson
  • Phillip Johnsen / phillipj
  • David da Silva Contín / dasilvacontin
Comments
  • Resolve #589, and possibly fix other manifestations of this bug

    Resolve #589, and possibly fix other manifestations of this bug

    Resolve #589 Because value is used as an intermediate variable as well as the final return value of lookup, there is a possibility that value is returned even if the hasProperty test fails. In the reported issue, the string's length is stored in value, even though lookupHit is false (because a string has a length property but is not an Object). The outer loop breaks, and value is returned, incorrectly as the string's length. lookup should never return a value where the lookup is not hit, so don't use value as an intermediate variable -- only assign to it when we know that the hasProperty test passes.

    opened by raymond-lam 55
  • Looking up in parent context on foo: null is contrary to RFC

    Looking up in parent context on foo: null is contrary to RFC

    Mustache RFC:

    Variables The most basic tag type is the variable. A {{name}} tag in a basic template will try to find the name key in the current context. If there is no name key, the parent contexts will be checked recursively. If the top context is reached and the name key is still not found, nothing will be rendered.

    But I do have a property in children object and it's value is null (which is false in some way). And I expect nothing to be rendered, but instead mustache.js looks up for a value in parent context and finds it, and shows it. But it's parent's value, not children's. And children has it's own value, and it's null. So according to RFC looking up doesn't need to be done.

    The same thing happens not with only variables {{key}}, but with sections {{#key}}{{/key}} too.

    Bug PR-in-progress 
    opened by Roman600 24
  • What is the purpose of mustache.js?

    What is the purpose of mustache.js?

    Hi!

    I've been trying to help by reviewing pull requests lately and has seen alot of feature requests. Many of these features are not part of the mustache spec, but would clearly be nice to have in many scenarios. It would be of great value if I knew more about the purpose of this project when reviewing and cleaning up these pull requests.

    Should it be strictly mustache spec compliant (and nothing more)? Or are some nice to have features allowed?

    Answering those two questions in the readme with help alot both for contributers and reviewers.

    Needs-Feedback Chore 
    opened by phillipj 22
  • Dot notation for object keys with dots in the name

    Dot notation for object keys with dots in the name

    It would be really handy for me, and maybe others† if this could be supported. A backend database library I use supports this notation so I end up with objects like this:

    {
      abc: { 'something.with.dots': 42 }
    }
    

    I wish I could do something like this in Mustache:

    {{abc.somehting\.with\.dots}}
    

    or

    {{abc[something.with.dots]}}
    

    It's not that hard to work around, but I thought I'd throw it out there.

    † http://stackoverflow.com/questions/14901683/how-do-i-reference-a-field-name-that-contains-a-dot-in-mustache-template

    opened by wprl 22
  • expose mustache.NULL

    expose mustache.NULL

    This is useful to detect null values in format functions without overhead, eg:

    fmt_value = function() {
        return this === Mustache.NULL ? 'null' : this
    }
    
    opened by capr 20
  • Browser tests

    Browser tests

    This is WIP-branch to get the project covered by browser tests, not only V8 via node/iojs. It runs tests with zuul which provides simple local browser testing, aswell as cloud testing on multiple browsers with saucelabs.

    Running tests locally

    $ npm run test-browser-local
    

    Running in the cloud It requires a saucelabs account and ~/.zuulrc config:

    $ npm run test-browser
    

    Issues Atm only context-test.js and parse-test.js are runned. The biggest test suite render-test.js still needs some creating thinking, as it reads test fixtures and expected output from files in test/_files which doesnt work too well in browsers.

    Greatly appreciate any thoughts about this, especially how we'll get render-test.js running in browsers.

    Needs-Feedback 
    opened by phillipj 19
  • ES Module support

    ES Module support

    Hello!

    I was wondering if there is a plan to support an ES module version of Mustache.js? If so i can contribute to it.

    Why? I'm working on the Deno project, and there is a discussion about templating (Deno only supports ES modules). Problem is there is no template renderer at the moment. One idea was to port mustache to Deno, so a port means a different code stream which needs maintainance. Having it directly in mustache would be a benefit for both projects i think. But in the case of mustache it means having a mustache.mjs added to the repo,edit: or change the mustache.js to make it ES module compatible.

    Your thoughts?

    ref: https://github.com/denoland/deno_std/issues/391

    opened by zekth 18
  • Readme Faq - Dot notation

    Readme Faq - Dot notation

    dot notation is now supported. https://github.com/defunkt/mustache/issues/6 - but the FAQ said it doesn't. Confusing :)

    Update: however, will mustache.js support it soon?

    opened by jasontorres 18
  • Custom delimiters on Mustache.parse() not working since 2.3.1

    Custom delimiters on Mustache.parse() not working since 2.3.1

    Since version 2.3.1 custom delimiters apparently don't work anymore for Mustache.parse(). See the following examples:

    • 2.3.0, working, values are inserted: https://codepen.io/mbrodala/pen/vaQPxK
    • 2.3.1: broken, values are not inserted: https://codepen.io/mbrodala/pen/NBEJjX

    This is most likely related to #663 and its fix. Notice that I can restore this by using the newer Mustache.tags = [...] instead: https://codepen.io/mbrodala/pen/QBJoOx

    Can you please have a look at this?

    opened by mbrodala 16
  • Created command line tool

    Created command line tool

    Hey,

    my first shot at a CLI used to render a mustache template with a data view and writes the template into stdout when successfull. Otherwise meaningfull errors into stderr.

    The short story is it enables

    $ mustache myTemplate.mustache dataView.json > output.html
    

    Changes in the readme.md + tests pretty much sums it up.

    Any thoughts?

    opened by phillipj 16
  • Dot notation support renders 0 and boolean false values as

    Dot notation support renders 0 and boolean false values as "true"

    Hi guys,

    Thanks for merging dot notation support. Here is a fix for an issue I found where dot notation pointing to an integer zero or a boolean false value render as "true".

    In addition to the fix, I updated the dot_notation tests and removed the tab characters added by johnnypez's dot_notation contribution (...wouldn't have changed whitespace except that the only tabs I found were added by the dot_notation merge).

    Thanks,

    Brandon

    opened by brandonpayton 16
  • Getting Error ``ts(1261)``

    Getting Error ``ts(1261)``

    I am getting this error in VSCode when importing Mustache:

    Already included file name 'c:/.../frontend/node_modules/@types/mustache/index.d.ts' differs from file name 'c:/.../frontend/node_modules/@types/Mustache/index.d.ts' only in casing.
      The file is in the program because:
        Imported via 'mustache' from file 'c:/.../frontend/src/routes/aoi-file-converter.svelte' with packageId '@types/mustache/[email protected]'
        Root file specified for compilationts(1261)
    

    Everything seem to works, but this error is annoying me.

    Untitled

    Any idea how to fix this issue?

    Thanks in advance!

    opened by KiddoV 0
  • How to pass object to function?

    How to pass object to function?

    const data = {
        obj: { name: 'john' },
        func: () => (data, render) => { /* JSON.parse(render(data)) doesn't work here! */ }
    }
    
    <script id="template" type="x-tmpl-mustache">
        <div>{{#func}}{{obj}}{{/func}}</small>
    </script>
    
    opened by dehghani-mehdi 0
  • Does the CLI alow for partials?

    Does the CLI alow for partials?

    Does the library/CLI allow for mustache partials? If so, how? The help gives me:

    $ mustache -h
    Syntax: mustache <view> <template> [output]
    

    And when I try something like

    {{> file.html}} 
    

    hoping file.html gets inlined, nothing is included.

    opened by halloleo 1
  • Section with custom attribute

    Section with custom attribute

    Hi, can we add some custom attribute like WordPress shortcode in section?, for example from this:

    {
      "fontWeight": function () {
        return function (text, render) {
          return '<p style="font-weight: 400">' + render(text) + '</p>';
        }
      }
    }
    
    {{#fontWeight}}
      This text is 700
    {{/fontWeight}}
    

    to be like this:

    {
      "fontWeight": function () {
        return function (text, render, props) {
          return `<p style="font-weight: ${props.size}">` + render(text) + '</p>';
        }
      }
    }
    
    {{#fontWeight[size=700]}}
      This text is 700
    {{/fontWeight}}
    

    is it possible?

    opened by ngocducdim 0
  • How to invoke methods of variables in template string.

    How to invoke methods of variables in template string.

    Hi, I have the following code and I want to make this work like template literals. But it does not support invoke methods of variables in template string.

    const mustache = require('mustache');
    
    function test() {
        const obj = {
            a: 123,
            b: "HELLO",
            c: true
        }
        // this does not work as expected, rendered as "--true" not "1111011-hello-true"
        // const exp = "${a.toString(2)}-${b.toLowerCase()}-${c}" 
        const exp = "${a}-${b}-${c}" // this works, rendered as "123-hello-true"
        mustache.tags = ['${', '}'];
        const result = mustache.render(exp, obj, );
        console.info(`${exp} = ${result}`)
    }
    test()
    
    opened by liudonghua123 1
  • How to Render Fixed Length String?

    How to Render Fixed Length String?

    Suppose I have a template:

    [PartList]
    RefID.            P/N                                       XPos        YPos       Rtn       Pkg                                       Extension
    {{#data}}
    {{refID}}         {{partNumber}}                            {{xPos}}    {{yPos}}   {{rotn}}  {{packageName}}                           ----
    {{/data}}
    [PartListEnd]
    

    In JS:

    var output = Mustache.render(templateAbove, {
        data: [{
            refID: "A1",
            partNumber: "12345678L",
            xPos: "1080.00",
            yPos: "80.00",
            rotn: 90,
            packageName: "TEST_PKG"
        }, {
            refID: "A10",
            partNumber: "12345678L",
            xPos: "1080.00",
            yPos: "80.00",
            rotn: 90,
            packageName: "TEST_PKG"
        }]
    });
    

    Right now it would render:

    [PartList]
    RefID.            P/N                                       XPos        YPos       Rtn       Pkg                                       Extension
    A1         12345678L                            1080.00    80.00   90  TEST_PKG                           ----
    A10         12345678L                            1080.00    80.00   90  TEST_PKG                           ----
    [PartListEnd]
    

    How do I make it align in columns like this?

    [PartList]
    RefID.            P/N                                       XPos        YPos       Rtn       Pkg                                       Extension
    A1                12345678L                                 1080.00     80.00      90        TEST_PKG                                  ----
    A10               12345678L                                 1080.00     80.00      90        TEST_PKG                                  ----
    [PartListEnd]
    

    In other words, how do I make each value in the object display as a fixed length string? Thanks in advance!

    opened by KiddoV 0
Releases(v4.2.0)
  • v4.2.0(Mar 28, 2021)

  • v3.1.0(Sep 13, 2019)

  • v3.0.2(Aug 21, 2019)

    Fixed

    • #705: Fix indentation of partials, by @kevindew and @yotammadem.

    Dev

    • #701: Fix test failure for Node 10 and above, by @andersk.
    • #704: Lint all test files just like the source files, by @phillipj.
    • Start experimenting & comparing GitHub Actions vs Travis CI, by @phillipj.
    Source code(tar.gz)
    Source code(zip)
  • v3.0.1(Nov 11, 2018)

  • v3.0.0(Sep 16, 2018)

    3.0.0 / 16 September 2018

    We are very happy to announce a new major version of mustache.js. We want to be very careful not to break projects out in the wild, and adhering to Semantic Versioning we have therefore cut this new major version.

    The changes introduced will likely not require any actions for most using projects. The things to look out for that might cause unexpected rendering results are described in the migration guide below.

    A big shout out and thanks to @raymond-lam for this release! Without his contributions with code and issue triaging, this release would never have happened.

    Major

    • #618: Allow rendering properties of primitive types that are not objects, by @raymond-lam.
    • #643: Writer.prototype.parse to cache by tags in addition to template string, by @raymond-lam.
    • #664: Fix Writer.prototype.parse cache, by @seminaoki.

    Minor

    Migrating from mustache.js v2.x to v3.x

    Rendering properties of primitive types

    We have ensured properties of primitive types can be rendered at all times. That means Array.length, String.length and similar. A corner case where this could cause unexpected output follows:

    View:

    {
      stooges: [
        { name: "Moe" },
        { name: "Larry" },
        { name: "Curly" }
      ]
    }
    

    Template:

    {{#stooges}}
      {{name}}: {{name.length}} characters
    {{/stooges}}
    

    Output with v3.0:

      Moe: 3 characters
      Larry: 5 characters
      Curly: 5 characters
    

    Output with v2.x:

      Moe:  characters
      Larry:  characters
      Curly:  characters
    

    Caching for templates with custom delimiters

    We have improved the templates cache to ensure custom delimiters are taken into consideration for the cache. This improvement might cause unexpected rendering behaviour for using projects actively using the custom delimiters functionality.

    Previously it was possible to use Mustache.parse() as a means to set global custom delimiters. If custom delimiters were provided as an argument, it would affect all following calls to Mustache.render(). Consider the following:

    const template = "[[item.title]] [[item.value]]";
    mustache.parse(template, ["[[", "]]"]);
    
    console.log(
      mustache.render(template, {
        item: {
          title: "TEST",
          value: 1
        }
      })
    );
    
    >> TEST 1
    

    The above illustrates the fact that Mustache.parse() made mustache.js cache the template without considering the custom delimiters provided. This is no longer true.

    We no longer encourage using Mustache.parse() for this purpose, but have rather added a fourth argument to Mustache.render() letting you provide custom delimiters when rendering.

    If you still need the pre-parse the template and use custom delimiters at the same time, ensure to provide the custom delimiters as argument to Mustache.render() as well.

    Source code(tar.gz)
    Source code(zip)
  • v2.3.2(Aug 17, 2018)

  • v2.3.1(Aug 7, 2018)

  • v2.3.0(Nov 8, 2016)

    Minor

    Dev

    Docs

    • #542: Add API documentation to README, by @tomekwi.
    • #546: Add missing syntax highlighting to README code blocks, by @pra85.
    • #569: Update Ctemplate links in README, by @mortonfox.
    • #592: Change "loadUser" to "loadUser()" in README, by @Flaque.
    • #593: Adding doctype to HTML code example in README, by @calvinf.

    Dependencies

    • eslint -> 2.2.0. Breaking changes fix by @phillipj. #548
    • eslint -> 2.5.1.
    • mocha -> 3.0.2.
    • zuul -> 3.11.0.

    Thanks to all the people that contributed to this release! Be it issues, comments, changes.. you are awesome! 🎉 😄

    PS: Hope you enjoy the new changelog format! I wanted it to group information in a more useful way, and link to PRs for easy diff viewing. :shipit:

    Source code(tar.gz)
    Source code(zip)
  • v2.2.1(Dec 13, 2015)

    Fixes

    • Improve HTML escaping, by @phillipj.
    • Fix inconsistency in defining global mustache object, by @simast.
    • Fix switch-case indent error, by @norfish.
    • Unpin chai and eslint versions, by @dasilvacontin.
    • Update README.md with proper grammar, by @EvanLovely.
    • Update mjackson username in README, by @mjackson.
    • Remove syntax highlighting in README code sample, by @imagentleman.
    • Fix typo in README, by @Xcrucifier.
    • Fix link typo in README, by @keirog.
    Source code(tar.gz)
    Source code(zip)
  • v2.2.0(Oct 15, 2015)

    Added

    • Add Partials support to CLI, by @palkan.

    Changed

    • Move install instructions to README's top, by @mateusortiz
    • Improved devhook install output, by @ShashankaNataraj.
    • Clarifies and improves language in documentation, by @jfmercer.
    • Linting CLI tool, by @phillipj.
    • npm 2.x and node v4 on Travis, by @phillipj.

    Fixes

    • Fix README spelling error to "aforementioned", by @djchie.
    • Equal error message test in .render() for server and browser, by @phillipj.

    Dependencies

    • chai -> 3.3.0
    • eslint -> 1.6.0
    Source code(tar.gz)
    Source code(zip)
  • v2.1.3(Jul 23, 2015)

  • v2.1.2(Jun 17, 2015)

  • v2.1.1(Jun 11, 2015)

    Added

    • State that we use semver on the change log, by @dasilvacontin.
    • Added version links to change log, by @dasilvacontin.

    Fixed

    • Bugfix for using values from view's context prototype, by @phillipj.
    • Improve test with undefined/null lookup hit using dot notation, by @dasilvacontin.
    • Bugfix for null/undefined lookup hit when using dot notation, by @phillipj.
    • Remove moot version property from bower.json, by @kkirsche.
    • bower.json doesn't require a version bump via hook, by @dasilvacontin.

    Thanks to our awesome contributors! :)

    Source code(tar.gz)
    Source code(zip)
  • v2.1.0(Jun 4, 2015)

    • Added license attribute to package.json, by @pgilad.
    • Minor changes to make mustache.js compatible with both WSH and ASP, by @nagaozen.
    • Improve CLI view parsing error, by @phillipj.
    • Bugfix for view context cache, by @phillipj.

    :shipit:

    Source code(tar.gz)
    Source code(zip)
  • v2.0.0(Mar 27, 2015)

    • Fixed lookup not stopping upon finding undefined or null values, by @dasilvacontin.
    • Refactored pre-commit hook, by @dasilvacontin.

    I'm very happy to see the project moving forward, thanks to all the people who've helped along! It wouldn't be the same :)

    Source code(tar.gz)
    Source code(zip)
  • v1.1.0(Feb 18, 2015)

    • Refactor Writer.renderTokens() for better readability, by @phillipj.
    • Cleanup tests section in readme, by @phillipj.
    • Added JSHint to tests/CI, by @phillipj.
    • Added node v0.12 on travis, by @phillipj.
    • Created command line tool, by @phillipj.
    • Added falsy to Inverted Sections description in README, by @kristijanmatic.
    Source code(tar.gz)
    Source code(zip)
Owner
Jan Lehnardt
Makes @couchdb & #offlinefirst. Made @jsconfeu @greenkeeperio @hoodiehq. CEO at @neighbourh00die. Dissatisfied with the status-quo.
Jan Lehnardt
1KB lightweight, fast & powerful JavaScript templating engine with zero dependencies. Compatible with server-side environments like node.js, module loaders like RequireJS and all web browsers.

JavaScript Templates Contents Demo Description Usage Client-side Server-side Requirements API tmpl() function Templates cache Output encoding Local he

Sebastian Tschan 1.7k Jan 3, 2023
A tiny javascript templating framework in ~400 bytes gzipped

t.js A tiny javascript templating framework in ~400 bytes gzipped t.js is a simple solution to interpolating values in an html string for insertion in

Jason Mooberry 823 Dec 29, 2022
handlebars.js 8.8 4.4 L3 JavaScript An extension to the Mustache templating language.

Handlebars.js Handlebars provides the power necessary to let you build semantic templates effectively with no frustration. Handlebars is largely compa

The Handlebars Templating Language 16.9k Jan 5, 2023
Asynchronous Javascript templating for the browser and server

Dust.js Asynchronous Javascript templating for the browser and server. This fork is maintained by LinkedIn. Install NPM Important: We recommend that y

LinkedIn 2.9k Dec 31, 2022
handlebars.js - An extension to the Mustache templating language.

Handlebars.js Handlebars provides the power necessary to let you build semantic templates effectively with no frustration. Handlebars is largely compa

The Handlebars Templating Language 16.9k Jan 5, 2023
A compiler for the Mustache templating language

Hogan.js - A mustache compiler. Hogan.js is a compiler for the Mustache templating language. For information on Mustache, see the manpage and the spec

Twitter 5.1k Jan 2, 2023
A powerful templating engine with inheritance, asynchronous control, and more (jinja2 inspired)

Nunjucks Nunjucks is a full featured templating engine for javascript. It is heavily inspired by jinja2. View the docs here. Installation npm install

Mozilla 8k Dec 30, 2022
The fastest + concise javascript template engine for nodejs and browsers. Partials, custom delimiters and more.

doT Created in search of the fastest and concise JavaScript templating function with emphasis on performance under V8 and nodejs. It shows great perfo

Laura Doktorova 4.9k Dec 31, 2022
Embedded JavaScript templates -- http://ejs.co

Embedded JavaScript templates Installation $ npm install ejs Features Control flow with <% %> Escaped output with <%= %> (escape function configurable

Matthew Eernisse 6.8k Dec 30, 2022
Take a swig of the best template engine for JavaScript.

NOT MAINTAINED Fork and use at your own risk. Swig Swig is an awesome, Django/Jinja-like template engine for node.js. Features Available for node.js a

Paul Armstrong 3.1k Jan 4, 2023
HTML Framework that allows you not to write JavaScript code.

EHTML (or Extended HTML) can be described as a set of custom elements that you can put on HTML page for different purposes and use cases. The main ide

Guseyn Ismayylov 172 Dec 22, 2022
A helper to send whatsapp without scheduling a contact, the project developed using TDD with Jest, Javascript classes, BotstrapVue and SweetAlert.

Project setup npm install Compiles and hot-reloads for development npm run serve Compiles and minifies for production npm run build Lints and fixes

Magascript 7 Sep 13, 2022
Variation-template - Variation is a PSD template that is covered into a web template using HTML5, CSS3, Bootstrapv4.6, JavaScript.

Variation Template Design Variation is a PSD website template. In this project this template is designed with HTML. Deployment This site is deployed a

Bipronath Saha 1 Jan 1, 2022
Asynchronous Javascript templating for the browser and server

Dust.js Asynchronous Javascript templating for the browser and server. This fork is maintained by LinkedIn. Install NPM Important: We recommend that y

LinkedIn 2.9k Dec 31, 2022
1KB lightweight, fast & powerful JavaScript templating engine with zero dependencies. Compatible with server-side environments like node.js, module loaders like RequireJS and all web browsers.

JavaScript Templates Contents Demo Description Usage Client-side Server-side Requirements API tmpl() function Templates cache Output encoding Local he

Sebastian Tschan 1.7k Jan 3, 2023
A tiny javascript templating framework in ~400 bytes gzipped

t.js A tiny javascript templating framework in ~400 bytes gzipped t.js is a simple solution to interpolating values in an html string for insertion in

Jason Mooberry 823 Dec 29, 2022
handlebars.js 8.8 4.4 L3 JavaScript An extension to the Mustache templating language.

Handlebars.js Handlebars provides the power necessary to let you build semantic templates effectively with no frustration. Handlebars is largely compa

The Handlebars Templating Language 16.9k Jan 5, 2023
Asynchronous Javascript templating for the browser and server

Dust.js Asynchronous Javascript templating for the browser and server. This fork is maintained by LinkedIn. Install NPM Important: We recommend that y

LinkedIn 2.9k Dec 31, 2022
High performance JavaScript templating engine

art-template English document | 中文文档 art-template is a simple and superfast templating engine that optimizes template rendering speed by scope pre-dec

糖饼 9.7k Jan 3, 2023
handlebars.js - An extension to the Mustache templating language.

Handlebars.js Handlebars provides the power necessary to let you build semantic templates effectively with no frustration. Handlebars is largely compa

The Handlebars Templating Language 16.9k Jan 5, 2023