View Javadoc
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          // Stop writing
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          // If name matches, start writing
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  }