Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 25 additions & 19 deletions src/main/java/com/hubspot/jinjava/lib/tag/IncludeTag.java
Original file line number Diff line number Diff line change
Expand Up @@ -60,25 +60,7 @@ public class IncludeTag implements Tag {

@Override
public String interpret(TagNode tagNode, JinjavaInterpreter interpreter) {
HelperStringTokenizer helper = new HelperStringTokenizer(tagNode.getHelpers());
if (!helper.hasNext()) {
throw new TemplateSyntaxException(
tagNode.getMaster().getImage(),
"Tag 'include' expects template path",
tagNode.getLineNumber(),
tagNode.getStartPosition()
);
}

String path = StringUtils.trimToEmpty(helper.next());
String templateFile = interpreter.resolveString(
path,
tagNode.getLineNumber(),
tagNode.getStartPosition()
);
templateFile = interpreter.resolveResourceLocation(templateFile);

final String finalTemplateFile = templateFile;
final String finalTemplateFile = resolveTemplateFile(tagNode, interpreter);
final TagNode finalTagNode = tagNode;
try (
AutoCloseableImpl<Result<String, TagCycleException>> includeStackWrapper =
Expand Down Expand Up @@ -165,6 +147,30 @@ public String interpret(TagNode tagNode, JinjavaInterpreter interpreter) {
}
}

public static String resolveTemplateFile(
TagNode tagNode,
JinjavaInterpreter interpreter
) {
HelperStringTokenizer helper = new HelperStringTokenizer(tagNode.getHelpers());
if (!helper.hasNext()) {
throw new TemplateSyntaxException(
tagNode.getMaster().getImage(),
"Tag 'include' expects template path",
tagNode.getLineNumber(),
tagNode.getStartPosition()
);
}

String path = StringUtils.trimToEmpty(helper.next());
String templateFile = interpreter.resolveString(
path,
tagNode.getLineNumber(),
tagNode.getStartPosition()
);
templateFile = interpreter.resolveResourceLocation(templateFile);
return templateFile;
}

@Override
public String getEndTagName() {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@
import com.hubspot.jinjava.lib.tag.IncludeTag;
import com.hubspot.jinjava.tree.TagNode;
import com.hubspot.jinjava.util.EagerReconstructionUtils;
import com.hubspot.jinjava.util.HelperStringTokenizer;
import org.apache.commons.lang3.StringUtils;

@Beta
public class EagerIncludeTag extends EagerTagDecorator<IncludeTag> {
Expand All @@ -17,17 +15,10 @@ public EagerIncludeTag(IncludeTag tag) {

@Override
public String innerInterpret(TagNode tagNode, JinjavaInterpreter interpreter) {
String templateFile = IncludeTag.resolveTemplateFile(tagNode, interpreter);
int numDeferredTokensStart = interpreter.getContext().getDeferredTokens().size();
String output = super.innerInterpret(tagNode, interpreter);
if (interpreter.getContext().getDeferredTokens().size() > numDeferredTokensStart) {
HelperStringTokenizer helper = new HelperStringTokenizer(tagNode.getHelpers());
String path = StringUtils.trimToEmpty(helper.next());
String templateFile = interpreter.resolveString(
path,
tagNode.getLineNumber(),
tagNode.getStartPosition()
);
templateFile = interpreter.resolveResourceLocation(templateFile);
return EagerReconstructionUtils.wrapPathAroundText(
output,
templateFile,
Expand Down
18 changes: 18 additions & 0 deletions src/test/java/com/hubspot/jinjava/EagerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -1722,4 +1722,22 @@ public void itHandlesContinueInDeferredForLoopSecondPass() {
public void itReconstructsFromedMacro() {
expectedTemplateInterpreter.assertExpectedOutput("reconstructs-fromed-macro/test");
}

@Test
public void itHandlesModifiedIncludePath() {
expectedTemplateInterpreter.assertExpectedOutputNonIdempotent(
"handles-modified-include-path/test"
);
}

@Test
public void itHandlesModifiedIncludePathSecondPass() {
localContext.put("deferred", "resolved");
expectedTemplateInterpreter.assertExpectedOutput(
"handles-modified-include-path/test.expected"
);
expectedTemplateInterpreter.assertExpectedNonEagerOutput(
"handles-modified-include-path/test.expected"
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
This is include a
{% if deferred %}{% set include_path = './b.jinja' %}{% endif %}
{% include include_path %}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
This is include b
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
Before include
This is include a

This is include b

After include
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
Before include
{% set __temp_meta_current_path_1035152568__,current_path = current_path,'eager/handles-modified-include-path/a.jinja' %}\
This is include a
{% set include_path = './a.jinja' %}\
{% if deferred %}\
{% set include_path = './b.jinja' %}\
{% endif %}
{% include include_path %}
{% set current_path,__temp_meta_current_path_1035152568__ = __temp_meta_current_path_1035152568__,null %}
After include
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{% set include_path = './a.jinja' %}
Before include
{% include include_path %}
After include