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 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; // do not handle errors
40      }
41  
42      @Override
43      public void onTagEnd(String tag, ParserContext ctx) {
44          // Stop writing
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          // If name matches, start writing
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  }