Can Mustache Templates do template extension? Can Mustache Templates do template extension? javascript javascript

Can Mustache Templates do template extension?


I recently found myself in the same boat, except I came from a mako background.

Mustache does not allow for template extension/inheritance but there are a few options available to you that I know of.

  1. You could use partials:

    {{>header}}    Hello {{name}}{{>footer}}
  2. You could inject template pre-processing functions into the context for each template that needs to inherit from some other page:

    {{#extendBase}}          Hello {{name}}{{/extendBase}} 

    Hash:

    {   "name": "Walden",   "extendBase": function() {       return function(text) {           return "<html><head></head>" + render(text) + "</body></html>"       }   }}
  3. Prepend and append the desired HTML to the relevant pages in your controller.

  4. Have a layout template ala:

    {{>header}}    {{{body}}}{{>footer}}

    And render the body in your controller, passing that to the layout template as a variable named body.

  5. Implement template inheritance, pre-mustache, in your code that loads templates.

I wouldn't, however, use the triple mustache because I don't want unescaped HTML to be appearing anywhere, it's just too risky in my opinion.

If someone else has a better solution to this problem I'd love to hear it as well, since I haven't yet taken the plunge in any one of these directions.


I've proposed this to the specification for Mustache here:

https://github.com/mustache/spec/issues/38

Currently mustache.java, hogan.js and phly_mustache support template inheritance.


You could use variables containing HTML. A "triple mustache" like {{{variable}}} will return unescaped HTML. It's not exactly the same as template extensions, but you could render frontpage-content.html and then put its output in a content variable that gets passed to base.html.

(I added -content to the frontpage.html filename with the expectation that such a naming pattern will help keep the filenames manageable.)