fix: prevent zero length tokens in raw-blocks (#1577)

This comment ensures that the lexer is not stuck on zero-length tokens, in raw-blocks like {{{{a}}}} {{{{/a}}}}
This commit is contained in:
Nils Knappmeier
2019-10-20 21:23:02 +02:00
committed by Nils Knappmeier
parent 0b593bfe5d
commit f1752fe66f
3 changed files with 30 additions and 9 deletions
+28 -7
View File
@@ -28,14 +28,35 @@ describe('helpers', function() {
'raw block helper gets raw content'); 'raw block helper gets raw content');
}); });
it('helper for nested raw block gets raw content', function() { describe('raw block parsing (with identity helper-function)', function() {
var string = '{{{{a}}}} {{{{b}}}} {{{{/b}}}} {{{{/a}}}}';
var helpers = { function runWithIdentityHelper(template, expected) {
a: function(options) { var helpers = {
identity: function(options) {
return options.fn(); return options.fn();
} }
}; };
shouldCompileTo(string, [{}, helpers], ' {{{{b}}}} {{{{/b}}}} ', 'raw block helper should get nested raw block as raw content'); shouldCompileTo(template, [{}, helpers], expected);
}
it('helper for nested raw block gets raw content', function() {
runWithIdentityHelper('{{{{identity}}}} {{{{b}}}} {{{{/b}}}} {{{{/identity}}}}', ' {{{{b}}}} {{{{/b}}}} ');
});
it('helper for nested raw block works with empty content', function() {
runWithIdentityHelper('{{{{identity}}}}{{{{/identity}}}}', '');
});
it('helper for nested raw block works if nested raw blocks are broken', function() {
runWithIdentityHelper('{{{{identity}}}} {{{{a}}}} {{{{ {{{{/ }}}} }}}} {{{{/identity}}}}', ' {{{{a}}}} {{{{ {{{{/ }}}} }}}} ');
});
it('helper for nested raw block throw exception when with missing closing braces', function() {
var string = '{{{{a}}}} {{{{/a';
shouldThrow(function() {
Handlebars.compile(string)();
});
});
}); });
it('helper block with identical context', function() { it('helper block with identical context', function() {
+1 -1
View File
@@ -63,7 +63,7 @@ ID [^\s!"#%-,\.\/;->@\[-\^`\{-~]+/{LOOKAHEAD}
return 'END_RAW_BLOCK'; return 'END_RAW_BLOCK';
} }
} }
<raw>[^\x00]*?/("{{{{") { return 'CONTENT'; } <raw>[^\x00]+/("{{{{") { return 'CONTENT'; }
<com>[\s\S]*?"--"{RIGHT_STRIP}?"}}" { <com>[\s\S]*?"--"{RIGHT_STRIP}?"}}" {
this.popState(); this.popState();
+1 -1
View File
@@ -39,7 +39,7 @@ content
}; };
rawBlock rawBlock
: openRawBlock content+ END_RAW_BLOCK -> yy.prepareRawBlock($1, $2, $3, @$) : openRawBlock content* END_RAW_BLOCK -> yy.prepareRawBlock($1, $2, $3, @$)
; ;
openRawBlock openRawBlock