Skip to content

Commit

Permalink
fix: only render the first 'else' template in the case of multiples
Browse files Browse the repository at this point in the history
  • Loading branch information
joel-hamilton committed Feb 16, 2024
1 parent 1937aa1 commit d4490c4
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 5 deletions.
6 changes: 5 additions & 1 deletion src/tags/case.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,11 @@ export default class extends Tag {
})
.on('tag:else', () => (p = this.elseTemplates))
.on('tag:endcase', () => stream.stop())
.on('template', (tpl: Template) => p.push(tpl))
.on('template', (tpl: Template) => {
if (p !== this.elseTemplates || (p === this.elseTemplates && p.length === 0)) {
p.push(tpl)
}
})
.on('end', () => {
throw new Error(`tag ${tagToken.getText()} not closed`)
})
Expand Down
8 changes: 6 additions & 2 deletions src/tags/if.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ export default class extends Tag {

constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {
super(tagToken, remainTokens, liquid)
let p
let p: Template[] = []
liquid.parser.parseStream(remainTokens)
.on('start', () => this.branches.push({
value: new Value(tagToken.args, this.liquid),
Expand All @@ -18,7 +18,11 @@ export default class extends Tag {
}))
.on('tag:else', () => (p = this.elseTemplates))
.on('tag:endif', function () { this.stop() })
.on('template', (tpl: Template) => p.push(tpl))
.on('template', (tpl: Template) => {
if (p !== this.elseTemplates || (p === this.elseTemplates && p.length === 0)) {
p.push(tpl)
}
})
.on('end', () => { throw new Error(`tag ${tagToken.getText()} not closed`) })
.start()
}
Expand Down
8 changes: 6 additions & 2 deletions src/tags/unless.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ export default class extends Tag {
elseTemplates: Template[] = []
constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {
super(tagToken, remainTokens, liquid)
let p
let p: Template[] = []
this.liquid.parser.parseStream(remainTokens)
.on('start', () => this.branches.push({
value: new Value(tagToken.args, this.liquid),
Expand All @@ -19,7 +19,11 @@ export default class extends Tag {
}))
.on('tag:else', () => (p = this.elseTemplates))
.on('tag:endunless', function () { this.stop() })
.on('template', (tpl: Template) => p.push(tpl))
.on('template', (tpl: Template) => {
if (p !== this.elseTemplates || (p === this.elseTemplates && p.length === 0)) {
p.push(tpl)
}
})
.on('end', () => { throw new Error(`tag ${tagToken.getText()} not closed`) })
.start()
}
Expand Down
15 changes: 15 additions & 0 deletions test/e2e/issues.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -469,4 +469,19 @@ describe('Issues', function () {
const result = engine.parseAndRenderSync('{{ÜLKE}}', { ÜLKE: 'Türkiye' })
expect(result).toEqual('Türkiye')
})
it('#670 Does not render multiple `else` branches in the same if conditional', () => {
const engine = new Liquid()
const result = engine.parseAndRenderSync(`{% if false %}don't show{% else %}show{% else %}don't show{% endif %}`, {})
expect(result).toEqual('show')
})
it('#670 Does not render multiple `else` branches in the same unless conditional', () => {
const engine = new Liquid()
const result = engine.parseAndRenderSync(`{% unless true %}don't show{% else %}show{% else %}don't show{% endunless %}`, {})
expect(result).toEqual('show')
})
it('#670 Does not render multiple `else` branches in the same case conditional', () => {
const engine = new Liquid()
const result = engine.parseAndRenderSync(`{% case true %}{% when false %}don't show{% else %}show{% else %}don't show{% endcase %}`, {})
expect(result).toEqual('show')
})
})

0 comments on commit d4490c4

Please sign in to comment.