all files / liquidjs/tags/ case.js

100% Statements 21/21
100% Branches 2/2
100% Functions 3/3
100% Lines 21/21
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42   111×         10×         11×                        
const Liquid = require('..')
 
module.exports = function (liquid) {
  liquid.registerTag('case', {
 
    parse: function (tagToken, remainTokens) {
      this.cond = tagToken.args
      this.cases = []
      this.elseTemplates = []
 
      var p = []
      var stream = liquid.parser.parseStream(remainTokens)
        .on('tag:when', token => {
          this.cases.push({
            val: token.args,
            templates: p = []
          })
        })
        .on('tag:else', () => (p = this.elseTemplates))
        .on('tag:endcase', token => stream.stop())
        .on('template', tpl => p.push(tpl))
        .on('end', x => {
          throw new Error(`tag ${tagToken.raw} not closed`)
        })
 
      stream.start()
    },
 
    render: function (scope, hash) {
      for (var i = 0; i < this.cases.length; i++) {
        var branch = this.cases[i]
        var val = Liquid.evalExp(branch.val, scope)
        var cond = Liquid.evalExp(this.cond, scope)
        if (val === cond) {
          return liquid.renderer.renderTemplates(branch.templates, scope)
        }
      }
      return liquid.renderer.renderTemplates(this.elseTemplates, scope)
    }
  })
}