Skip to content

Commit eafc139

Browse files
committed
Add legacy override to turn on trimming for notes and expressions
1 parent cda07c0 commit eafc139

File tree

3 files changed

+65
-5
lines changed

3 files changed

+65
-5
lines changed

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

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public class LegacyOverrides {
1616
.withUseNaturalOperatorPrecedence(true)
1717
.withParseWhitespaceControlStrictly(true)
1818
.withAllowAdjacentTextNodes(true)
19+
.withUseTrimmingForNotesAndExpressions(true)
1920
.build();
2021
private final boolean evaluateMapKeys;
2122
private final boolean iterateOverMapKeys;
@@ -25,6 +26,7 @@ public class LegacyOverrides {
2526
private final boolean useNaturalOperatorPrecedence;
2627
private final boolean parseWhitespaceControlStrictly;
2728
private final boolean allowAdjacentTextNodes;
29+
private final boolean useTrimmingForNotesAndExpressions;
2830

2931
private LegacyOverrides(Builder builder) {
3032
evaluateMapKeys = builder.evaluateMapKeys;
@@ -35,6 +37,7 @@ private LegacyOverrides(Builder builder) {
3537
useNaturalOperatorPrecedence = builder.useNaturalOperatorPrecedence;
3638
parseWhitespaceControlStrictly = builder.parseWhitespaceControlStrictly;
3739
allowAdjacentTextNodes = builder.allowAdjacentTextNodes;
40+
useTrimmingForNotesAndExpressions = builder.useTrimmingForNotesAndExpressions;
3841
}
3942

4043
public static Builder newBuilder() {
@@ -73,6 +76,10 @@ public boolean isAllowAdjacentTextNodes() {
7376
return allowAdjacentTextNodes;
7477
}
7578

79+
public boolean isUseTrimmingForNotesAndExpressions() {
80+
return useTrimmingForNotesAndExpressions;
81+
}
82+
7683
public static class Builder {
7784
private boolean evaluateMapKeys = false;
7885
private boolean iterateOverMapKeys = false;
@@ -82,6 +89,7 @@ public static class Builder {
8289
private boolean useNaturalOperatorPrecedence = false;
8390
private boolean parseWhitespaceControlStrictly = false;
8491
private boolean allowAdjacentTextNodes = false;
92+
private boolean useTrimmingForNotesAndExpressions = false;
8593

8694
private Builder() {}
8795

@@ -102,7 +110,10 @@ public static Builder from(LegacyOverrides legacyOverrides) {
102110
.withParseWhitespaceControlStrictly(
103111
legacyOverrides.parseWhitespaceControlStrictly
104112
)
105-
.withAllowAdjacentTextNodes(legacyOverrides.allowAdjacentTextNodes);
113+
.withAllowAdjacentTextNodes(legacyOverrides.allowAdjacentTextNodes)
114+
.withUseTrimmingForNotesAndExpressions(
115+
legacyOverrides.useTrimmingForNotesAndExpressions
116+
);
106117
}
107118

108119
public Builder withEvaluateMapKeys(boolean evaluateMapKeys) {
@@ -150,5 +161,12 @@ public Builder withAllowAdjacentTextNodes(boolean allowAdjacentTextNodes) {
150161
this.allowAdjacentTextNodes = allowAdjacentTextNodes;
151162
return this;
152163
}
164+
165+
public Builder withUseTrimmingForNotesAndExpressions(
166+
boolean useTrimmingForNotesAndExpressions
167+
) {
168+
this.useTrimmingForNotesAndExpressions = useTrimmingForNotesAndExpressions;
169+
return this;
170+
}
153171
}
154172
}

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import com.google.common.collect.Iterators;
1919
import com.google.common.collect.PeekingIterator;
20+
import com.hubspot.jinjava.JinjavaConfig;
2021
import com.hubspot.jinjava.interpret.DisabledException;
2122
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
2223
import com.hubspot.jinjava.interpret.MissingEndTagException;
@@ -102,7 +103,7 @@ public Node buildTree() {
102103

103104
private Node nextNode() {
104105
Token token = scanner.next();
105-
if (token.isLeftTrim()) {
106+
if (token.isLeftTrim() && isTrimmingEnabledForToken(token, interpreter.getConfig())) {
106107
final Node lastSibling = getLastSibling();
107108
if (lastSibling instanceof TextNode) {
108109
lastSibling.getMaster().setRightTrim(true);
@@ -182,7 +183,11 @@ private Node text(TextToken textToken) {
182183
final Node lastSibling = getLastSibling();
183184

184185
// if last sibling was a tag and has rightTrimAfterEnd, strip whitespace
185-
if (lastSibling != null && isRightTrim(lastSibling)) {
186+
if (
187+
lastSibling != null &&
188+
isRightTrim(lastSibling) &&
189+
isTrimmingEnabledForToken(lastSibling.getMaster(), interpreter.getConfig())
190+
) {
186191
textToken.setLeftTrim(true);
187192
}
188193

@@ -315,4 +320,11 @@ private void endTag(Tag tag, TagToken tagToken) {
315320
);
316321
}
317322
}
323+
324+
private boolean isTrimmingEnabledForToken(Token token, JinjavaConfig jinjavaConfig) {
325+
if (token instanceof TagToken || token instanceof TextToken) {
326+
return true;
327+
}
328+
return jinjavaConfig.getLegacyOverrides().isUseTrimmingForNotesAndExpressions();
329+
}
318330
}

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

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,22 @@ public void itWarnsTwiceAgainstUnclosedBlockTag() {
229229
public void itTrimsNotes() {
230230
String expression = "A\n{#- note -#}\nB";
231231
final Node tree = new TreeParser(interpreter, expression).buildTree();
232-
assertThat(interpreter.render(tree)).isEqualTo("AB");
232+
assertThat(interpreter.render(tree)).isEqualTo("A\n\nB");
233+
interpreter =
234+
new Jinjava(
235+
JinjavaConfig
236+
.newBuilder()
237+
.withLegacyOverrides(
238+
LegacyOverrides
239+
.newBuilder()
240+
.withUseTrimmingForNotesAndExpressions(true)
241+
.build()
242+
)
243+
.build()
244+
)
245+
.newInterpreter();
246+
final Node newTree = new TreeParser(interpreter, expression).buildTree();
247+
assertThat(interpreter.render(newTree)).isEqualTo("AB");
233248
}
234249

235250
@Test
@@ -243,7 +258,22 @@ public void itMergesTextNodesWhileRespectingTrim() {
243258
public void itTrimsExpressions() {
244259
String expression = "A\n{{- 'B' -}}\nC";
245260
final Node tree = new TreeParser(interpreter, expression).buildTree();
246-
assertThat(interpreter.render(tree)).isEqualTo("ABC");
261+
assertThat(interpreter.render(tree)).isEqualTo("A\nB\nC");
262+
interpreter =
263+
new Jinjava(
264+
JinjavaConfig
265+
.newBuilder()
266+
.withLegacyOverrides(
267+
LegacyOverrides
268+
.newBuilder()
269+
.withUseTrimmingForNotesAndExpressions(true)
270+
.build()
271+
)
272+
.build()
273+
)
274+
.newInterpreter();
275+
final Node newTree = new TreeParser(interpreter, expression).buildTree();
276+
assertThat(interpreter.render(newTree)).isEqualTo("ABC");
247277
}
248278

249279
@Test

0 commit comments

Comments
 (0)