Skip to content

Commit 7cb442e

Browse files
committed
Add DynamicRenderedOutputNode to allow path reconstruction when resolving blocks
1 parent 22e132d commit 7cb442e

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

src/main/java/com/hubspot/jinjava/interpret/JinjavaInterpreter.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import com.hubspot.jinjava.lib.tag.DoTag;
3737
import com.hubspot.jinjava.lib.tag.ExtendsTag;
3838
import com.hubspot.jinjava.lib.tag.eager.EagerGenericTag;
39+
import com.hubspot.jinjava.lib.tag.eager.importing.EagerImportingStrategyFactory;
3940
import com.hubspot.jinjava.objects.serialization.PyishObjectMapper;
4041
import com.hubspot.jinjava.objects.serialization.PyishSerializable;
4142
import com.hubspot.jinjava.random.ConstantZeroRandomNumberGenerator;
@@ -46,6 +47,7 @@
4647
import com.hubspot.jinjava.tree.TreeParser;
4748
import com.hubspot.jinjava.tree.output.BlockInfo;
4849
import com.hubspot.jinjava.tree.output.BlockPlaceholderOutputNode;
50+
import com.hubspot.jinjava.tree.output.DynamicRenderedOutputNode;
4951
import com.hubspot.jinjava.tree.output.OutputList;
5052
import com.hubspot.jinjava.tree.output.OutputNode;
5153
import com.hubspot.jinjava.tree.output.RenderedOutputNode;
@@ -513,7 +515,10 @@ private void resolveBlockStubs(OutputList output, Stack<String> blockNames) {
513515
currentBlock = block;
514516

515517
OutputList blockValueBuilder = new OutputList(config.getMaxOutputSize());
518+
DynamicRenderedOutputNode prefix = new DynamicRenderedOutputNode();
519+
blockValueBuilder.addNode(prefix);
516520
boolean pushedParentPathOntoStack = false;
521+
int numDeferredTokensBefore = context.getDeferredTokens().size();
517522
if (
518523
block.getParentPath().isPresent() &&
519524
!getContext().getCurrentPathStack().contains(block.getParentPath().get())
@@ -535,7 +540,19 @@ private void resolveBlockStubs(OutputList output, Stack<String> blockNames) {
535540
blockValueBuilder.addNode(child.render(this));
536541
}
537542
if (pushedParentPathOntoStack) {
538-
getContext().getCurrentPathStack().pop();
543+
if (context.getDeferredTokens().size() > numDeferredTokensBefore) {
544+
prefix.setValue(
545+
EagerImportingStrategyFactory.getSetTagForCurrentPath(this)
546+
);
547+
getContext().getCurrentPathStack().pop();
548+
blockValueBuilder.addNode(
549+
new RenderedOutputNode(
550+
EagerImportingStrategyFactory.getSetTagForCurrentPath(this)
551+
)
552+
);
553+
} else {
554+
getContext().getCurrentPathStack().pop();
555+
}
539556
}
540557
blockNames.push(blockPlaceholder.getBlockName());
541558
resolveBlockStubs(blockValueBuilder, blockNames);
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.hubspot.jinjava.tree.output;
2+
3+
import com.google.common.base.Charsets;
4+
import java.nio.charset.Charset;
5+
6+
/**
7+
* An OutputNode that can be modified after already being added to the OutputList
8+
*/
9+
public class DynamicRenderedOutputNode implements OutputNode {
10+
11+
protected String output = "";
12+
13+
public void setValue(String output) {
14+
this.output = output;
15+
}
16+
17+
@Override
18+
public String getValue() {
19+
return output;
20+
}
21+
22+
@Override
23+
public long getSize() {
24+
return output == null
25+
? 0
26+
: output.getBytes(Charset.forName(Charsets.UTF_8.name())).length;
27+
}
28+
29+
@Override
30+
public String toString() {
31+
return getValue();
32+
}
33+
}

0 commit comments

Comments
 (0)