Mustache (template system)
Mustache is a web template system with implementations available for ActionScript, C++, Clojure, CoffeeScript, ColdFusion, Common Lisp, Crystal, D, Dart, Delphi, Elixir, Erlang, Fantom, Go, Haskell, Io, Java, JavaScript, Julia, Lua, .NET, Objective-C, OCaml, Perl, PHP, Pharo, Python, R, Racket, Raku, Ruby, Rust, Scala, Smalltalk, Swift, Tcl, CFEngine, and XQuery.
Original author(s) | Justin Hileman, Bruno Sutic, Chris Wanstrath, Ricardo Mendes, Bruno Michel |
---|---|
Initial release | 2009 |
Stable release | 4.2.0
/ March 28, 2021 |
Repository | |
Type | Web template system |
License | MIT |
Website | mustache |
Mustache is described as a logic-less system because it lacks any explicit control flow statements, like if
and else
conditionals or for loops; however, both looping and conditional evaluation can be achieved using section tags processing lists and anonymous functions (lambdas).
It is named "Mustache" because of heavy use of braces, { }
, that resemble a sideways moustache.
Mustache is used mainly for mobile and web applications.[1][2]
History and principles
Mustache-1 was inspired by ctemplate and et,[3] and began as a GitHub distribution at the end of 2009. A first version of the template engine was implemented with Ruby, running YAML template texts. The (preserved) main principles were:
- Logic-less: no explicit control flow statements, all control driven by data.
- Strong separation of concerns: logic from presentation: it is impossible to embed application logic in the templates.
The input data can be a class so that input data can be characterized as an model–view–controller (MVC) view. The Mustache template does nothing but reference methods in the (input data) view.[3] All the logic, decisions, and code is contained in this view, and all the markup (ex. output XML) is contained in the template. In an model–view–presenter (MVP) context: input data is from MVP-presenter, and the Mustache template is the MVP-view.
Examples
The simplest template:
Template with section tag:
Here, when x
is a Boolean value then the section tag acts like an if conditional, but when x
is an array then it acts like a foreach loop.
Template that is un-escaped:
Here, if body
contains HTML, it won't be escaped.
Technical details
Syntax highlighting is available in Atom, Coda, Emacs,[4] TextMate, Vim and Visual Studio Code.[5]
The Mustache templates support is built into many web application frameworks (ex. CakePHP). The support in JavaScript includes both client-side programming with many JavaScript libraries and Ajax frameworks such as jQuery, Dojo and YUI, as well as server-side JavaScript using Node.js and CommonJS.
Specification and implementations
There are many Mustache Engine implementations available, and all of them meet a common formal specification (see external links), that for final users results in the common syntax.
As of March 2011, the last SPEC_VERSION was 1.1.2.[6]
All Mustache Engines, in the v1.X architecture, have a render method, a Mustache_Compiler class and a Parser class.
Variations and derivatives
Mustache inspired numerous JavaScript template libraries which forked from the original simplicity to add certain functionality or use.
Handlebars
Handlebars.js[7] is self-described as:
Handlebars.js is an extension to the Mustache templating language created by Chris Wanstrath. Handlebars.js and Mustache are both logicless templating languages that keep the view and the code separated like we all know they should be.[8]
Handlebars differs from its predecessor in that, within Block Expressions (similar to sections in Mustache), Helpers allow custom function through explicit user-written code for that block.
See also
References
- Avola, G.; Raasch, J. (2012). Smashing Mobile Web Development. ISBN 9781118348123.
- Cady, J. (2011). Functional Programming Applied to Web Development Templates: MS Project Report (PDF) (Report).
- "Mustache". GitHub. 19 April 2022.
- "Home". web-mode.org.
- "Mustache - Visual Studio Marketplace". Visualstudio.com. Microsoft. August 18, 2019.
- "Changes". Mustache. GitHub. March 20, 2011.
- Katz, Yehuda (2011–2019). "Handlebars: Minimal templating on steroids". Handlebarsjs.com.
- wykatz, NPM. "html+handlebars NPM". html+handlebars NPM package details. Node Package Manager. Retrieved 20 December 2016.