package org.esigate.tags; import java.io.IOException; import org.esigate.aggregator.AggregationSyntaxException; import org.esigate.parser.Element; import org.esigate.parser.ElementType; import org.esigate.parser.ParserContext; class TemplateElement implements Element { private TemplateRenderer templateRenderer; private boolean nameMatches; public static final ElementType TYPE = new ElementType() { @Override public boolean isStartTag(String tag) { return tag.startsWith("<!--$begintemplate$"); } @Override public boolean isEndTag(String tag) { return tag.startsWith("<!--$endtemplate$"); } @Override public Element newInstance() { return new TemplateElement(); } @Override public boolean isSelfClosing(String tag) { return false; } }; @Override public boolean onError(Exception e, ParserContext ctx) { return false; // do not handle errors } @Override public void onTagEnd(String tag, ParserContext ctx) { // Stop writing if (nameMatches) { templateRenderer.setWrite(false); } } @Override public boolean onTagStart(String tag, ParserContext ctx) { String[] parameters = tag.split("\\$"); if (parameters.length != 4) { throw new AggregationSyntaxException("Invalid syntax: " + tag); } String name = parameters[2]; this.templateRenderer = ctx.findAncestor(TemplateRenderer.class); // If name matches, start writing nameMatches = name.equals(templateRenderer.getName()); if (nameMatches) { templateRenderer.setWrite(true); } return true; } @Override public void characters(CharSequence csq, int start, int end) throws IOException { if (nameMatches) { templateRenderer.append(csq, start, end); } } public boolean isNameMatches() { return nameMatches; } }