diff --git a/lib/handlebars/compiler/ast.js b/lib/handlebars/compiler/ast.js
index 5a5f514d..b9e67d7f 100644
--- a/lib/handlebars/compiler/ast.js
+++ b/lib/handlebars/compiler/ast.js
@@ -131,6 +131,15 @@ var AST = {
}
},
+ RawBlockNode: function(mustache, content, locInfo) {
+ LocationInfo.call(this, locInfo);
+
+ this.type = 'block';
+ this.mustache = mustache;
+ mustache.sexpr.isHelper = mustache.isHelper = true;
+ mustache.params.splice(0, 0, new AST.StringNode(content, locInfo));
+ },
+
ContentNode: function(string, locInfo) {
LocationInfo.call(this, locInfo);
this.type = "content";
diff --git a/spec/blocks.js b/spec/blocks.js
index b9672af8..8f7c242f 100644
--- a/spec/blocks.js
+++ b/spec/blocks.js
@@ -20,14 +20,6 @@ describe('blocks', function() {
equal(result, "0. goodbye! 1. Goodbye! 2. GOODBYE! cruel world!", "The @index variable is used");
});
-
-
- it("raw block", function() {
- var string = "{{{{ {{test}} }}}}";
- var hash = { test: "hello" };
- shouldCompileTo(string, hash, " {{test}} ",
- "raw block ignores blocks");
- });
it("empty block", function() {
var string = "{{#goodbyes}}{{/goodbyes}}cruel {{world}}!";
diff --git a/spec/helpers.js b/spec/helpers.js
index 904f56a7..b1d97229 100644
--- a/spec/helpers.js
+++ b/spec/helpers.js
@@ -9,6 +9,26 @@ describe('helpers', function() {
shouldCompileTo(string, [hash, helpers], "Goodbye");
});
+ it("helper for raw block gets raw content", function() {
+ var string = "{{{{raw}}}} {{test}} {{{{/raw}}}}";
+ var hash = { test: "hello" };
+ var helpers = { raw: function(content) {
+ return content;
+ } };
+ shouldCompileTo(string, [hash, helpers], " {{test}} ",
+ "raw block helper gets raw content");
+ });
+
+ it("helper for raw block gets parameters", function() {
+ var string = "{{{{raw 1 2 3}}}} {{test}} {{{{/raw}}}}";
+ var hash = { test: "hello" };
+ var helpers = { raw: function(content, a, b, c) {
+ return content + a + b + c;
+ } };
+ shouldCompileTo(string, [hash, helpers], " {{test}} 123",
+ "raw block helper gets raw content");
+ });
+
it("helper block with complex lookup expression", function() {
var string = "{{#goodbyes}}{{../name}}{{/goodbyes}}";
var hash = {name: "Alan"};
diff --git a/src/handlebars.l b/src/handlebars.l
index 51e921ae..9b126652 100644
--- a/src/handlebars.l
+++ b/src/handlebars.l
@@ -1,5 +1,5 @@
-%x mu emu com
+%x mu emu com raw
%{
@@ -49,11 +49,16 @@ ID [^\s!"#%-,\.\/;->@\[-\^`\{-~]+/{LOOKAHEAD}
return 'CONTENT';
}
+"{{{{/"[^\s!"#%-,\.\/;->@\[-\^`\{-~]+/[=}\s\/.]"}}}}" { yytext = yytext.substr(5, yyleng-9); this.popState(); return 'END_RAW_BLOCK'; }
+[^\x00]*?/("{{{{/") { return 'CONTENT'; }
+
[\s\S]*?"--}}" strip(0,4); this.popState(); return 'COMMENT';
"(" return 'OPEN_SEXPR';
")" return 'CLOSE_SEXPR';
+"{{{{" { return 'OPEN_RAW_BLOCK'; }
+"}}}}" { this.popState(); this.begin('raw'); return 'CLOSE_RAW_BLOCK'; }
"{{{{"[^\x00]*"}}}}" {
yytext = yytext.substr(4, yyleng-8);
this.popState();
diff --git a/src/handlebars.yy b/src/handlebars.yy
index 8b5b7745..464d1bab 100644
--- a/src/handlebars.yy
+++ b/src/handlebars.yy
@@ -35,7 +35,7 @@ statements
;
statement
- : RAW_BLOCK { $$ = new yy.ContentNode($1, @$); }
+ : openRawBlock CONTENT END_RAW_BLOCK -> new yy.RawBlockNode($1, $2, @$)
| openInverse program closeBlock -> new yy.BlockNode($1, $2.inverse, $2, $3, @$)
| openBlock program closeBlock -> new yy.BlockNode($1, $2, $2.inverse, $3, @$)
| mustache -> $1
@@ -44,6 +44,10 @@ statement
| COMMENT -> new yy.CommentNode($1, @$)
;
+openRawBlock
+ : OPEN_RAW_BLOCK sexpr CLOSE_RAW_BLOCK -> new yy.MustacheNode($2, null, '', '', @$)
+ ;
+
openBlock
: OPEN_BLOCK sexpr CLOSE -> new yy.MustacheNode($2, null, $1, stripFlags($1, $3), @$)
;