Skip to content

Commit 75b8b73

Browse files
dmarcotteanstarovoyt
authored andcommitted
Support parameters for partials
Partials can now take params, hashes. See handlebars-lang/handlebars.js#182 for detail. (cherry picked from commit 7625f54)
1 parent d0d3156 commit 75b8b73

File tree

8 files changed

+83
-10
lines changed

8 files changed

+83
-10
lines changed

handlebars/src/com/dmarcotte/handlebars/parsing/HbParsing.java

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -311,8 +311,8 @@ else if (builder.getTokenType() == OPEN_UNESCAPED) {
311311

312312
/**
313313
* partial
314-
* : OPEN_PARTIAL partialName CLOSE { $$ = new yy.PartialNode($2); }
315-
* | OPEN_PARTIAL partialName path CLOSE { $$ = new yy.PartialNode($2, $3); }
314+
* : OPEN_PARTIAL partialName param hash? CLOSE
315+
* | OPEN_PARTIAL partialName hash? CLOSE
316316
* ;
317317
*/
318318
protected void parsePartial(PsiBuilder builder) {
@@ -322,13 +322,22 @@ protected void parsePartial(PsiBuilder builder) {
322322

323323
parsePartialName(builder);
324324

325-
// parse the optional path
326-
PsiBuilder.Marker optionalPathMarker = builder.mark();
327-
if (parsePath(builder)) {
328-
optionalPathMarker.drop();
325+
// parse the optional param
326+
PsiBuilder.Marker optionalParamMarker = builder.mark();
327+
if (parseParam(builder)) {
328+
optionalParamMarker.drop();
329+
}
330+
else {
331+
optionalParamMarker.rollbackTo();
332+
}
333+
334+
// parse the optional hash
335+
PsiBuilder.Marker optionalHashMarker = builder.mark();
336+
if (parseHash(builder)) {
337+
optionalHashMarker.drop();
329338
}
330339
else {
331-
optionalPathMarker.rollbackTo();
340+
optionalHashMarker.rollbackTo();
332341
}
333342

334343
parseLeafTokenGreedy(builder, CLOSE);
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{{> foo bar bat=baz}}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
HbFile:ParsesPartialWithContextAndHash.hbs
2+
HbStatementsImpl(STATEMENTS)
3+
HbPartialImpl(PARTIAL_STACHE)
4+
HbPsiElementImpl([Hb] OPEN_PARTIAL)
5+
PsiElement([Hb] OPEN_PARTIAL)('{{>')
6+
PsiWhiteSpace(' ')
7+
HbPartialNameImpl(PARTIAL_NAME)
8+
HbPathImpl(PATH)
9+
HbPsiElementImpl([Hb] ID)
10+
PsiElement([Hb] ID)('foo')
11+
PsiWhiteSpace(' ')
12+
HbParamImpl(PARAM)
13+
HbPathImpl(PATH)
14+
HbPsiElementImpl([Hb] ID)
15+
PsiElement([Hb] ID)('bar')
16+
PsiWhiteSpace(' ')
17+
HbPsiElementImpl([Hb] ID)
18+
PsiElement([Hb] ID)('bat')
19+
HbPsiElementImpl([Hb] EQUALS)
20+
PsiElement([Hb] EQUALS)('=')
21+
HbParamImpl(PARAM)
22+
HbPathImpl(PATH)
23+
HbPsiElementImpl([Hb] ID)
24+
PsiElement([Hb] ID)('baz')
25+
HbPsiElementImpl([Hb] CLOSE)
26+
PsiElement([Hb] CLOSE)('}}')
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{{> foo bar=bat}}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
HbFile:ParsesPartialWithHash.hbs
2+
HbStatementsImpl(STATEMENTS)
3+
HbPartialImpl(PARTIAL_STACHE)
4+
HbPsiElementImpl([Hb] OPEN_PARTIAL)
5+
PsiElement([Hb] OPEN_PARTIAL)('{{>')
6+
PsiWhiteSpace(' ')
7+
HbPartialNameImpl(PARTIAL_NAME)
8+
HbPathImpl(PATH)
9+
HbPsiElementImpl([Hb] ID)
10+
PsiElement([Hb] ID)('foo')
11+
PsiWhiteSpace(' ')
12+
HbPsiElementImpl([Hb] ID)
13+
PsiElement([Hb] ID)('bar')
14+
HbPsiElementImpl([Hb] EQUALS)
15+
PsiElement([Hb] EQUALS)('=')
16+
HbParamImpl(PARAM)
17+
HbPathImpl(PATH)
18+
HbPsiElementImpl([Hb] ID)
19+
PsiElement([Hb] ID)('bat')
20+
HbPsiElementImpl([Hb] CLOSE)
21+
PsiElement([Hb] CLOSE)('}}')

handlebars/test/data/parser/PartialWithContext.txt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ HbFile:PartialWithContext.hbs
99
HbPsiElementImpl([Hb] ID)
1010
PsiElement([Hb] ID)('foo')
1111
PsiWhiteSpace(' ')
12-
HbPathImpl(PATH)
13-
HbPsiElementImpl([Hb] ID)
14-
PsiElement([Hb] ID)('bar')
12+
HbParamImpl(PARAM)
13+
HbPathImpl(PATH)
14+
HbPsiElementImpl([Hb] ID)
15+
PsiElement([Hb] ID)('bar')
1516
HbPsiElementImpl([Hb] CLOSE)
1617
PsiElement([Hb] CLOSE)('}}')

handlebars/test/src/com/dmarcotte/handlebars/parsing/HbLexerFreeFormTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,4 +256,10 @@ public void testDecimalNumberAsMustacheHashParam() {
256256
result.shouldMatchTokenTypes(OPEN, ID, WHITE_SPACE, ID, EQUALS, NUMBER, CLOSE);
257257
result.shouldMatchTokenContent("{{", "name", " ", "paramValue", "=", "10.1", "}}");
258258
}
259+
260+
public void testDataParamsForPartials() {
261+
TokenizerResult result = tokenize("{{>foo @bar.baz}}");
262+
result.shouldMatchTokenTypes(OPEN_PARTIAL, ID, WHITE_SPACE, DATA_PREFIX, ID, SEP, ID, CLOSE);
263+
result.shouldMatchTokenContent("{{>", "foo", " ", "@", "bar", ".", "baz", "}}");
264+
}
259265
}

handlebars/test/src/com/dmarcotte/handlebars/parsing/HbParserSpecTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,14 @@ public void testPartialWithContext() {
6767
doTest(true);
6868
}
6969

70+
public void testParsesPartialWithHash() {
71+
doTest(true);
72+
}
73+
74+
public void testParsesPartialWithContextAndHash() {
75+
doTest(true);
76+
}
77+
7078
public void testPartialWithComplexName() {
7179
doTest(true);
7280
}

0 commit comments

Comments
 (0)