killalau / shopify-liquid

Liquid template engine for Node.js and browser javascript.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

shopify-liquid

NPM version Build Status Coverage Status Dependency manager

A feature-rich Liquid implementation for Node.js, with compliance with Jekyll and Github Pages.

Installation:

npm install --save shopify-liquid

Render from String

Parse and Render:

var Liquid = require('shopify-liquid');
var engine = Liquid();

engine.parseAndRender('{{name | capitalize}}', {name: 'alice'})
    .then(function(html){
        // html === 'Alice'
    });

Caching templates:

var tpl = engine.parse('{{name | capitalize}}');
engine.render(tpl, {name: 'alice'})
    .then(function(html){   
        // html === 'Alice'
    });

Render from File

var engine = Liquid({
    root: path.resolve(__dirname, 'views/'),  // for layouts and partials
    extname: '.liquid',
    cache: false
});
engine.renderFile("hello.liquid", {name: 'alice'})
    .then(function(html){
       // html === 'Alice'
    });
// equivalent to: 
engine.renderFile("hello", {name: 'alice'})
    .then(function(html){
       // html === 'Alice'
    });

cache default to false, extname default to .liquid, root default to "".

Strict Rendering

Undefined filters and variables will be rendered as empty string by default. Enable strict rendering to throw errors upon undefined variables/filters:

var opts = {
    strict_variables: true, 
    strict_filters: true
};
engine.parseAndRender("{{ foo }}", {}, opts).catch(function(err){
    // err.message === undefined variable: foo
});
engine.parseAndRender("{{ 'foo' | filter1 }}", {}, opts).catch(function(err){
    // err.message === undefined filter: filter1
});
// Note: the below opts also work:
// engine.render(tpl, ctx, opts)
// engine.renderFile(path, ctx, opts)

Use with Express.js

// register liquid engine
app.engine('liquid', engine.express({
    strict_variables: true,         // Default: fasle
    strict_filters: true            // Default: false
})); 
app.set('views', './views');            // specify the views directory
app.set('view engine', 'liquid');       // set to default

There's an Express demo here.

Use in Browser

Download the dist files and import into your HTML. And window.Liquid is what you want.

<html lang="en">
<head>
  <script src="dist/liquid.min.js"></script>
</head>
<body>
  <script>
    var engine = window.Liquid();
    var src = '{{ name | capitalize}}';
    var ctx = {
      name: 'welcome to Shopify Liquid'
    };
    engine.parseAndRender(src, ctx)
      .then(function(html) {
        // html === Welcome to Shopify Liquid 
      });
  </script>
</body>
</html>

There's also a demo.

Includes

// file: color.liquid
color: '{{ color }}' shape: '{{ shape }}'

// file: theme.liquid
{% assign shape = 'circle' %}
{% include 'color' %}
{% include 'color' with 'red' %}
{% include 'color', color: 'yellow', shape: 'square' %}

The output will be:

color: '' shape: 'circle'
color: 'red' shape: 'circle'
color: 'yellow' shape: 'square'

Layouts

// file: default-layout.liquid
Header
{% block content %}My default content{% endblock %}
Footer

// file: page.liquid
{% layout "default-layout" %}
{% block content %}My page content{% endblock %}

The output of page.liquid:

Header
My page content
Footer
  • It's possible to define multiple blocks.
  • block name is optional when there's only one block.

Register Filters

// Usage: {{ name | uppper }}
engine.registerFilter('upper', function(v){
  return v.toUpperCase();
});

See existing filter implementations: https://github.com/harttle/shopify-liquid/blob/master/filters.js

Register Tags

// Usage: {% upper name%}
engine.registerTag('upper', {
    parse: function(tagToken, remainTokens) {
        this.str = tagToken.args; // name
    },
    render: function(scope, hash) {
        var str = Liquid.evalValue(this.str, scope); // 'alice'
        return Promise.resolve(str.toUpperCase()); // 'Alice'
    }
});

See existing tag implementations: https://github.com/harttle/shopify-liquid/blob/master/tags/

All Tags

Documentation: https://shopify.github.io/liquid/basics/introduction/#tags

Tag Document Source Test
case/when Document Source Test
if Document Source Test
unless Document Source Test
elsif/else Document Source Test
for Document Source Test
break Document Source Test
continue Document Source Test
for: limit,offset,range,reversed Document Source Test
cycle Document Source Test
cycle: group Document Source Test
tablerow Document Source Test
tablerow: cols,limit,offset,range Document Source Test
assign Document Source Test
capture Document Source Test
increment Document Source Test
decrement Document Source Test
raw Document Source Test
comment Document Source Test
include Document Source Test
layout, block Document Source Test

All Filters

Documentation: https://shopify.github.io/liquid/basics/introduction/#filters

Filter Document Source Test
abs Document Source Test
append Document Source Test
capitalize Document Source Test
ceil Document Source Test
date Document Source Test
default Document Source Test
divided_by Document Source Test
downcase Document Source Test
escape Document Source Test
escape_once Document Source Test
first Document Source Test
floor Document Source Test
join Document Source Test
last Document Source Test
lstrip Document Source Test
map Document Source Test
minus Document Source Test
modulo Document Source Test
newline_to_br Document Source Test
plus Document Source Test
prepend Document Source Test
remove Document Source Test
remove_first Document Source Test
replace Document Source Test
replace_first Document Source Test
reverse Document Source Test
round Document Source Test
rstrip Document Source Test
size Document Source Test
slice Document Source Test
sort Document Source Test
split Document Source Test
strip Document Source Test
strip_html Document Source Test
strip_newlines Document Source Test
times Document Source Test
truncate Document Source Test
truncatewords Document Source Test
uniq Document Source Test
upcase Document Source Test
url_encode Document Source Test

Operators

Documentation: https://shopify.github.io/liquid/basics/operators/

==, !=, >, <, >=, <=, or, and, contains.

About

Liquid template engine for Node.js and browser javascript.

License:MIT License


Languages

Language:JavaScript 99.4%Language:HTML 0.3%Language:Makefile 0.2%Language:Liquid 0.1%