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 BlockElement implements Element {
11 public static final ElementType TYPE = new ElementType() {
12
13 @Override
14 public boolean isStartTag(String tag) {
15 return tag.startsWith("<!--$beginblock$");
16 }
17
18 @Override
19 public boolean isEndTag(String tag) {
20 return tag.startsWith("<!--$endblock$");
21 }
22
23 @Override
24 public Element newInstance() {
25 return new BlockElement();
26 }
27
28 @Override
29 public boolean isSelfClosing(String tag) {
30 return false;
31 }
32
33 };
34
35 private BlockRenderer blockRenderer;
36 private boolean nameMatches;
37
38 @Override
39 public boolean onError(Exception e, ParserContext ctx) {
40 return false;
41 }
42
43 @Override
44 public void onTagEnd(String tag, ParserContext ctx) {
45
46 if (nameMatches) {
47 blockRenderer.setWrite(false);
48 }
49 }
50
51 @Override
52 public boolean onTagStart(String tag, ParserContext ctx) {
53 String[] parameters = tag.split("\\$");
54 if (parameters.length != 4) {
55 throw new AggregationSyntaxException("Invalid syntax: " + tag);
56 }
57 String name = parameters[2];
58 this.blockRenderer = ctx.findAncestor(BlockRenderer.class);
59
60 nameMatches = name.equals(blockRenderer.getName());
61 if (nameMatches) {
62 blockRenderer.setWrite(true);
63 }
64 return true;
65 }
66
67 @Override
68 public void characters(CharSequence csq, int start, int end) throws IOException {
69 blockRenderer.append(csq, start, end);
70 }
71
72 }