package org.jtwig.macro.render;
import org.jtwig.macro.ImportedMacros;
import org.jtwig.macro.Macro;
import org.jtwig.model.tree.MacroNode;
import org.jtwig.model.tree.Node;
import org.jtwig.model.tree.visitor.NodeVisitor;
import org.jtwig.render.RenderRequest;
import org.jtwig.resource.reference.ResourceReference;
import org.jtwig.value.context.ValueContext;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
public class ImportRender {
private static final ImportRender INSTANCE = new ImportRender();
public static ImportRender instance () {
return INSTANCE;
}
private ImportRender() {
}
public void render (RenderRequest request, ResourceReference resourceReference, String macroIdentifier) {
Node content = request.getEnvironment().getParser().parse(request.getEnvironment(), resourceReference);
ArrayList<MacroNode> macroNodes = new ArrayList<>();
content.visit(new CollectMacroNodes(macroNodes));
Map<String, Macro> macros = new HashMap<>();
for (MacroNode macroNode : macroNodes) {
macros.put(macroNode.getMacroName().getIdentifier(), new Macro(
resourceReference,
macroNode.getContent(),
macroNode.getMacroArgumentNames()
));
}
request.getRenderContext().getCurrent(ValueContext.class)
.with(macroIdentifier, new ImportedMacros(macros));
}
public static class CollectMacroNodes implements NodeVisitor {
private final Collection<MacroNode> macros;
public CollectMacroNodes(Collection<MacroNode> macros) {
this.macros = macros;
}
@Override
public void consume(Node node) {
if (node instanceof MacroNode) {
macros.add((MacroNode) node);
}
}
}
}