Skip to content

Commit

Permalink
Support parameters for partials
Browse files Browse the repository at this point in the history
Partials can now take params, hashes.

See handlebars-lang/handlebars.js#182 for detail.
  • Loading branch information
dmarcotte committed Nov 9, 2014
1 parent e26a445 commit eef8536
Show file tree
Hide file tree
Showing 8 changed files with 83 additions and 10 deletions.
23 changes: 16 additions & 7 deletions handlebars/src/com/dmarcotte/handlebars/parsing/HbParsing.java
Original file line number Diff line number Diff line change
Expand Up @@ -311,8 +311,8 @@ else if (builder.getTokenType() == OPEN_UNESCAPED) {

/**
* partial
* : OPEN_PARTIAL partialName CLOSE { $$ = new yy.PartialNode($2); }
* | OPEN_PARTIAL partialName path CLOSE { $$ = new yy.PartialNode($2, $3); }
* : OPEN_PARTIAL partialName param hash? CLOSE
* | OPEN_PARTIAL partialName hash? CLOSE
* ;
*/
protected void parsePartial(PsiBuilder builder) {
Expand All @@ -322,13 +322,22 @@ protected void parsePartial(PsiBuilder builder) {

parsePartialName(builder);

// parse the optional path
PsiBuilder.Marker optionalPathMarker = builder.mark();
if (parsePath(builder)) {
optionalPathMarker.drop();
// parse the optional param
PsiBuilder.Marker optionalParamMarker = builder.mark();
if (parseParam(builder)) {
optionalParamMarker.drop();
}
else {
optionalParamMarker.rollbackTo();
}

// parse the optional hash
PsiBuilder.Marker optionalHashMarker = builder.mark();
if (parseHash(builder)) {
optionalHashMarker.drop();
}
else {
optionalPathMarker.rollbackTo();
optionalHashMarker.rollbackTo();
}

parseLeafTokenGreedy(builder, CLOSE);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{{> foo bar bat=baz}}
26 changes: 26 additions & 0 deletions handlebars/test/data/parser/ParsesPartialWithContextAndHash.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
HbFile:ParsesPartialWithContextAndHash.hbs
HbStatementsImpl(STATEMENTS)
HbPartialImpl(PARTIAL_STACHE)
HbPsiElementImpl([Hb] OPEN_PARTIAL)
PsiElement([Hb] OPEN_PARTIAL)('{{>')
PsiWhiteSpace(' ')
HbPartialNameImpl(PARTIAL_NAME)
HbPathImpl(PATH)
HbPsiElementImpl([Hb] ID)
PsiElement([Hb] ID)('foo')
PsiWhiteSpace(' ')
HbParamImpl(PARAM)
HbPathImpl(PATH)
HbPsiElementImpl([Hb] ID)
PsiElement([Hb] ID)('bar')
PsiWhiteSpace(' ')
HbPsiElementImpl([Hb] ID)
PsiElement([Hb] ID)('bat')
HbPsiElementImpl([Hb] EQUALS)
PsiElement([Hb] EQUALS)('=')
HbParamImpl(PARAM)
HbPathImpl(PATH)
HbPsiElementImpl([Hb] ID)
PsiElement([Hb] ID)('baz')
HbPsiElementImpl([Hb] CLOSE)
PsiElement([Hb] CLOSE)('}}')
1 change: 1 addition & 0 deletions handlebars/test/data/parser/ParsesPartialWithHash.hbs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{{> foo bar=bat}}
21 changes: 21 additions & 0 deletions handlebars/test/data/parser/ParsesPartialWithHash.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
HbFile:ParsesPartialWithHash.hbs
HbStatementsImpl(STATEMENTS)
HbPartialImpl(PARTIAL_STACHE)
HbPsiElementImpl([Hb] OPEN_PARTIAL)
PsiElement([Hb] OPEN_PARTIAL)('{{>')
PsiWhiteSpace(' ')
HbPartialNameImpl(PARTIAL_NAME)
HbPathImpl(PATH)
HbPsiElementImpl([Hb] ID)
PsiElement([Hb] ID)('foo')
PsiWhiteSpace(' ')
HbPsiElementImpl([Hb] ID)
PsiElement([Hb] ID)('bar')
HbPsiElementImpl([Hb] EQUALS)
PsiElement([Hb] EQUALS)('=')
HbParamImpl(PARAM)
HbPathImpl(PATH)
HbPsiElementImpl([Hb] ID)
PsiElement([Hb] ID)('bat')
HbPsiElementImpl([Hb] CLOSE)
PsiElement([Hb] CLOSE)('}}')
7 changes: 4 additions & 3 deletions handlebars/test/data/parser/PartialWithContext.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@ HbFile:PartialWithContext.hbs
HbPsiElementImpl([Hb] ID)
PsiElement([Hb] ID)('foo')
PsiWhiteSpace(' ')
HbPathImpl(PATH)
HbPsiElementImpl([Hb] ID)
PsiElement([Hb] ID)('bar')
HbParamImpl(PARAM)
HbPathImpl(PATH)
HbPsiElementImpl([Hb] ID)
PsiElement([Hb] ID)('bar')
HbPsiElementImpl([Hb] CLOSE)
PsiElement([Hb] CLOSE)('}}')
Original file line number Diff line number Diff line change
Expand Up @@ -256,4 +256,10 @@ public void testDecimalNumberAsMustacheHashParam() {
result.shouldMatchTokenTypes(OPEN, ID, WHITE_SPACE, ID, EQUALS, NUMBER, CLOSE);
result.shouldMatchTokenContent("{{", "name", " ", "paramValue", "=", "10.1", "}}");
}

public void testDataParamsForPartials() {
TokenizerResult result = tokenize("{{>foo @bar.baz}}");
result.shouldMatchTokenTypes(OPEN_PARTIAL, ID, WHITE_SPACE, DATA_PREFIX, ID, SEP, ID, CLOSE);
result.shouldMatchTokenContent("{{>", "foo", " ", "@", "bar", ".", "baz", "}}");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,14 @@ public void testPartialWithContext() {
doTest(true);
}

public void testParsesPartialWithHash() {
doTest(true);
}

public void testParsesPartialWithContextAndHash() {
doTest(true);
}

public void testPartialWithComplexName() {
doTest(true);
}
Expand Down

0 comments on commit eef8536

Please sign in to comment.