Skip to content

Commit

Permalink
Merge pull request #730 from wycats/jezell-master
Browse files Browse the repository at this point in the history
Raw block helpers
  • Loading branch information
kpdecker committed Feb 9, 2014
2 parents 7a7ad74 + 14b7ef9 commit fe3b4cc
Show file tree
Hide file tree
Showing 6 changed files with 64 additions and 3 deletions.
14 changes: 14 additions & 0 deletions lib/handlebars/compiler/ast.js
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,20 @@ var AST = {
}
},

RawBlockNode: function(mustache, content, close, locInfo) {
LocationInfo.call(this, locInfo);

if (mustache.sexpr.id.original !== close) {
throw new Exception(mustache.sexpr.id.original + " doesn't match " + close, this);
}

content = new AST.ContentNode(content, locInfo);

this.type = 'block';
this.mustache = mustache;
this.program = new AST.ProgramNode([content], locInfo);
},

ContentNode: function(string, locInfo) {
LocationInfo.call(this, locInfo);
this.type = "content";
Expand Down
2 changes: 1 addition & 1 deletion spec/blocks.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ describe('blocks', function() {

equal(result, "0. goodbye! 1. Goodbye! 2. GOODBYE! cruel world!", "The @index variable is used");
});

it("empty block", function() {
var string = "{{#goodbyes}}{{/goodbyes}}cruel {{world}}!";
var hash = {goodbyes: [{text: "goodbye"}, {text: "Goodbye"}, {text: "GOODBYE"}], world: "world"};
Expand Down
20 changes: 20 additions & 0 deletions spec/helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,26 @@ describe('helpers', function() {
shouldCompileTo(string, [hash, helpers], "<a href='/root/goodbye'>Goodbye</a>");
});

it("helper for raw block gets raw content", function() {
var string = "{{{{raw}}}} {{test}} {{{{/raw}}}}";
var hash = { test: "hello" };
var helpers = { raw: function(options) {
return options.fn();
} };
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(a, b, c, options) {
return options.fn() + 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"};
Expand Down
4 changes: 4 additions & 0 deletions spec/parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,10 @@ describe('parser', function() {
shouldThrow(function() {
ast_for("{{#goodbyes}}{{/hellos}}");
}, Error, /goodbyes doesn't match hellos/);

shouldThrow(function() {
ast_for("{{{{goodbyes}}}} {{{{/hellos}}}}");
}, Error, /goodbyes doesn't match hellos/);
});

it('knows how to report the correct line number in errors', function() {
Expand Down
20 changes: 19 additions & 1 deletion src/handlebars.l
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@

%x mu emu com
%x mu emu com raw

%{

Expand Down Expand Up @@ -49,11 +49,29 @@ ID [^\s!"#%-,\.\/;->@\[-\^`\{-~]+/{LOOKAHEAD}
return 'CONTENT';
}

<raw>"{{{{/"[^\s!"#%-,\.\/;->@\[-\^`\{-~]+/[=}\s\/.]"}}}}" {
yytext = yytext.substr(5, yyleng-9);
this.popState();
return 'END_RAW_BLOCK';
}
<raw>[^\x00]*?/("{{{{/") { return 'CONTENT'; }

<com>[\s\S]*?"--}}" strip(0,4); this.popState(); return 'COMMENT';

<mu>"(" return 'OPEN_SEXPR';
<mu>")" return 'CLOSE_SEXPR';

<mu>"{{{{" { return 'OPEN_RAW_BLOCK'; }
<mu>"}}}}" {
this.popState();
this.begin('raw');
return 'CLOSE_RAW_BLOCK';
}
<mu>"{{{{"[^\x00]*"}}}}" {
yytext = yytext.substr(4, yyleng-8);
this.popState();
return 'RAW_BLOCK';
}
<mu>"{{"{LEFT_STRIP}?">" return 'OPEN_PARTIAL';
<mu>"{{"{LEFT_STRIP}?"#" return 'OPEN_BLOCK';
<mu>"{{"{LEFT_STRIP}?"/" return 'OPEN_ENDBLOCK';
Expand Down
7 changes: 6 additions & 1 deletion src/handlebars.yy
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,19 @@ statements
;

statement
: openInverse program closeBlock -> new yy.BlockNode($1, $2.inverse, $2, $3, @$)
: openRawBlock CONTENT END_RAW_BLOCK -> new yy.RawBlockNode($1, $2, $3, @$)
| openInverse program closeBlock -> new yy.BlockNode($1, $2.inverse, $2, $3, @$)
| openBlock program closeBlock -> new yy.BlockNode($1, $2, $2.inverse, $3, @$)
| mustache -> $1
| partial -> $1
| CONTENT -> new yy.ContentNode($1, @$)
| 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), @$)
;
Expand Down

0 comments on commit fe3b4cc

Please sign in to comment.