From 48afa46adc4703302959a5adc93dbbfd27c78168 Mon Sep 17 00:00:00 2001 From: Ben Ashton Date: Sun, 25 Sep 2022 16:48:14 -0600 Subject: [PATCH] Improved handling of escape sequences --- src/token_stream.mjs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/token_stream.mjs b/src/token_stream.mjs index 3c835ad..6a150e1 100644 --- a/src/token_stream.mjs +++ b/src/token_stream.mjs @@ -65,7 +65,16 @@ export class TokenStream { // Skip shebang (can be used to execute templates directly with an // interpreter that first builds the template and then executes) this._skipShebang(); - } else if (this._cs.isNext(TokenStream.ESCAPE)) { + } else if (this._isNextEscapedTag([ + // Allow escaping of open and full-line tags + TokenStream.OPEN_STATEMENT, + TokenStream.OPEN_INLINE, + TokenStream.OPEN_INLINE_UNESCAPED, + TokenStream.OPEN_INLINE_STATEMENT, + TokenStream.OPEN_INLINE_STATEMENT_UNESCAPED, + TokenStream.STATEMENT, + TokenStream.COMMENT + ])) { // Skip escape this._cs.next(TokenStream.ESCAPE.length); // Treat everything as raw until next space @@ -132,7 +141,7 @@ export class TokenStream { let value = ''; while (!this._cs.eof() && !this._cs.isNext(closeTag)) { // Handle any escaped closing tag - if (this._cs.isNext(TokenStream.ESCAPE)) { + if (this._isNextEscapedTag([closeTag])) { // Skip escape this._cs.next(TokenStream.ESCAPE.length); @@ -243,4 +252,12 @@ export class TokenStream { _isSpace(c) { return /[^\S\r\n]/.test(c); } + + _isNextEscapedTag(possibleTags=[]) { + if (!this._cs.isNext(TokenStream.ESCAPE)) return false; + + return !!possibleTags.find(tag => + this._cs.isNext(TokenStream.ESCAPE + tag) + ); + } }