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