Skip to content

Commit d2a43f1

Browse files
committed
Similar to macro functions, for the RenderFilter store a temporary value
and throw a DeferredInvocationResolutionException if the render didn't fully complete
1 parent 28199cd commit d2a43f1

5 files changed

Lines changed: 83 additions & 8 deletions

File tree

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.hubspot.jinjava.el.ext.eager;
2+
3+
import com.hubspot.jinjava.objects.serialization.PyishBlockSetSerializable;
4+
import java.util.Objects;
5+
6+
public class RenderFlatTempVariable implements PyishBlockSetSerializable {
7+
8+
private static final String CONTEXT_KEY_PREFIX = "__render_%d_temp_variable__";
9+
private final String deferredResult;
10+
11+
public RenderFlatTempVariable(String deferredResult) {
12+
this.deferredResult = deferredResult;
13+
}
14+
15+
public static String getVarName(String result) {
16+
return String.format(CONTEXT_KEY_PREFIX, Math.abs(result.hashCode() >> 1));
17+
}
18+
19+
@Override
20+
public String getBlockSetBody() {
21+
return deferredResult;
22+
}
23+
24+
@Override
25+
public boolean equals(Object o) {
26+
if (this == o) {
27+
return true;
28+
}
29+
if (o == null || getClass() != o.getClass()) {
30+
return false;
31+
}
32+
RenderFlatTempVariable that = (RenderFlatTempVariable) o;
33+
return deferredResult.equals(that.deferredResult);
34+
}
35+
36+
@Override
37+
public int hashCode() {
38+
return Objects.hash(deferredResult);
39+
}
40+
}

src/main/java/com/hubspot/jinjava/lib/filter/RenderFilter.java

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import com.hubspot.jinjava.doc.annotations.JinjavaDoc;
55
import com.hubspot.jinjava.doc.annotations.JinjavaParam;
66
import com.hubspot.jinjava.doc.annotations.JinjavaSnippet;
7+
import com.hubspot.jinjava.el.ext.DeferredInvocationResolutionException;
8+
import com.hubspot.jinjava.el.ext.eager.RenderFlatTempVariable;
79
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
810
import java.util.Objects;
911
import org.apache.commons.lang3.math.NumberUtils;
@@ -26,16 +28,29 @@ public String getName() {
2628

2729
@Override
2830
public Object filter(Object var, JinjavaInterpreter interpreter, String... args) {
31+
int numDeferredTokensStart = interpreter.getContext().getDeferredTokens().size();
32+
String result;
2933
if (args.length > 0) {
3034
String firstArg = args[0];
31-
return interpreter.renderFlat(
32-
Objects.toString(var),
33-
NumberUtils.toLong(
34-
firstArg,
35-
JinjavaConfig.newBuilder().build().getMaxOutputSize()
36-
)
37-
);
35+
result =
36+
interpreter.renderFlat(
37+
Objects.toString(var),
38+
NumberUtils.toLong(
39+
firstArg,
40+
JinjavaConfig.newBuilder().build().getMaxOutputSize()
41+
)
42+
);
43+
} else {
44+
result = interpreter.renderFlat(Objects.toString(var));
3845
}
39-
return interpreter.renderFlat(Objects.toString(var));
46+
if (interpreter.getContext().getDeferredTokens().size() > numDeferredTokensStart) {
47+
String tempVarName = RenderFlatTempVariable.getVarName(result);
48+
interpreter
49+
.getContext()
50+
.getParent()
51+
.put(tempVarName, new RenderFlatTempVariable(result));
52+
throw new DeferredInvocationResolutionException(tempVarName);
53+
}
54+
return result;
4055
}
4156
}

src/test/java/com/hubspot/jinjava/EagerTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1669,4 +1669,11 @@ public void itHandlesDeferredContinueInForLoop() {
16691669
public void itReconstructsFromedMacro() {
16701670
expectedTemplateInterpreter.assertExpectedOutput("reconstructs-fromed-macro/test");
16711671
}
1672+
1673+
@Test
1674+
public void itHandlesDeferredValueInRenderFilter() {
1675+
expectedTemplateInterpreter.assertExpectedOutput(
1676+
"handles-deferred-value-in-render-filter/test"
1677+
);
1678+
}
16721679
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{% set __render_524436216_temp_variable__ %}\
2+
Hi {{ filter:escape.filter(deferred, ____int3rpr3t3r____) }}\
3+
{% endset %}\
4+
{{ filter:escape_jinjava.filter(__render_524436216_temp_variable__, ____int3rpr3t3r____) }}
5+
6+
{% set __render_524436216_temp_variable__ %}\
7+
Hi {{ filter:escape.filter(deferred, ____int3rpr3t3r____) }}\
8+
{% endset %}\
9+
{{ __render_524436216_temp_variable__ }}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{% set foo = "Hi {{ deferred|escape }}" %}
2+
{{ foo|render|escape_jinjava }}
3+
4+
{{ foo|render }}

0 commit comments

Comments
 (0)