From 3e3d84a5ed51d89a01004e8fc38a2303d44fb0fe Mon Sep 17 00:00:00 2001 From: Jun Yang Date: Tue, 4 May 2021 18:12:26 +0800 Subject: [PATCH] fix: operator boundary not correctly recognized, fixes #342 --- src/parser/match-operator.ts | 4 ++-- src/util/operator-trie.ts | 3 ++- test/e2e/issues.ts | 8 +++++++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/parser/match-operator.ts b/src/parser/match-operator.ts index d0794bdd71..37ccde58c2 100644 --- a/src/parser/match-operator.ts +++ b/src/parser/match-operator.ts @@ -1,4 +1,4 @@ -import { IDENTIFIER } from '../util/character' +import { IDENTIFIER, TYPES } from '../util/character' import { Trie } from '../util/operator-trie' export function matchOperator (str: string, begin: number, trie: Trie, end = str.length) { @@ -10,6 +10,6 @@ export function matchOperator (str: string, begin: number, trie: Trie, end = str if (node['end']) info = node } if (!info) return -1 - if (info['needBoundary'] && str.charCodeAt(i) & IDENTIFIER) return -1 + if (info['needBoundary'] && (TYPES[str.charCodeAt(i)] & IDENTIFIER)) return -1 return i } diff --git a/src/util/operator-trie.ts b/src/util/operator-trie.ts index b1f083dbf4..94d3acb80d 100644 --- a/src/util/operator-trie.ts +++ b/src/util/operator-trie.ts @@ -1,4 +1,5 @@ import { Operators } from '../render/operator' +import { IDENTIFIER, TYPES } from '../util/character' export interface Trie { [key: string]: any; @@ -13,7 +14,7 @@ export function createTrie (operators: Operators): Trie { const c = name[i] node[c] = node[c] || {} - if (i === name.length - 1 && c !== '=') { + if (i === name.length - 1 && (TYPES[name.charCodeAt(i)] & IDENTIFIER)) { node[c].needBoundary = true } diff --git a/test/e2e/issues.ts b/test/e2e/issues.ts index 8ce313b0a0..2e3c6e0d4e 100644 --- a/test/e2e/issues.ts +++ b/test/e2e/issues.ts @@ -95,11 +95,17 @@ describe('Issues', function () { ) expect(html).to.equal('falsefalse') }) - it('#321 comparison for empty/nil', async () => { + it('#320 newline_to_br filter should output
instead of
', async () => { const engine = new Liquid() const html = await engine.parseAndRender( `{{ 'a \n b \n c' | newline_to_br | split: '
' }}` ) expect(html).to.equal('a ,\n b ,\n c') }) + it('#342 New lines in logical operator', async () => { + const engine = new Liquid() + const tpl = `{%\r\nif\r\ntrue\r\nor\r\nfalse\r\n%}\r\ntrue\r\n{%\r\nendif\r\n%}` + const html = await engine.parseAndRender(tpl) + expect(html).to.equal('\r\ntrue\r\n') + }) })