LiquidNode is a port of the original Liquid template engine from Ruby to Node.js. It uses Promises to support non-blocking/asynchronous variables, filters, and blocks.
- Supports asynchronous variables, tags, functions and filters (helpers)
- Allows you to add custom tags and filters easily
- Uses bluebird for super-fast Promises/A+
- Supports full liquid syntax
- Based on original Ruby code
- Written in CoffeeScript
- High test coverage
<ul id="products">
{% for product in products %}
<li>
<h2>{{ product.name }}</h2>
Only {{ product.price | price }}
{{ product.description | prettyprint | paragraph }}
</li>
{% endfor %}
</ul>
npm install liquid-node --save
Liquid supports a very simple API based around the Liquid.Engine class. For standard use you can just pass it the content of a file and call render with an object.
Liquid = require("liquid-node")
var engine = new Liquid.Engine
engine
.parse("hi {{name}}")
.then(function(template) { return template.render({ name: "tobi" }); })
.then(function(result) { console.log(result) });
// or
engine
.parseAndRender("hi {{name}}", { name: "tobi" })
.then(function(result) { console.log(result) });
app.get(function(req, res) {
engine
.parseAndRender("hi {{name}}", { name: "tobi" })
.nodeify(function(err, result) {
if (err) {
res.end("ERROR: " + err);
} else {
res.end(result);
}
});
});
engine.registerFilters({
myFilter: function(input) {
return String(input).toUpperCase()
}
});
Since the code is based on the Ruby implementation we use CoffeeScript's class
which is a little bit difficult to write in pure JavaScript.
Take a look at the existing tags
to see how to implement them.
class MyTag extends Liquid.Tag
render: ->
"that's me!"
engine.registerTag "MyTag", MyTag
npm test
- darthapo's Liquid.js is liquid ported to JavaScript to be run within the browser. It doesn't handle asynchrony.
- tchype's Liquid.js is
liquid-node
wrapped to run in a browser.
LiquidNode is released under the MIT license.