1 package org.esigate.tags;
2
3 import java.io.IOException;
4
5 import org.esigate.aggregator.AggregationSyntaxException;
6 import org.esigate.parser.Element;
7 import org.esigate.parser.ElementType;
8 import org.esigate.parser.ParserContext;
9
10 class TemplateElement implements Element {
11 private TemplateRenderer templateRenderer;
12 private boolean nameMatches;
13 public static final ElementType TYPE = new ElementType() {
14
15 @Override
16 public boolean isStartTag(String tag) {
17 return tag.startsWith("<!--$begintemplate$");
18 }
19
20 @Override
21 public boolean isEndTag(String tag) {
22 return tag.startsWith("<!--$endtemplate$");
23 }
24
25 @Override
26 public Element newInstance() {
27 return new TemplateElement();
28 }
29
30 @Override
31 public boolean isSelfClosing(String tag) {
32 return false;
33 }
34
35 };
36
37 @Override
38 public boolean onError(Exception e, ParserContext ctx) {
39 return false;
40 }
41
42 @Override
43 public void onTagEnd(String tag, ParserContext ctx) {
44
45 if (nameMatches) {
46 templateRenderer.setWrite(false);
47 }
48 }
49
50 @Override
51 public boolean onTagStart(String tag, ParserContext ctx) {
52 String[] parameters = tag.split("\\$");
53 if (parameters.length != 4) {
54 throw new AggregationSyntaxException("Invalid syntax: " + tag);
55 }
56 String name = parameters[2];
57 this.templateRenderer = ctx.findAncestor(TemplateRenderer.class);
58
59 nameMatches = name.equals(templateRenderer.getName());
60 if (nameMatches) {
61 templateRenderer.setWrite(true);
62 }
63 return true;
64 }
65
66 @Override
67 public void characters(CharSequence csq, int start, int end) throws IOException {
68 if (nameMatches) {
69 templateRenderer.append(csq, start, end);
70 }
71 }
72
73 public boolean isNameMatches() {
74 return nameMatches;
75 }
76
77 }