From bd1ec6c34b1d8b6d3b78d4f2df7ec7803d90400b Mon Sep 17 00:00:00 2001 From: mdiumi <54270158+marius-diumia@users.noreply.github.com> Date: Sat, 20 May 2023 18:35:20 +0100 Subject: [PATCH 1/3] render back unresolved tokens --- .../java/com/hubspot/jinjava/JinjavaConfig.java | 12 ++++++++++++ .../lib/expression/DefaultExpressionStrategy.java | 4 ++++ .../hubspot/jinjava/tree/ExpressionNodeTest.java | 15 +++++++++++++++ 3 files changed, 31 insertions(+) diff --git a/src/main/java/com/hubspot/jinjava/JinjavaConfig.java b/src/main/java/com/hubspot/jinjava/JinjavaConfig.java index cd9f8f9a9..4d1793fed 100644 --- a/src/main/java/com/hubspot/jinjava/JinjavaConfig.java +++ b/src/main/java/com/hubspot/jinjava/JinjavaConfig.java @@ -65,6 +65,7 @@ public class JinjavaConfig { private final Map> disabled; private final boolean failOnUnknownTokens; + private final boolean renderBackUnknownTokens; private final boolean nestedInterpretationEnabled; private final RandomNumberGeneratorStrategy randomNumberGenerator; private final boolean validationMode; @@ -125,6 +126,7 @@ private JinjavaConfig(Builder builder) { enableRecursiveMacroCalls = builder.enableRecursiveMacroCalls; maxMacroRecursionDepth = builder.maxMacroRecursionDepth; failOnUnknownTokens = builder.failOnUnknownTokens; + renderBackUnknownTokens = builder.renderBackUnknownTokens; maxOutputSize = builder.maxOutputSize; nestedInterpretationEnabled = builder.nestedInterpretationEnabled; randomNumberGenerator = builder.randomNumberGeneratorStrategy; @@ -221,6 +223,10 @@ public boolean isFailOnUnknownTokens() { return failOnUnknownTokens; } + public boolean isRenderBackUnknownTokens() { + return renderBackUnknownTokens; + } + public boolean isNestedInterpretationEnabled() { return nestedInterpretationEnabled; } @@ -311,6 +317,7 @@ public static class Builder { private boolean enableRecursiveMacroCalls; private int maxMacroRecursionDepth; private boolean failOnUnknownTokens; + private boolean renderBackUnknownTokens; private boolean nestedInterpretationEnabled = true; private RandomNumberGeneratorStrategy randomNumberGeneratorStrategy = RandomNumberGeneratorStrategy.THREAD_LOCAL; @@ -410,6 +417,11 @@ public Builder withFailOnUnknownTokens(boolean failOnUnknownTokens) { return this; } + public Builder withRenderBackUnknownTokens(boolean renderBackUnknownTokens) { + this.renderBackUnknownTokens = renderBackUnknownTokens; + return this; + } + public Builder withMaxOutputSize(long maxOutputSize) { this.maxOutputSize = maxOutputSize; return this; diff --git a/src/main/java/com/hubspot/jinjava/lib/expression/DefaultExpressionStrategy.java b/src/main/java/com/hubspot/jinjava/lib/expression/DefaultExpressionStrategy.java index cc1c2b589..1a1517374 100644 --- a/src/main/java/com/hubspot/jinjava/lib/expression/DefaultExpressionStrategy.java +++ b/src/main/java/com/hubspot/jinjava/lib/expression/DefaultExpressionStrategy.java @@ -41,6 +41,10 @@ public RenderedOutputNode interpretOutput( result = EscapeFilter.escapeHtmlEntities(result); } + if (result.isEmpty() && interpreter.getConfig().isRenderBackUnknownTokens()) { + result = master.getImage(); + } + return new RenderedOutputNode(result); } } diff --git a/src/test/java/com/hubspot/jinjava/tree/ExpressionNodeTest.java b/src/test/java/com/hubspot/jinjava/tree/ExpressionNodeTest.java index ca613ef99..af2de70c9 100644 --- a/src/test/java/com/hubspot/jinjava/tree/ExpressionNodeTest.java +++ b/src/test/java/com/hubspot/jinjava/tree/ExpressionNodeTest.java @@ -129,6 +129,21 @@ public void itRendersStringRange() throws Exception { assertThat(node.render(interpreter).toString()).isEqualTo("345"); } + @Test + public void itRenderBackUnknownTokensAsIsForMissingBinding() { + final JinjavaConfig config = JinjavaConfig + .newBuilder() + .withRenderBackUnknownTokens(true) + .build(); + JinjavaInterpreter jinjavaInterpreter = new Jinjava(config).newInterpreter(); + jinjavaInterpreter.getContext().put("subject", "this"); + + String template = "{{ subject }} expression has an {{ unknown }} token"; + Node node = new TreeParser(jinjavaInterpreter, template).buildTree(); + assertThat(jinjavaInterpreter.render(node)) + .isEqualTo("this expression has an {{ unknown }} token"); + } + @Test public void itFailsOnUnknownTokensVariables() throws Exception { final JinjavaConfig config = JinjavaConfig From 62c677203da758d07af737fc56736573f86c11ff Mon Sep 17 00:00:00 2001 From: mdiumi <54270158+marius-diumia@users.noreply.github.com> Date: Sun, 21 May 2023 12:39:49 +0100 Subject: [PATCH 2/3] add simple filter --- .../java/com/hubspot/jinjava/tree/ExpressionNodeTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/hubspot/jinjava/tree/ExpressionNodeTest.java b/src/test/java/com/hubspot/jinjava/tree/ExpressionNodeTest.java index af2de70c9..0810618cb 100644 --- a/src/test/java/com/hubspot/jinjava/tree/ExpressionNodeTest.java +++ b/src/test/java/com/hubspot/jinjava/tree/ExpressionNodeTest.java @@ -138,10 +138,10 @@ public void itRenderBackUnknownTokensAsIsForMissingBinding() { JinjavaInterpreter jinjavaInterpreter = new Jinjava(config).newInterpreter(); jinjavaInterpreter.getContext().put("subject", "this"); - String template = "{{ subject }} expression has an {{ unknown }} token"; + String template = "{{ subject | capitalize() }} expression has an {{ unknown | lower() }} token"; Node node = new TreeParser(jinjavaInterpreter, template).buildTree(); assertThat(jinjavaInterpreter.render(node)) - .isEqualTo("this expression has an {{ unknown }} token"); + .isEqualTo("This expression has an {{ unknown | lower() }} token"); } @Test From f56095d823421f2ed9ef2db8ef9df1ca27a4aee9 Mon Sep 17 00:00:00 2001 From: mdiumi <54270158+marius-diumia@users.noreply.github.com> Date: Tue, 10 Oct 2023 22:46:51 +0100 Subject: [PATCH 3/3] improve integration test --- .../java/com/hubspot/jinjava/tree/ExpressionNodeTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/hubspot/jinjava/tree/ExpressionNodeTest.java b/src/test/java/com/hubspot/jinjava/tree/ExpressionNodeTest.java index 0810618cb..38828caab 100644 --- a/src/test/java/com/hubspot/jinjava/tree/ExpressionNodeTest.java +++ b/src/test/java/com/hubspot/jinjava/tree/ExpressionNodeTest.java @@ -138,10 +138,10 @@ public void itRenderBackUnknownTokensAsIsForMissingBinding() { JinjavaInterpreter jinjavaInterpreter = new Jinjava(config).newInterpreter(); jinjavaInterpreter.getContext().put("subject", "this"); - String template = "{{ subject | capitalize() }} expression has an {{ unknown | lower() }} token"; + String template = "{{ subject | capitalize() }} expression has a {{ unknown | lower() }} token but {{ unknown | default(\"replaced\") }}"; Node node = new TreeParser(jinjavaInterpreter, template).buildTree(); assertThat(jinjavaInterpreter.render(node)) - .isEqualTo("This expression has an {{ unknown | lower() }} token"); + .isEqualTo("This expression has a {{ unknown | lower() }} token but replaced"); } @Test