@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());
try {
interpreter.getContext().getIncludePathStack().push(templateFile, tagNode.getLineNumber(), tagNode.getStartPosition());
} catch (IncludeTagCycleException e) {
interpreter.addError(new TemplateError(ErrorType.WARNING, ErrorReason.EXCEPTION, ErrorItem.TAG,
"Include cycle detected for path: '" + templateFile + "'", null, tagNode.getLineNumber(), tagNode.getStartPosition(), e,
BasicTemplateErrorCategory.INCLUDE_CYCLE_DETECTED, ImmutableMap.of("path", templateFile)));
return "";
}
try {
String template = interpreter.getResource(templateFile);
Node node = interpreter.parse(template);
interpreter.getContext().addDependency("coded_files", templateFile);
JinjavaInterpreter child = new JinjavaInterpreter(interpreter);
String result = child.render(node);
interpreter.addAllErrors(child.getErrorsCopy());
return result;
} catch (IOException e) {
throw new InterpretException(e.getMessage(), e, tagNode.getLineNumber(), tagNode.getStartPosition());
} finally {
interpreter.getContext().getIncludePathStack().pop();
}
}