Improved handling of escape sequences

This commit is contained in:
Ben Ashton 2022-09-25 16:48:14 -06:00
parent 2a6e78d67b
commit 48afa46adc

View File

@ -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)
);
}
}