Skip to content

Commit

Permalink
fix: allow quoted variable name in capture, fixes #252
Browse files Browse the repository at this point in the history
  • Loading branch information
harttle committed Oct 3, 2020
1 parent 236d971 commit 5b3f419
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 1 deletion.
10 changes: 9 additions & 1 deletion src/builtin/tags/capture.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { Tokenizer, assert, Template, Context, TagImplOptions, TagToken, TopLevelToken } from '../../types'
import { evalQuotedToken } from '../../render/expression'

export default {
parse: function (tagToken: TagToken, remainTokens: TopLevelToken[]) {
const tokenizer = new Tokenizer(tagToken.args)
this.variable = tokenizer.readWord().content
this.variable = readVariableName(tokenizer)
assert(this.variable, () => `${tagToken.args} not valid identifier`)

this.templates = []
Expand All @@ -22,3 +23,10 @@ export default {
ctx.bottom()[this.variable] = html
}
} as TagImplOptions

function readVariableName (tokenizer: Tokenizer) {
const word = tokenizer.readWord().content
if (word) return word
const quoted = tokenizer.readQuoted()
if (quoted) return evalQuotedToken(quoted)
}
8 changes: 8 additions & 0 deletions test/e2e/issues.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,12 @@ describe('Issues', function () {
const html = engine.parseAndRenderSync('{{huh | truncate: 11}}', { huh: 'fdsafdsafdsafdsaaaaa' })
expect(html).to.equal('fdsafdsa...')
})
it('#252 "Not valid identifier" error for a quotes-containing identifier', async () => {
const template = `{% capture "form_classes" -%}
foo
{%- endcapture %}{{form_classes}}`
const engine = new Liquid()
const html = await engine.parseAndRender(template)
expect(html).to.equal('foo')
})
})
6 changes: 6 additions & 0 deletions test/integration/builtin/tags/capture.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,12 @@ describe('tags/capture', function () {
return expect(html).to.equal('A')
})

it('should support quoted variable name', async function () {
const src = '{% capture "f" %}{{"a" | capitalize}}{%endcapture%}{{f}}'
const html = await liquid.parseAndRender(src)
return expect(html).to.equal('A')
})

it('should shading rather than overwriting', async function () {
const src = '{% capture var %}10{% endcapture %}{{var}}'
const ctx = { 'var': 20 }
Expand Down

0 comments on commit 5b3f419

Please sign in to comment.