Skip to content

Commit 40e1837

Browse files
committed
Merge branch 'fix-escapes' of github.com:dmarcotte/handlebars.js into dmarcotte-fix-escapes
Conflicts: spec/tokenizer.js
2 parents ddea5be + 9d353bd commit 40e1837

File tree

2 files changed

+19
-9
lines changed

2 files changed

+19
-9
lines changed

spec/tokenizer.js

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -87,15 +87,15 @@ describe('Tokenizer', function() {
8787

8888
it('supports escaping multiple escape characters', function() {
8989
var result = tokenize("{{foo}} \\\\{{bar}} \\\\{{baz}}");
90-
shouldMatchTokens(result, ['OPEN', 'ID', 'CLOSE', 'CONTENT', 'OPEN', 'ID', 'CLOSE', 'CONTENT', 'OPEN', 'ID', 'CLOSE']);
90+
shouldMatchTokens(result, ['OPEN', 'ID', 'CLOSE', 'CONTENT', 'OPEN', 'ID', 'CLOSE', 'CONTENT', 'OPEN', 'ID', 'CLOSE']);
9191

92-
shouldBeToken(result[3], "CONTENT", " \\");
93-
shouldBeToken(result[5], "ID", "bar");
94-
shouldBeToken(result[7], "CONTENT", " \\");
95-
shouldBeToken(result[9], "ID", "baz");
92+
shouldBeToken(result[3], "CONTENT", " \\");
93+
shouldBeToken(result[5], "ID", "bar");
94+
shouldBeToken(result[7], "CONTENT", " \\");
95+
shouldBeToken(result[9], "ID", "baz");
9696
});
9797

98-
it('supports mixed escaped delimiters and escaped escape characters', function() {
98+
it('supports escaped mustaches after escaped escape characters', function() {
9999
var result = tokenize("{{foo}} \\\\{{bar}} \\{{baz}}");
100100
shouldMatchTokens(result, ['OPEN', 'ID', 'CLOSE', 'CONTENT', 'OPEN', 'ID', 'CLOSE', 'CONTENT', 'CONTENT', 'CONTENT']);
101101

@@ -106,6 +106,16 @@ describe('Tokenizer', function() {
106106
shouldBeToken(result[8], "CONTENT", "{{baz}}");
107107
});
108108

109+
it('supports escaped escape characters after escaped mustaches', function() {
110+
var result = tokenize("{{foo}} \\{{bar}} \\\\{{baz}}");
111+
shouldMatchTokens(result, ['OPEN', 'ID', 'CLOSE', 'CONTENT', 'CONTENT', 'CONTENT', 'OPEN', 'ID', 'CLOSE']);
112+
113+
shouldBeToken(result[4], "CONTENT", "{{bar}} ");
114+
shouldBeToken(result[5], "CONTENT", "\\");
115+
shouldBeToken(result[6], "OPEN", "{{");
116+
shouldBeToken(result[7], "ID", "baz");
117+
});
118+
109119
it('supports escaped escape character on a triple stash', function() {
110120
var result = tokenize("{{foo}} \\\\{{{bar}}} {{baz}}");
111121
shouldMatchTokens(result, ['OPEN', 'ID', 'CLOSE', 'CONTENT', 'OPEN_UNESCAPED', 'ID', 'CLOSE_UNESCAPED', 'CONTENT', 'OPEN', 'ID', 'CLOSE']);

src/handlebars.l

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,9 @@ ID [^\s!"#%-,\.\/;->@\[-\^`\{-~]+/{LOOKAHEAD}
4343

4444
[^\x00]+ return 'CONTENT';
4545

46-
<emu>[^\x00]{2,}?/("{{"|<<EOF>>) {
47-
if(yytext.slice(-1) !== "\\") this.popState();
48-
if(yytext.slice(-1) === "\\") strip(0,1);
46+
// marks CONTENT up to the next mustache or escaped mustache
47+
<emu>[^\x00]{2,}?/("{{"|"\\{{"|"\\\\{{"|<<EOF>>) {
48+
this.popState();
4949
return 'CONTENT';
5050
}
5151

0 commit comments

Comments
 (0)