From 635b97c33e14e64a71b9894bc6a37988136d9fa1 Mon Sep 17 00:00:00 2001 From: Dylan Piercey Date: Wed, 7 Dec 2022 14:27:31 -0700 Subject: [PATCH] fix: issue with escaped placeholder at end of tag (#143) --- .changeset/afraid-monkeys-walk.md | 5 +++++ .../__snapshots__/placeholder-backslash.expected.txt | 12 +++++++++++- .../fixtures/placeholder-backslash/input.marko | 4 +++- src/states/PLACEHOLDER.ts | 3 ++- 4 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 .changeset/afraid-monkeys-walk.md diff --git a/.changeset/afraid-monkeys-walk.md b/.changeset/afraid-monkeys-walk.md new file mode 100644 index 00000000..16378e93 --- /dev/null +++ b/.changeset/afraid-monkeys-walk.md @@ -0,0 +1,5 @@ +--- +"htmljs-parser": patch +--- + +Fix issue where and extra character was being consumed if an escaped placeholder was at the end of a tag. diff --git a/src/__tests__/fixtures/placeholder-backslash/__snapshots__/placeholder-backslash.expected.txt b/src/__tests__/fixtures/placeholder-backslash/__snapshots__/placeholder-backslash.expected.txt index b8424edd..f5bcc78f 100644 --- a/src/__tests__/fixtures/placeholder-backslash/__snapshots__/placeholder-backslash.expected.txt +++ b/src/__tests__/fixtures/placeholder-backslash/__snapshots__/placeholder-backslash.expected.txt @@ -67,4 +67,14 @@ │ │ │╰─ closeTagEnd(d) │ │ ╰─ closeTagName │ ├─ text "\n" - ╰─ ╰─ closeTagStart "\${ + │ │││ │ │ │╰─ closeTagEnd(e) + │ │││ │ │ ╰─ closeTagName + │ │││ │ ╰─ closeTagStart " \\$!{test} - \ No newline at end of file + + +\${ diff --git a/src/states/PLACEHOLDER.ts b/src/states/PLACEHOLDER.ts index 3e0929ae..47586d43 100644 --- a/src/states/PLACEHOLDER.ts +++ b/src/states/PLACEHOLDER.ts @@ -73,6 +73,8 @@ export function checkForPlaceholder(parser: Parser, code: number) { } if (curCode === CODE.OPEN_CURLY_BRACE) { + parser.forward = 0; + if (ahead) { const remainder = ahead % 2; const extra = (ahead + remainder) / 2; // Number of backslashes to omit from output. @@ -94,7 +96,6 @@ export function checkForPlaceholder(parser: Parser, code: number) { parser.endText(); parser.enterState(PLACEHOLDER).escape = escape; parser.pos += escape ? 2 : 3; // skip ${ or $!{ - parser.forward = 0; parser.enterState(STATE.EXPRESSION).shouldTerminate = matchesCloseCurlyBrace; return true;