Why MiniHandlebars?
* ~82% faster than the official library compiling from markup to html on chrome/v8
* 93.72% smaller file with just 59 lines or 1.1KB minified (639 bytes gzipped)
* a TON more flexible; blocks are just javascript functions that take any number of arguments, and like express/sinatra we make no assumptions about which ones you want.
* NO dependencies
Inspired by
handlebars,
mini-coffeecup,
async2, and
stylus libraries.
NOTICE:
-------
As I was developing mini-handlebars, I had a better idea which became coffee-templates. I will still keep mini-handlebars around for posterity, but no new features are likely to be added.
Quick Example
``coffeescript
this line is only required within node
MiniHandlebars = require 'mini-handlebars'
initialize new engine
handlebars = new MiniHandlebars
locals:
santa_laugh: 'Ho, ho, ho!'
# note that you define all your own blocks;
# they are just functions that take any number of arguments
# but the first two arguments are always the same and required.
each: (template, data, enumerable, key, value) ->
out = ''
for k of data[enumerable]
unless {}.hasOwnProperty data[enumerable], k # optional
_data = MiniHandlebars._extend data[enumerable][k] # optional
_data['this'] = _data['this'] || data[enumerable][k] # optional
typeof key is 'undefined' or _data[key] = k # optional
typeof value is 'undefined' or _data[value] = data[enumerable][k] # optional, you know what you need!
out += handlebars.render template, _data
out
note that blocks and variables can be written
the same; the additional pound (#) is optional.
this is how i cache the templates in js:
handlebars.templates['test'] = '
Hello, {{name}}!
Here are your Christmas lists ({{santa_laugh}}):
{{each children, name}}| {{name}} | {{/each}}
{{each children, name}}| {{each list}}{{/each}} | {{/each}}
'
this will compile html output.
there is no in-between-js-function render stage, and there may never be
both-stages-in-one are already faster than the original lib
and i found the time acceptable for my purposes.
console.log handlebars.render handlebars.templates['test'],
name: 'Giver'
children:
Recipient1:
list: ['ninja turtles mask', 'mario kart legos', 'airplane']
Recipient2:
list: ['something sweet']
``
As usual, for the latest examples, review the easy-to-follow ./test/test.coffee.
Or try it immediately in your browser with codepen.
TODO
----
* add support for triple-stach/escaping utils? i just haven't needed it, yet. its all unescaped by default.
* make it so blocks don't have to take arguments if they don't want to