mirror of
https://github.com/harttle/liquidjs.git
synced 2026-09-15 04:10:40 -07:00
fix: allow quoted variable name in capture, fixes #252
This commit is contained in:
@@ -1,9 +1,10 @@
|
|||||||
import { Tokenizer, assert, Template, Context, TagImplOptions, TagToken, TopLevelToken } from '../../types'
|
import { Tokenizer, assert, Template, Context, TagImplOptions, TagToken, TopLevelToken } from '../../types'
|
||||||
|
import { evalQuotedToken } from '../../render/expression'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
parse: function (tagToken: TagToken, remainTokens: TopLevelToken[]) {
|
parse: function (tagToken: TagToken, remainTokens: TopLevelToken[]) {
|
||||||
const tokenizer = new Tokenizer(tagToken.args)
|
const tokenizer = new Tokenizer(tagToken.args)
|
||||||
this.variable = tokenizer.readWord().content
|
this.variable = readVariableName(tokenizer)
|
||||||
assert(this.variable, () => `${tagToken.args} not valid identifier`)
|
assert(this.variable, () => `${tagToken.args} not valid identifier`)
|
||||||
|
|
||||||
this.templates = []
|
this.templates = []
|
||||||
@@ -22,3 +23,10 @@ export default {
|
|||||||
ctx.bottom()[this.variable] = html
|
ctx.bottom()[this.variable] = html
|
||||||
}
|
}
|
||||||
} as TagImplOptions
|
} as TagImplOptions
|
||||||
|
|
||||||
|
function readVariableName (tokenizer: Tokenizer) {
|
||||||
|
const word = tokenizer.readWord().content
|
||||||
|
if (word) return word
|
||||||
|
const quoted = tokenizer.readQuoted()
|
||||||
|
if (quoted) return evalQuotedToken(quoted)
|
||||||
|
}
|
||||||
|
|||||||
@@ -10,4 +10,12 @@ describe('Issues', function () {
|
|||||||
const html = engine.parseAndRenderSync('{{huh | truncate: 11}}', { huh: 'fdsafdsafdsafdsaaaaa' })
|
const html = engine.parseAndRenderSync('{{huh | truncate: 11}}', { huh: 'fdsafdsafdsafdsaaaaa' })
|
||||||
expect(html).to.equal('fdsafdsa...')
|
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')
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -13,6 +13,12 @@ describe('tags/capture', function () {
|
|||||||
return expect(html).to.equal('A')
|
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 () {
|
it('should shading rather than overwriting', async function () {
|
||||||
const src = '{% capture var %}10{% endcapture %}{{var}}'
|
const src = '{% capture var %}10{% endcapture %}{{var}}'
|
||||||
const ctx = { 'var': 20 }
|
const ctx = { 'var': 20 }
|
||||||
|
|||||||
Reference in New Issue
Block a user