Skip to content

Commit 35b2551

Browse files
committed
Add back legacy behaviour of merging adjacent text nodes with the option to override the legacy behaviour
1 parent 264ac2b commit 35b2551

4 files changed

Lines changed: 49 additions & 2 deletions

File tree

src/main/java/com/hubspot/jinjava/LegacyOverrides.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public class LegacyOverrides {
1313
private final boolean whitespaceRequiredWithinTokens;
1414
private final boolean useNaturalOperatorPrecedence;
1515
private final boolean parseWhitespaceControlStrictly;
16+
private final boolean allowAdjacentTextNodes;
1617

1718
private LegacyOverrides(Builder builder) {
1819
evaluateMapKeys = builder.evaluateMapKeys;
@@ -22,6 +23,7 @@ private LegacyOverrides(Builder builder) {
2223
whitespaceRequiredWithinTokens = builder.whitespaceRequiredWithinTokens;
2324
useNaturalOperatorPrecedence = builder.useNaturalOperatorPrecedence;
2425
parseWhitespaceControlStrictly = builder.parseWhitespaceControlStrictly;
26+
allowAdjacentTextNodes = builder.allowAdjacentTextNodes;
2527
}
2628

2729
public static Builder newBuilder() {
@@ -56,6 +58,10 @@ public boolean isParseWhitespaceControlStrictly() {
5658
return parseWhitespaceControlStrictly;
5759
}
5860

61+
public boolean isAllowAdjacentTextNodes() {
62+
return allowAdjacentTextNodes;
63+
}
64+
5965
public static class Builder {
6066
private boolean evaluateMapKeys = false;
6167
private boolean iterateOverMapKeys = false;
@@ -64,6 +70,7 @@ public static class Builder {
6470
private boolean whitespaceRequiredWithinTokens = false;
6571
private boolean useNaturalOperatorPrecedence = false;
6672
private boolean parseWhitespaceControlStrictly = false;
73+
private boolean allowAdjacentTextNodes = false;
6774

6875
private Builder() {}
6976

@@ -83,7 +90,8 @@ public static Builder from(LegacyOverrides legacyOverrides) {
8390
.withUseNaturalOperatorPrecedence(legacyOverrides.useNaturalOperatorPrecedence)
8491
.withParseWhitespaceControlStrictly(
8592
legacyOverrides.parseWhitespaceControlStrictly
86-
);
93+
)
94+
.withAllowAdjacentTextNodes(legacyOverrides.allowAdjacentTextNodes);
8795
}
8896

8997
public Builder withEvaluateMapKeys(boolean evaluateMapKeys) {
@@ -126,5 +134,10 @@ public Builder withParseWhitespaceControlStrictly(
126134
this.parseWhitespaceControlStrictly = parseWhitespaceControlStrictly;
127135
return this;
128136
}
137+
138+
public Builder withAllowAdjacentTextNodes(boolean allowAdjacentTextNodes) {
139+
this.allowAdjacentTextNodes = allowAdjacentTextNodes;
140+
return this;
141+
}
129142
}
130143
}

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,16 @@ public Node buildTree() {
6262
Node node = nextNode();
6363

6464
if (node != null) {
65-
parent.getChildren().add(node);
65+
if (
66+
node instanceof TextNode &&
67+
getLastSibling() instanceof TextNode &&
68+
!interpreter.getConfig().getLegacyOverrides().isAllowAdjacentTextNodes()
69+
) {
70+
// merge adjacent text nodes so whitespace control properly applies
71+
getLastSibling().getMaster().mergeImageAndContent(node.getMaster());
72+
} else {
73+
parent.getChildren().add(node);
74+
}
6675
}
6776
}
6877

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ 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+
5661
public int getLineNumber() {
5762
return lineNumber;
5863
}

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.hubspot.jinjava.BaseInterpretingTest;
77
import com.hubspot.jinjava.Jinjava;
88
import com.hubspot.jinjava.JinjavaConfig;
9+
import com.hubspot.jinjava.LegacyOverrides;
910
import com.hubspot.jinjava.interpret.TemplateError.ErrorType;
1011
import java.nio.charset.StandardCharsets;
1112
import org.junit.Test;
@@ -238,6 +239,25 @@ public void itTrimsExpressions() {
238239
assertThat(interpreter.render(tree)).isEqualTo("ABC");
239240
}
240241

242+
@Test
243+
public void itDoesNotMergeAdjacentTextNodesWhenLegacyOverrideIsApplied() {
244+
String expression = "A\n{%- if true -%}\n{# comment #}\nB{% endif %}";
245+
final Node tree = new TreeParser(interpreter, expression).buildTree();
246+
assertThat(interpreter.render(tree)).isEqualTo("AB");
247+
interpreter =
248+
new Jinjava(
249+
JinjavaConfig
250+
.newBuilder()
251+
.withLegacyOverrides(
252+
LegacyOverrides.newBuilder().withAllowAdjacentTextNodes(true).build()
253+
)
254+
.build()
255+
)
256+
.newInterpreter();
257+
final Node overriddenTree = new TreeParser(interpreter, expression).buildTree();
258+
assertThat(interpreter.render(overriddenTree)).isEqualTo("A\nB");
259+
}
260+
241261
Node parse(String fixture) {
242262
try {
243263
return new TreeParser(

0 commit comments

Comments
 (0)