Skip to content

Commit

Permalink
feat: when tag with multiple values
Browse files Browse the repository at this point in the history
  • Loading branch information
mems authored and harttle committed May 6, 2021
1 parent 3e130e0 commit 8f9639f
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 8 deletions.
2 changes: 1 addition & 1 deletion docs/source/tags/case.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Input
{% case handle %}
{% when "cake" %}
This is a cake
{% when "cookie" %}
{% when "cookie", "biscuit" %}
This is a cookie
{% else %}
This is not a cake nor a cookie
Expand Down
2 changes: 1 addition & 1 deletion docs/source/zh-cn/tags/case.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ title: case
{% case handle %}
{% when "cake" %}
This is a cake
{% when "cookie" %}
{% when "cookie", "biscuit" %}
This is a cookie
{% else %}
This is not a cake nor a cookie
Expand Down
24 changes: 18 additions & 6 deletions src/builtin/tags/case.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { toValue, Value, Emitter, TagToken, TopLevelToken, Context, Template, TagImplOptions, ParseStream } from '../../types'
import { toValue, evalToken, Value, Emitter, TagToken, TopLevelToken, Context, Template, TagImplOptions, ParseStream } from '../../types'
import { Tokenizer } from '../../parser/tokenizer'

export default {
parse: function (tagToken: TagToken, remainTokens: TopLevelToken[]) {
Expand All @@ -9,10 +10,21 @@ export default {
let p: Template[] = []
const stream: ParseStream = this.liquid.parser.parseStream(remainTokens)
.on('tag:when', (token: TagToken) => {
this.cases.push({
val: new Value(token.args, this.liquid),
templates: p = []
})
p = []

const tokenizer = new Tokenizer(token.args, this.liquid.options.operatorsTrie)

while (!tokenizer.end()) {
const value = tokenizer.readValue()
if (value) {
this.cases.push({
val: value,
templates: p
})
}

tokenizer.readTo(',')
}
})
.on('tag:else', () => (p = this.elseTemplates))
.on('tag:endcase', () => stream.stop())
Expand All @@ -28,7 +40,7 @@ export default {
const r = this.liquid.renderer
const cond = toValue(yield this.cond.value(ctx, ctx.opts.lenientIf))
for (const branch of this.cases) {
const val = toValue(yield branch.val.value(ctx, ctx.opts.lenientIf))
const val = evalToken(branch.val, ctx, ctx.opts.lenientIf)
if (val === cond) {
yield r.renderTemplates(branch.templates, ctx, emitter)
return
Expand Down
7 changes: 7 additions & 0 deletions test/integration/builtin/tags/case.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,4 +64,11 @@ describe('tags/case', function () {
return expect(html).to.equal('d')
})
})
it('should support case with multiple values', async function () {
const src = '{% case "b" %}' +
'{% when "a", "b" %}foo' +
'{%endcase%}'
const html = await liquid.parseAndRender(src)
return expect(html).to.equal('foo')
})
})

0 comments on commit 8f9639f

Please sign in to comment.