Skip to content

Commit

Permalink
fix: allow quotes in inline comment tag, fixes #628
Browse files Browse the repository at this point in the history
  • Loading branch information
harttle committed Jul 7, 2023
1 parent c0bc2de commit bf425c3
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 12 deletions.
1 change: 1 addition & 0 deletions docs/themes/navy/layout/partial/all-contributors.swig
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
<td align="center" valign="top" width="0%"><a href="https://github.com/bangank36"><img src="https://avatars.githubusercontent.com/u/10071857?v=4?s=100" width="100px;" alt="BaNgan"/></a></td>
<td align="center" valign="top" width="0%"><a href="https://github.com/mahyar-pasarzangene"><img src="https://avatars.githubusercontent.com/u/16485039?v=4?s=100" width="100px;" alt="Mahyar Pasarzangene"/></a></td>
<td align="center" valign="top" width="0%"><a href="https://hubelbauer.net/"><img src="https://avatars.githubusercontent.com/u/6831144?v=4?s=100" width="100px;" alt="Tomáš Hübelbauer"/></a></td>
<td align="center" valign="top" width="0%"><a href="https://sixtwothree.org"><img src="https://avatars.githubusercontent.com/u/73866?v=4?s=100" width="100px;" alt="Jason Garber"/></a></td>
</tr>
</tbody>
</table>
Expand Down
9 changes: 0 additions & 9 deletions src/parser/tokenizer.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -199,15 +199,6 @@ describe('Tokenizer', function () {
})
})
describe('#readTagToken()', () => {
it('should skip quoted delimiters', function () {
const html = '{% assign a = "%} {% }} {{" %}'
const tokenizer = new Tokenizer(html)
const token = tokenizer.readTagToken()

expect(token).toBeInstanceOf(TagToken)
expect(token.name).toBe('assign')
expect(token.args).toBe('a = "%} {% }} {{"')
})
})
describe('#readOutputToken()', () => {
it('should skip quoted delimiters', function () {
Expand Down
7 changes: 4 additions & 3 deletions src/parser/tokenizer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -140,9 +140,10 @@ export class Tokenizer {
return token
}

readToDelimiter (delimiter: string) {
readToDelimiter (delimiter: string, respectQuoted = false) {
this.skipBlank()
while (this.p < this.N) {
if ((this.peekType() & QUOTE)) {
if (respectQuoted && (this.peekType() & QUOTE)) {
this.readQuoted()
continue
}
Expand All @@ -156,7 +157,7 @@ export class Tokenizer {
const { file, input } = this
const { outputDelimiterRight } = options
const begin = this.p
if (this.readToDelimiter(outputDelimiterRight) === -1) {
if (this.readToDelimiter(outputDelimiterRight, true) === -1) {
throw this.error(`output ${this.snapshot(begin)} not closed`, begin)
}
return new OutputToken(input, begin, this.p, options, file)
Expand Down
23 changes: 23 additions & 0 deletions test/e2e/issues.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -431,4 +431,27 @@ describe('Issues', function () {
const fn = () => engine.parseAndRenderSync("{%- assign module = '' | split '' -%}")
expect(fn).toThrow(/expected ":" after filter name/)
})
it('#628 Single or double quote breaks comments', () => {
const template = `{%- liquid
# Show a message that's customized to the product type
assign product_type = product.type | downcase
assign message = ''
case product_type
when 'health'
assign message = 'This is a health potion!'
when 'love'
assign message = 'This is a love potion!'
else
assign message = 'This is a potion!'
endcase
echo message
-%}`
const engine = new Liquid()
const product = { type: 'love' }
const result = engine.parseAndRenderSync(template, { product })
expect(result).toEqual('This is a love potion!')
})
})
10 changes: 10 additions & 0 deletions test/integration/tags/inline-comment.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,16 @@ describe('tags/inline-comment', function () {
const html = await liquid.parseAndRender(src)
return expect(html).toBe('foo')
})
it('should allow single quotes', async function () {
const src = "B{% # that's %}A"
const html = await liquid.parseAndRender(src)
return expect(html).toBe('BA')
})
it('should allow double quotes', async function () {
const src = 'B{% # that"s %}A'
const html = await liquid.parseAndRender(src)
return expect(html).toBe('BA')
})
it('should handle hash without trailing whitespace', async function () {
const src = '{% #some comment %}'
const html = await liquid.parseAndRender(src)
Expand Down

0 comments on commit bf425c3

Please sign in to comment.