summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--spec/tokenizer.js22
-rw-r--r--src/handlebars.l6
2 files changed, 19 insertions, 9 deletions
diff --git a/spec/tokenizer.js b/spec/tokenizer.js
index de981e4..69bc7b2 100644
--- a/spec/tokenizer.js
+++ b/spec/tokenizer.js
@@ -88,15 +88,15 @@ describe('Tokenizer', function() {
it('supports escaping multiple escape characters', function() {
var result = tokenize("{{foo}} \\\\{{bar}} \\\\{{baz}}");
- result.should.match_tokens(['OPEN', 'ID', 'CLOSE', 'CONTENT', 'OPEN', 'ID', 'CLOSE', 'CONTENT', 'OPEN', 'ID', 'CLOSE']);
+ result.should.match_tokens(['OPEN', 'ID', 'CLOSE', 'CONTENT', 'OPEN', 'ID', 'CLOSE', 'CONTENT', 'OPEN', 'ID', 'CLOSE']);
- result[3].should.be_token("CONTENT", " \\");
- result[5].should.be_token("ID", "bar");
- result[7].should.be_token("CONTENT", " \\");
- result[9].should.be_token("ID", "baz");
+ result[3].should.be_token("CONTENT", " \\");
+ result[5].should.be_token("ID", "bar");
+ result[7].should.be_token("CONTENT", " \\");
+ result[9].should.be_token("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}}");
result.should.match_tokens(['OPEN', 'ID', 'CLOSE', 'CONTENT', 'OPEN', 'ID', 'CLOSE', 'CONTENT', 'CONTENT', 'CONTENT']);
@@ -107,6 +107,16 @@ describe('Tokenizer', function() {
result[8].should.be_token("CONTENT", "{{baz}}");
});
+ it('supports escaped escape characters after escaped mustaches', function() {
+ var result = tokenize("{{foo}} \\{{bar}} \\\\{{baz}}");
+ result.should.match_tokens(['OPEN', 'ID', 'CLOSE', 'CONTENT', 'CONTENT', 'CONTENT', 'OPEN', 'ID', 'CLOSE']);
+
+ result[4].should.be_token("CONTENT", "{{bar}} ");
+ result[5].should.be_token("CONTENT", "\\");
+ result[6].should.be_token("OPEN", "{{");
+ result[7].should.be_token("ID", "baz");
+ });
+
it('supports escaped escape character on a triple stash', function() {
var result = tokenize("{{foo}} \\\\{{{bar}}} {{baz}}");
result.should.match_tokens(['OPEN', 'ID', 'CLOSE', 'CONTENT', 'OPEN_UNESCAPED', 'ID', 'CLOSE_UNESCAPED', 'CONTENT', 'OPEN', 'ID', 'CLOSE']);
diff --git a/src/handlebars.l b/src/handlebars.l
index ddb7fe9..4205470 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';
}