liquid-node

Node.js port of Tobias Lütke's Liquid template engine.

Liquid with Node.js


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(reqres) {
  engine
    .parseAndRender("hi {{name}}", { name: "tobi" })
    .nodeify(function(errresult) {
      if (err) {
        res.end("ERROR: " + err);
      } else {
        res.end(result);
      }
    });
});
engine.registerFilters({
  myFilterfunction(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

LiquidNode is released under the MIT license.