Skip to content

Commit d912e54

Browse files
committed
Add whitespace trimming functionality for notes and expressions
1 parent 1963975 commit d912e54

4 files changed

Lines changed: 41 additions & 41 deletions

File tree

src/main/java/com/hubspot/jinjava/tree/TreeParser.java

Lines changed: 22 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,7 @@ public Node buildTree() {
6262
Node node = nextNode();
6363

6464
if (node != null) {
65-
if (node instanceof TextNode && getLastSibling() instanceof TextNode) {
66-
// merge adjacent text nodes so whitespace control properly applies
67-
getLastSibling().getMaster().mergeImageAndContent(node.getMaster());
68-
} else {
69-
parent.getChildren().add(node);
70-
}
65+
parent.getChildren().add(node);
7166
}
7267
}
7368

@@ -96,6 +91,12 @@ public Node buildTree() {
9691

9792
private Node nextNode() {
9893
Token token = scanner.next();
94+
if (token.isLeftTrim()) {
95+
final Node lastSibling = getLastSibling();
96+
if (lastSibling instanceof TextNode) {
97+
lastSibling.getMaster().setRightTrim(true);
98+
}
99+
}
99100

100101
if (token.getType() == symbols.getFixed()) {
101102
if (token instanceof UnclosedToken) {
@@ -170,7 +171,7 @@ private Node text(TextToken textToken) {
170171
final Node lastSibling = getLastSibling();
171172

172173
// if last sibling was a tag and has rightTrimAfterEnd, strip whitespace
173-
if (lastSibling instanceof TagNode && isRightTrim((TagNode) lastSibling)) {
174+
if (lastSibling != null && isRightTrim(lastSibling)) {
174175
textToken.setLeftTrim(true);
175176
}
176177

@@ -186,18 +187,21 @@ private Node text(TextToken textToken) {
186187
return n;
187188
}
188189

189-
private boolean isRightTrim(TagNode lastSibling) {
190-
return (
191-
lastSibling.getEndName() == null ||
192-
(
193-
lastSibling.getTag() instanceof FlexibleTag &&
194-
!((FlexibleTag) lastSibling.getTag()).hasEndTag(
195-
(TagToken) lastSibling.getMaster()
196-
)
190+
private boolean isRightTrim(Node lastSibling) {
191+
if (lastSibling instanceof TagNode) {
192+
return (
193+
((TagNode) lastSibling).getEndName() == null ||
194+
(
195+
((TagNode) lastSibling).getTag() instanceof FlexibleTag &&
196+
!((FlexibleTag) ((TagNode) lastSibling).getTag()).hasEndTag(
197+
(TagToken) lastSibling.getMaster()
198+
)
199+
)
197200
)
198-
)
199-
? lastSibling.getMaster().isRightTrim()
200-
: lastSibling.getMaster().isRightTrimAfterEnd();
201+
? lastSibling.getMaster().isRightTrim()
202+
: lastSibling.getMaster().isRightTrimAfterEnd();
203+
}
204+
return lastSibling.getMaster().isRightTrim();
201205
}
202206

203207
private Node expression(ExpressionToken expressionToken) {
@@ -242,14 +246,6 @@ private Node tag(TagToken tagToken) {
242246
if (tag instanceof EndTag) {
243247
endTag(tag, tagToken);
244248
return null;
245-
} else {
246-
// if a tag has left trim, mark the last sibling to trim right whitespace
247-
if (tagToken.isLeftTrim()) {
248-
final Node lastSibling = getLastSibling();
249-
if (lastSibling instanceof TextNode) {
250-
lastSibling.getMaster().setRightTrim(true);
251-
}
252-
}
253249
}
254250

255251
TagNode node = new TagNode(tag, tagToken, symbols);
@@ -268,16 +264,6 @@ private Node tag(TagToken tagToken) {
268264
}
269265

270266
private void endTag(Tag tag, TagToken tagToken) {
271-
final Node lastSibling = getLastSibling();
272-
273-
if (
274-
parent instanceof TagNode &&
275-
tagToken.isLeftTrim() &&
276-
lastSibling instanceof TextNode
277-
) {
278-
lastSibling.getMaster().setRightTrim(true);
279-
}
280-
281267
if (parent.getMaster() != null) { // root node
282268
parent.getMaster().setRightTrimAfterEnd(tagToken.isRightTrim());
283269
}

src/main/java/com/hubspot/jinjava/tree/parse/NoteToken.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
**********************************************************************/
1616
package com.hubspot.jinjava.tree.parse;
1717

18+
import org.apache.commons.lang3.StringUtils;
19+
1820
public class NoteToken extends Token {
1921
private static final long serialVersionUID = -3859011447900311329L;
2022

@@ -37,6 +39,9 @@ public int getType() {
3739
*/
3840
@Override
3941
protected void parse() {
42+
if (StringUtils.isNotEmpty(image)) {
43+
handleTrim(image.substring(2, image.length() - 2));
44+
}
4045
content = "";
4146
}
4247

src/main/java/com/hubspot/jinjava/tree/parse/Token.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,6 @@ public String getImage() {
5353
return image;
5454
}
5555

56-
public void mergeImageAndContent(Token otherToken) {
57-
this.image = image + otherToken.image;
58-
this.content = content + otherToken.content;
59-
}
60-
6156
public int getLineNumber() {
6257
return lineNumber;
6358
}

src/test/java/com/hubspot/jinjava/tree/TreeParserTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,20 @@ public void itWarnsTwiceAgainstUnclosedBlockTag() {
224224
assertThat(interpreter.getErrors().get(1).getLineno()).isEqualTo(1);
225225
}
226226

227+
@Test
228+
public void itTrimsNotes() {
229+
String expression = "A\n{#- note -#}\nB";
230+
final Node tree = new TreeParser(interpreter, expression).buildTree();
231+
assertThat(interpreter.render(tree)).isEqualTo("AB");
232+
}
233+
234+
@Test
235+
public void itTrimsExpressions() {
236+
String expression = "A\n{{- 'B' -}}\nC";
237+
final Node tree = new TreeParser(interpreter, expression).buildTree();
238+
assertThat(interpreter.render(tree)).isEqualTo("ABC");
239+
}
240+
227241
Node parse(String fixture) {
228242
try {
229243
return new TreeParser(

0 commit comments

Comments
 (0)