diff --git a/src/main/java/com/hubspot/jinjava/tree/TreeParser.java b/src/main/java/com/hubspot/jinjava/tree/TreeParser.java index b2da482b0..406e1b76a 100644 --- a/src/main/java/com/hubspot/jinjava/tree/TreeParser.java +++ b/src/main/java/com/hubspot/jinjava/tree/TreeParser.java @@ -155,7 +155,7 @@ private Node text(TextToken textToken) { final Node lastSibling = getLastSibling(); // if last sibling was a tag and has rightTrimAfterEnd, strip whitespace - if (lastSibling instanceof TagNode && lastSibling.getMaster().isRightTrimAfterEnd()) { + if (lastSibling instanceof TagNode && isRightTrim((TagNode) lastSibling)) { textToken.setLeftTrim(true); } @@ -171,6 +171,20 @@ private Node text(TextToken textToken) { return n; } + private boolean isRightTrim(TagNode lastSibling) { + return ( + lastSibling.getEndName() == null || + ( + lastSibling.getTag() instanceof FlexibleTag && + !((FlexibleTag) lastSibling.getTag()).hasEndTag( + (TagToken) lastSibling.getMaster() + ) + ) + ) + ? lastSibling.getMaster().isRightTrim() + : lastSibling.getMaster().isRightTrimAfterEnd(); + } + private Node expression(ExpressionToken expressionToken) { ExpressionNode n = createExpressionNode(expressionToken); n.setParent(parent); diff --git a/src/test/java/com/hubspot/jinjava/EagerTest.java b/src/test/java/com/hubspot/jinjava/EagerTest.java index 4bd016fdc..32c0dc1f9 100644 --- a/src/test/java/com/hubspot/jinjava/EagerTest.java +++ b/src/test/java/com/hubspot/jinjava/EagerTest.java @@ -1073,4 +1073,9 @@ public void itReconstructsMapNodeSecondPass() { "reconstructs-map-node.expected" ); } + + @Test + public void itHasProperLineStripping() { + expectedTemplateInterpreter.assertExpectedOutput("has-proper-line-stripping"); + } } diff --git a/src/test/java/com/hubspot/jinjava/lib/tag/eager/EagerImportTagTest.java b/src/test/java/com/hubspot/jinjava/lib/tag/eager/EagerImportTagTest.java index c62d08dc0..401e6c1c7 100644 --- a/src/test/java/com/hubspot/jinjava/lib/tag/eager/EagerImportTagTest.java +++ b/src/test/java/com/hubspot/jinjava/lib/tag/eager/EagerImportTagTest.java @@ -636,15 +636,15 @@ public void itHandlesVarFromImportedMacro() { ); assertThat(result.trim()) .isEqualTo( - "{% set var = [] %}{% do var.append('a' ~ deferred) %}\n" + + "{% set var = [] %}{% do var.append('a' ~ deferred) %}" + "a\n" + - "{% do var.append('b' ~ deferred) %}\n" + + "{% do var.append('b' ~ deferred) %}" + "b\n" + "c{{ var }}" ); context.put("deferred", "resolved"); assertThat(interpreter.render(result).trim()) - .isEqualTo("a\n" + "\n" + "b\n" + "c['aresolved', 'bresolved']"); + .isEqualTo("a\n" + "b\n" + "c['aresolved', 'bresolved']"); } @Test @@ -656,7 +656,7 @@ public void itPutsDeferredInOtherSpotValuesOnContext() { "{{ apply('foo') }}\n" + "{{ val }}" ); - assertThat(result.trim()).isEqualTo("{% set val = deferred %}\n5foo\n{{ val }}"); + assertThat(result.trim()).isEqualTo("{% set val = deferred %}5foo\n{{ val }}"); context.put("deferred", "resolved"); assertThat(interpreter.render(result).trim()).isEqualTo("5foo\nresolved"); } diff --git a/src/test/java/com/hubspot/jinjava/tree/TreeParserTest.java b/src/test/java/com/hubspot/jinjava/tree/TreeParserTest.java index 2bf2d025a..ba5573ff9 100644 --- a/src/test/java/com/hubspot/jinjava/tree/TreeParserTest.java +++ b/src/test/java/com/hubspot/jinjava/tree/TreeParserTest.java @@ -116,6 +116,13 @@ public void itStripsAllOuterWhiteSpace() throws Exception { assertThat(interpreter.render(tree)).isEqualTo(".123."); } + @Test + public void itStripsAllOuterWhiteSpaceForInlineTags() throws Exception { + String expression = "1\n\n{%- print 2 -%}\n\n3\n\n{%- set x = 1 -%}\n\n4"; + final Node tree = new TreeParser(interpreter, expression).buildTree(); + assertThat(interpreter.render(tree)).isEqualTo("1234"); + } + @Test public void itStripsAllOuterWhiteSpaceWithComment() throws Exception { String expression = diff --git a/src/test/resources/eager/defers-macro-for-do-and-print.jinja b/src/test/resources/eager/defers-macro-for-do-and-print.jinja index 0987752a0..2860ccf22 100644 --- a/src/test/resources/eager/defers-macro-for-do-and-print.jinja +++ b/src/test/resources/eager/defers-macro-for-do-and-print.jinja @@ -4,6 +4,6 @@ Is ({{ my_list }}), {% print macro_append(first) %} Is ({{ my_list }}), -{%- do macro_append(deferred) -%} +{%- do macro_append(deferred) %} Is ({{ my_list }}), {% print macro_append(deferred2) %} diff --git a/src/test/resources/eager/eagerly-defers-macro.expected.expected.jinja b/src/test/resources/eager/eagerly-defers-macro.expected.expected.jinja index 70f9f8631..706ad906e 100644 --- a/src/test/resources/eager/eagerly-defers-macro.expected.expected.jinja +++ b/src/test/resources/eager/eagerly-defers-macro.expected.expected.jinja @@ -1,5 +1,4 @@ I am foo - No more foo diff --git a/src/test/resources/eager/eagerly-defers-macro.expected.jinja b/src/test/resources/eager/eagerly-defers-macro.expected.jinja index 527d2ac01..cd45e9ec6 100644 --- a/src/test/resources/eager/eagerly-defers-macro.expected.jinja +++ b/src/test/resources/eager/eagerly-defers-macro.expected.jinja @@ -1,10 +1,6 @@ {% macro big_guy() %} -{% if deferred %}I am foo -{% else %}I am bar -{% endif %} +{% if deferred %}I am foo{% else %}I am bar{% endif %} {% endmacro %}{% print big_guy() %} {% macro big_guy() %} -{% if deferred %}No more foo -{% else %}I am bar -{% endif %} -{% endmacro %}{% print big_guy() %} +{% if deferred %}No more foo{% else %}I am bar{% endif %} +{% endmacro %}{% print big_guy() %} \ No newline at end of file diff --git a/src/test/resources/eager/eagerly-defers-macro.jinja b/src/test/resources/eager/eagerly-defers-macro.jinja index 20cce4ed8..673f7f619 100644 --- a/src/test/resources/eager/eagerly-defers-macro.jinja +++ b/src/test/resources/eager/eagerly-defers-macro.jinja @@ -12,5 +12,5 @@ {% endif %} {% endmacro %} {% print big_guy() %} -{%- set foo = 'No more foo' -%} +{% set foo = 'No more foo' -%} {% print big_guy() %} diff --git a/src/test/resources/eager/handles-deferred-from-import-as.expected.jinja b/src/test/resources/eager/handles-deferred-from-import-as.expected.jinja index 27ae4b838..c7418e8a3 100644 --- a/src/test/resources/eager/handles-deferred-from-import-as.expected.jinja +++ b/src/test/resources/eager/handles-deferred-from-import-as.expected.jinja @@ -1,6 +1,5 @@ {% set myname = deferred + 7 %}{% set __ignored__ %} {% set bar = myname + 19 %} Hello {{ myname }} -{% set from_bar = bar %}{% endset %} -from_foo: Hello {{ myname }} +{% set from_bar = bar %}{% endset %}from_foo: Hello {{ myname }} from_bar: {{ from_bar }} diff --git a/src/test/resources/eager/handles-deferred-import-vars.expected.jinja b/src/test/resources/eager/handles-deferred-import-vars.expected.jinja index 76c6bfadb..8210627d6 100644 --- a/src/test/resources/eager/handles-deferred-import-vars.expected.jinja +++ b/src/test/resources/eager/handles-deferred-import-vars.expected.jinja @@ -1,12 +1,11 @@ {% set myname = deferred + 3 %}{% set __ignored__ %} {% set bar = myname + 19 %} Hello {{ myname }} -{% endset %} -foo: Hello {{ myname }} +{% endset %}foo: Hello {{ myname }} bar: {{ bar }} ----{% set myname = deferred + 7 %}{% set __ignored__ %}{% set current_path = 'macro-and-set.jinja' %}{% set simple = {} %} +--- +{% set myname = deferred + 7 %}{% set __ignored__ %}{% set current_path = 'macro-and-set.jinja' %}{% set simple = {} %} {% set bar = myname + 19 %}{% set simple = {} %}{% do simple.update({'bar': bar}) %} Hello {{ myname }} -{% do simple.update({'import_resource_path': 'macro-and-set.jinja'}) %}{% set current_path = '' %}{% endset %} -simple.foo: {% set deferred_import_resource_path = 'macro-and-set.jinja' %}{% macro simple.foo() %}Hello {{ myname }}{% endmacro %}{% set deferred_import_resource_path = null %}{{ simple.foo() }} +{% do simple.update({'import_resource_path': 'macro-and-set.jinja'}) %}{% set current_path = '' %}{% endset %}simple.foo: {% set deferred_import_resource_path = 'macro-and-set.jinja' %}{% macro simple.foo() %}Hello {{ myname }}{% endmacro %}{% set deferred_import_resource_path = null %}{{ simple.foo() }} simple.bar: {{ simple.bar }} diff --git a/src/test/resources/eager/handles-deferred-import-vars.jinja b/src/test/resources/eager/handles-deferred-import-vars.jinja index efebe006c..885f2d3f7 100644 --- a/src/test/resources/eager/handles-deferred-import-vars.jinja +++ b/src/test/resources/eager/handles-deferred-import-vars.jinja @@ -3,7 +3,7 @@ foo: {{ foo() }} bar: {{ bar }} --- -{%- set myname = deferred + (3 + 4) -%} +{% set myname = deferred + (3 + 4) -%} {%- import "macro-and-set.jinja" as simple -%} simple.foo: {{ simple.foo() }} simple.bar: {{ simple.bar }} diff --git a/src/test/resources/eager/handles-import-in-deferred-if.expected.jinja b/src/test/resources/eager/handles-import-in-deferred-if.expected.jinja index dbbc0f4f5..1ead133c6 100644 --- a/src/test/resources/eager/handles-import-in-deferred-if.expected.jinja +++ b/src/test/resources/eager/handles-import-in-deferred-if.expected.jinja @@ -1,11 +1,9 @@ {% if deferred %}{% set __ignored__ %}{% set current_path = 'macro-and-set.jinja' %}{% set simple = {} %} {% set bar = 'person19' %}{% do simple.update({'bar': bar}) %} Hello person -{% do simple.update({'bar': 'person19','import_resource_path': 'macro-and-set.jinja'}) %}{% set current_path = '' %}{% endset %} -{% else %}{% set __ignored__ %}{% set current_path = 'macro-and-set.jinja' %}{% set simple = {} %} +{% do simple.update({'bar': 'person19','import_resource_path': 'macro-and-set.jinja'}) %}{% set current_path = '' %}{% endset %}{% else %}{% set __ignored__ %}{% set current_path = 'macro-and-set.jinja' %}{% set simple = {} %} {% set bar = 'person19' %}{% do simple.update({'bar': bar}) %} Hello person -{% do simple.update({'bar': 'person19','import_resource_path': 'macro-and-set.jinja'}) %}{% set current_path = '' %}{% endset %} -{% endif %} +{% do simple.update({'bar': 'person19','import_resource_path': 'macro-and-set.jinja'}) %}{% set current_path = '' %}{% endset %}{% endif %} simple.foo: {{ simple.foo() }} simple.bar: {{ simple.bar }} diff --git a/src/test/resources/eager/handles-loop-var-against-deferred-in-loop.expected.expected.jinja b/src/test/resources/eager/handles-loop-var-against-deferred-in-loop.expected.expected.jinja index 502bbfe2b..f0cc5ea31 100644 --- a/src/test/resources/eager/handles-loop-var-against-deferred-in-loop.expected.expected.jinja +++ b/src/test/resources/eager/handles-loop-var-against-deferred-in-loop.expected.expected.jinja @@ -1,6 +1,3 @@ -item1 resolved. -item1resolved -item2 resolved. -item2resolved -item3 resolved. -item3resolved +item1 resolved.item1resolved +item2 resolved.item2resolved +item3 resolved.item3resolved diff --git a/src/test/resources/eager/handles-loop-var-against-deferred-in-loop.expected.jinja b/src/test/resources/eager/handles-loop-var-against-deferred-in-loop.expected.jinja index 21c08b43d..23c1c7150 100644 --- a/src/test/resources/eager/handles-loop-var-against-deferred-in-loop.expected.jinja +++ b/src/test/resources/eager/handles-loop-var-against-deferred-in-loop.expected.jinja @@ -1,6 +1,3 @@ -item1 {{ deferred }}.{% set temp = 'item1' ~ deferred %} -{{ temp }} -item2 {{ deferred }}.{% set temp = 'item2' ~ deferred %} -{{ temp }} -item3 {{ deferred }}.{% set temp = 'item3' ~ deferred %} -{{ temp }} +item1 {{ deferred }}.{% set temp = 'item1' ~ deferred %}{{ temp }} +item2 {{ deferred }}.{% set temp = 'item2' ~ deferred %}{{ temp }} +item3 {{ deferred }}.{% set temp = 'item3' ~ deferred %}{{ temp }} diff --git a/src/test/resources/eager/handles-non-deferred-import-vars.jinja b/src/test/resources/eager/handles-non-deferred-import-vars.jinja index bf42a2f8e..6d6a99c62 100644 --- a/src/test/resources/eager/handles-non-deferred-import-vars.jinja +++ b/src/test/resources/eager/handles-non-deferred-import-vars.jinja @@ -3,7 +3,7 @@ foo: {{ foo() }} bar: {{ bar }} --- -{%- set myname = (3 + 4) -%} +{% set myname = (3 + 4) -%} {%- import "macro-and-set.jinja" as simple -%} simple.foo: {{ simple.foo() }} simple.bar: {{ simple.bar }} diff --git a/src/test/resources/eager/handles-non-deferring-cycles.jinja b/src/test/resources/eager/handles-non-deferring-cycles.jinja index c2312104a..339d3b413 100644 --- a/src/test/resources/eager/handles-non-deferring-cycles.jinja +++ b/src/test/resources/eager/handles-non-deferring-cycles.jinja @@ -3,6 +3,6 @@ start: {% cycle 'start' %} foo: {% cycle foo %} one/two: {% cycle 'one','two' %} -{%- cycle 'a','b','c' as letter -%} +{% cycle 'a','b','c' as letter -%} letter: {% cycle letter %} {%- endfor -%} diff --git a/src/test/resources/eager/handles-unknown-function-errors.jinja b/src/test/resources/eager/handles-unknown-function-errors.jinja index c3b3c07de..c9887a7b3 100644 --- a/src/test/resources/eager/handles-unknown-function-errors.jinja +++ b/src/test/resources/eager/handles-unknown-function-errors.jinja @@ -1,3 +1,3 @@ Some ({{ unknown(null) }}) expression -{%- set foo = unknown(null) -%} +{% set foo = unknown(null) -%} Nothing: ({{ foo }}) diff --git a/src/test/resources/eager/has-proper-line-stripping.expected.jinja b/src/test/resources/eager/has-proper-line-stripping.expected.jinja new file mode 100644 index 000000000..a56e56254 --- /dev/null +++ b/src/test/resources/eager/has-proper-line-stripping.expected.jinja @@ -0,0 +1,3 @@ +1 +2 +3{% if deferred > 0 %}{{ deferred }}{% elif deferred == 0 %}null{% else %}{{ deferred }}{% endif %} diff --git a/src/test/resources/eager/has-proper-line-stripping.jinja b/src/test/resources/eager/has-proper-line-stripping.jinja new file mode 100644 index 000000000..0def88054 --- /dev/null +++ b/src/test/resources/eager/has-proper-line-stripping.jinja @@ -0,0 +1,10 @@ +1 +{% do 1 -%} +2 +3{% if deferred > 0 -%} +{{ deferred }} +{%- elif deferred == 0 -%} +null +{%- else -%} +{{ deferred }} +{%- endif %} diff --git a/src/test/resources/eager/puts-deferred-fromed-macro-in-output.expected.jinja b/src/test/resources/eager/puts-deferred-fromed-macro-in-output.expected.jinja index aeb2369c2..720db4c8c 100644 --- a/src/test/resources/eager/puts-deferred-fromed-macro-in-output.expected.jinja +++ b/src/test/resources/eager/puts-deferred-fromed-macro-in-output.expected.jinja @@ -1,2 +1 @@ -{% set myname = deferred + 3 %} -{% set deferred_import_resource_path = 'simple-with-call.jinja' %}{% macro getPath() %}Hello {{ myname }}{% endmacro %}{% set deferred_import_resource_path = null %}{% print getPath() %} +{% set myname = deferred + 3 %}{% set deferred_import_resource_path = 'simple-with-call.jinja' %}{% macro getPath() %}Hello {{ myname }}{% endmacro %}{% set deferred_import_resource_path = null %}{% print getPath() %} diff --git a/src/test/resources/eager/puts-deferred-imported-macro-in-output.expected.jinja b/src/test/resources/eager/puts-deferred-imported-macro-in-output.expected.jinja index 8599cb1aa..f95022d16 100644 --- a/src/test/resources/eager/puts-deferred-imported-macro-in-output.expected.jinja +++ b/src/test/resources/eager/puts-deferred-imported-macro-in-output.expected.jinja @@ -1,2 +1 @@ -{% set myname = deferred + 3 %} -{% set deferred_import_resource_path = 'simple-with-call.jinja' %}{% macro simple.getPath() %}Hello {{ myname }}{% endmacro %}{% set deferred_import_resource_path = null %}{% print simple.getPath() %} \ No newline at end of file +{% set myname = deferred + 3 %}{% set deferred_import_resource_path = 'simple-with-call.jinja' %}{% macro simple.getPath() %}Hello {{ myname }}{% endmacro %}{% set deferred_import_resource_path = null %}{% print simple.getPath() %}