From 3b58ca8c5d69f8032e65b1f768c96843018e4072 Mon Sep 17 00:00:00 2001 From: Rachel Waddell <48857818+rewaddell@users.noreply.github.com> Date: Mon, 22 Jun 2026 10:03:38 -0400 Subject: [PATCH 1/5] Handle empty strings in StrictWhitespaceControlParser --- .../tree/parse/StrictWhitespaceControlParser.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/hubspot/jinjava/tree/parse/StrictWhitespaceControlParser.java b/src/main/java/com/hubspot/jinjava/tree/parse/StrictWhitespaceControlParser.java index 78450465a..f2ef3de1d 100644 --- a/src/main/java/com/hubspot/jinjava/tree/parse/StrictWhitespaceControlParser.java +++ b/src/main/java/com/hubspot/jinjava/tree/parse/StrictWhitespaceControlParser.java @@ -4,21 +4,23 @@ public class StrictWhitespaceControlParser implements WhitespaceControlParser { @Override public boolean hasLeftTrim(String unwrapped) { - return unwrapped.charAt(0) == '-'; + return !unwrapped.isEmpty() && unwrapped.charAt(0) == '-'; } @Override public String stripLeft(String unwrapped) { - return unwrapped.substring(1); + return unwrapped.isEmpty() ? unwrapped : unwrapped.substring(1); } @Override public boolean hasRightTrim(String unwrapped) { - return unwrapped.charAt(unwrapped.length() - 1) == '-'; + return !unwrapped.isEmpty() && unwrapped.charAt(unwrapped.length() - 1) == '-'; } @Override public String stripRight(String unwrapped) { - return unwrapped.substring(0, unwrapped.length() - 1); + return unwrapped.isEmpty() + ? unwrapped + : unwrapped.substring(0, unwrapped.length() - 1); } } From 0282078c6dd7c78b11aaa268f82c08425bb61e0f Mon Sep 17 00:00:00 2001 From: Rachel Waddell <48857818+rewaddell@users.noreply.github.com> Date: Mon, 22 Jun 2026 10:04:50 -0400 Subject: [PATCH 2/5] Add whitespace test to legacy whitespace --- .../interpret/LegacyWhitespaceControlParsingTest.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/test/java/com/hubspot/jinjava/interpret/LegacyWhitespaceControlParsingTest.java b/src/test/java/com/hubspot/jinjava/interpret/LegacyWhitespaceControlParsingTest.java index 09289d4b5..b146bcc08 100644 --- a/src/test/java/com/hubspot/jinjava/interpret/LegacyWhitespaceControlParsingTest.java +++ b/src/test/java/com/hubspot/jinjava/interpret/LegacyWhitespaceControlParsingTest.java @@ -82,4 +82,12 @@ public void itErrorsOnSpacedDashesOnBothSides() { .isThrownBy(() -> modern.render(template, new HashMap<>())) .withMessageContaining("syntax error at position 9"); } + + + @Test + public void itHandlesEmptyExpressionToken() { + String template = "{{}}"; + + assertThat(modern.render(template, new HashMap<>())).isEqualTo(""); + } } From 135f8555109a0dab7139b19b86bd74fab989240b Mon Sep 17 00:00:00 2001 From: Rachel Waddell <48857818+rewaddell@users.noreply.github.com> Date: Mon, 22 Jun 2026 10:05:52 -0400 Subject: [PATCH 3/5] Create StrictWhitespaceControlParserTest --- .../parse/StrictWhitespaceControlParserTest | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 src/test/java/com/hubspot/jinjava/tree/parse/StrictWhitespaceControlParserTest diff --git a/src/test/java/com/hubspot/jinjava/tree/parse/StrictWhitespaceControlParserTest b/src/test/java/com/hubspot/jinjava/tree/parse/StrictWhitespaceControlParserTest new file mode 100644 index 000000000..b0343e287 --- /dev/null +++ b/src/test/java/com/hubspot/jinjava/tree/parse/StrictWhitespaceControlParserTest @@ -0,0 +1,48 @@ +package com.hubspot.jinjava.tree.parse; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Before; +import org.junit.Test; + +public class StrictWhitespaceControlParserTest { + + StrictWhitespaceControlParser parser; + + @Before + public void setUp() { + parser = new StrictWhitespaceControlParser(); + } + + @Test + public void itDoesNotTrimEmptyTokenOnLeft() { + assertThat(parser.hasLeftTrim("")).isFalse(); + } + + @Test + public void itDoesNotTrimEmptyTokenOnRight() { + assertThat(parser.hasRightTrim("")).isFalse(); + } + + @Test + public void itStripsLeftOfEmptyTokenWithoutThrowing() { + assertThat(parser.stripLeft("")).isEqualTo(""); + } + + @Test + public void itStripsRightOfEmptyTokenWithoutThrowing() { + assertThat(parser.stripRight("")).isEqualTo(""); + } + + @Test + public void itDetectsLeftTrim() { + assertThat(parser.hasLeftTrim("-foo")).isTrue(); + assertThat(parser.stripLeft("-foo")).isEqualTo("foo"); + } + + @Test + public void itDetectsRightTrim() { + assertThat(parser.hasRightTrim("foo-")).isTrue(); + assertThat(parser.stripRight("foo-")).isEqualTo("foo"); + } +} From bd910756d9ce457307a305c765551d330c12ad60 Mon Sep 17 00:00:00 2001 From: Rachel Waddell <48857818+rewaddell@users.noreply.github.com> Date: Mon, 22 Jun 2026 10:08:26 -0400 Subject: [PATCH 4/5] extra whitespace --- .../jinjava/interpret/LegacyWhitespaceControlParsingTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/com/hubspot/jinjava/interpret/LegacyWhitespaceControlParsingTest.java b/src/test/java/com/hubspot/jinjava/interpret/LegacyWhitespaceControlParsingTest.java index b146bcc08..13c0305f5 100644 --- a/src/test/java/com/hubspot/jinjava/interpret/LegacyWhitespaceControlParsingTest.java +++ b/src/test/java/com/hubspot/jinjava/interpret/LegacyWhitespaceControlParsingTest.java @@ -82,7 +82,6 @@ public void itErrorsOnSpacedDashesOnBothSides() { .isThrownBy(() -> modern.render(template, new HashMap<>())) .withMessageContaining("syntax error at position 9"); } - @Test public void itHandlesEmptyExpressionToken() { From 2a2eed80d812961b00ac8c81a450eb58901ece39 Mon Sep 17 00:00:00 2001 From: Rachel Waddell <48857818+rewaddell@users.noreply.github.com> Date: Mon, 22 Jun 2026 10:14:44 -0400 Subject: [PATCH 5/5] mvn spotless --- .../jinjava/interpret/LegacyWhitespaceControlParsingTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/hubspot/jinjava/interpret/LegacyWhitespaceControlParsingTest.java b/src/test/java/com/hubspot/jinjava/interpret/LegacyWhitespaceControlParsingTest.java index 13c0305f5..48bbed0c9 100644 --- a/src/test/java/com/hubspot/jinjava/interpret/LegacyWhitespaceControlParsingTest.java +++ b/src/test/java/com/hubspot/jinjava/interpret/LegacyWhitespaceControlParsingTest.java @@ -82,7 +82,7 @@ public void itErrorsOnSpacedDashesOnBothSides() { .isThrownBy(() -> modern.render(template, new HashMap<>())) .withMessageContaining("syntax error at position 9"); } - + @Test public void itHandlesEmptyExpressionToken() { String template = "{{}}";