diff options
author | kpdecker <kpdecker@gmail.com> | 2013-12-23 19:22:30 -0600 |
---|---|---|
committer | kpdecker <kpdecker@gmail.com> | 2013-12-23 19:22:30 -0600 |
commit | 40e1837b14f1fa9d368cd24b95ea2d6116fff1f4 (patch) | |
tree | 147e9a730a234473fb03e528c6a167c69e8e475c | |
parent | ddea5be2a49ab8c3defac4b08bd8f6f14a3bf905 (diff) | |
parent | 9d353bd3dd24b1e975ddf14a77179d4ab016706c (diff) | |
download | handlebars.js-40e1837b14f1fa9d368cd24b95ea2d6116fff1f4.zip handlebars.js-40e1837b14f1fa9d368cd24b95ea2d6116fff1f4.tar.gz handlebars.js-40e1837b14f1fa9d368cd24b95ea2d6116fff1f4.tar.bz2 |
Merge branch 'fix-escapes' of github.com:dmarcotte/handlebars.js into dmarcotte-fix-escapes
Conflicts:
spec/tokenizer.js
-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'; } |