diff options
-rw-r--r-- | spec/tokenizer.js | 22 | ||||
-rw-r--r-- | src/handlebars.l | 6 |
2 files changed, 19 insertions, 9 deletions
diff --git a/spec/tokenizer.js b/spec/tokenizer.js index 3732322..80f28ab 100644 --- a/spec/tokenizer.js +++ b/spec/tokenizer.js @@ -87,15 +87,15 @@ describe('Tokenizer', function() { it('supports escaping multiple escape characters', function() { var result = tokenize("{{foo}} \\\\{{bar}} \\\\{{baz}}"); - shouldMatchTokens(result, ['OPEN', 'ID', 'CLOSE', 'CONTENT', 'OPEN', 'ID', 'CLOSE', 'CONTENT', 'OPEN', 'ID', 'CLOSE']); + shouldMatchTokens(result, ['OPEN', 'ID', 'CLOSE', 'CONTENT', 'OPEN', 'ID', 'CLOSE', 'CONTENT', 'OPEN', 'ID', 'CLOSE']); - shouldBeToken(result[3], "CONTENT", " \\"); - shouldBeToken(result[5], "ID", "bar"); - shouldBeToken(result[7], "CONTENT", " \\"); - shouldBeToken(result[9], "ID", "baz"); + shouldBeToken(result[3], "CONTENT", " \\"); + shouldBeToken(result[5], "ID", "bar"); + shouldBeToken(result[7], "CONTENT", " \\"); + shouldBeToken(result[9], "ID", "baz"); }); - it('supports mixed escaped delimiters and escaped escape characters', function() { + it('supports escaped mustaches after escaped escape characters', function() { var result = tokenize("{{foo}} \\\\{{bar}} \\{{baz}}"); shouldMatchTokens(result, ['OPEN', 'ID', 'CLOSE', 'CONTENT', 'OPEN', 'ID', 'CLOSE', 'CONTENT', 'CONTENT', 'CONTENT']); @@ -106,6 +106,16 @@ describe('Tokenizer', function() { shouldBeToken(result[8], "CONTENT", "{{baz}}"); }); + it('supports escaped escape characters after escaped mustaches', function() { + var result = tokenize("{{foo}} \\{{bar}} \\\\{{baz}}"); + shouldMatchTokens(result, ['OPEN', 'ID', 'CLOSE', 'CONTENT', 'CONTENT', 'CONTENT', 'OPEN', 'ID', 'CLOSE']); + + shouldBeToken(result[4], "CONTENT", "{{bar}} "); + shouldBeToken(result[5], "CONTENT", "\\"); + shouldBeToken(result[6], "OPEN", "{{"); + shouldBeToken(result[7], "ID", "baz"); + }); + it('supports escaped escape character on a triple stash', function() { var result = tokenize("{{foo}} \\\\{{{bar}}} {{baz}}"); shouldMatchTokens(result, ['OPEN', 'ID', 'CLOSE', 'CONTENT', 'OPEN_UNESCAPED', 'ID', 'CLOSE_UNESCAPED', 'CONTENT', 'OPEN', 'ID', 'CLOSE']); diff --git a/src/handlebars.l b/src/handlebars.l index cc46939..913121c 100644 --- a/src/handlebars.l +++ b/src/handlebars.l @@ -43,9 +43,9 @@ ID [^\s!"#%-,\.\/;->@\[-\^`\{-~]+/{LOOKAHEAD} [^\x00]+ return 'CONTENT'; -<emu>[^\x00]{2,}?/("{{"|<<EOF>>) { - if(yytext.slice(-1) !== "\\") this.popState(); - if(yytext.slice(-1) === "\\") strip(0,1); +// marks CONTENT up to the next mustache or escaped mustache +<emu>[^\x00]{2,}?/("{{"|"\\{{"|"\\\\{{"|<<EOF>>) { + this.popState(); return 'CONTENT'; } |