Conditional template working now

This commit is contained in:
Ziver Koc 2015-03-25 14:38:49 +00:00
parent b8ea59c7e7
commit 939f99ffb7

View file

@ -22,11 +22,13 @@
package zutil.parser; package zutil.parser;
import zutil.log.LogUtil;
import zutil.struct.MutableInt; import zutil.struct.MutableInt;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.logging.Logger;
/** /**
* Class for generating dynamic text/code from set data. * Class for generating dynamic text/code from set data.
@ -44,6 +46,7 @@ import java.util.List;
* @author Ziver koc * @author Ziver koc
*/ */
public class Templator { public class Templator {
private static final Logger log = LogUtil.getLogger();
private HashMap<String,Object> data; private HashMap<String,Object> data;
private TemplateEntity tmplRoot; private TemplateEntity tmplRoot;
@ -74,13 +77,11 @@ public class Templator {
* Will pare or re-parse the source template. * Will pare or re-parse the source template.
*/ */
private void parseTemplate(String tmpl){ private void parseTemplate(String tmpl){
TemplateNode node = new TemplateNode(); tmplRoot = parseTemplate(new TemplateNode(), tmpl, new MutableInt(), null);
parseTemplate(node, tmpl, new MutableInt(), null);
tmplRoot = node;
} }
private void parseTemplate(TemplateNode root, String tmpl, MutableInt m, String parentTag){ private TemplateNode parseTemplate(TemplateNode root, String tmpl, MutableInt m, String parentTag){
StringBuilder data = new StringBuilder(); StringBuilder data = new StringBuilder();
StringBuilder tags = new StringBuilder(); StringBuilder tag = new StringBuilder();
boolean tagOpen = false; boolean tagOpen = false;
for(; m.i<tmpl.length(); ++m.i){ for(; m.i<tmpl.length(); ++m.i){
@ -88,10 +89,10 @@ public class Templator {
String d = ""+ c + (m.i+1<tmpl.length() ? tmpl.charAt(m.i+1) : ' '); String d = ""+ c + (m.i+1<tmpl.length() ? tmpl.charAt(m.i+1) : ' ');
switch( d ){ switch( d ){
case "{{": case "{{":
root.addEntity(new TmplStaticString(data.toString())); root.add(new TmplStaticString(data.toString()));
data.delete(0, data.length()); data.delete(0, data.length());
tags.delete(0, data.length()); tag.delete(0, data.length());
tags.append("{{"); tag.append("{{");
tagOpen = true; tagOpen = true;
++m.i; ++m.i;
break; break;
@ -104,28 +105,44 @@ public class Templator {
++m.i; ++m.i;
String tagName = data.toString(); String tagName = data.toString();
data.delete(0, data.length()); data.delete(0, data.length());
tag.append(tagName).append("}}");
switch(tagName.charAt(0)) { switch(tagName.charAt(0)) {
case '#': case '#':
TemplateCondition conTmpl = new TemplateCondition(tagName); ++m.i;
parseTemplate(conTmpl, tmpl, m, tagName.substring(1)); root.add(parseTemplate(new TemplateCondition(tagName),
root.addEntity(conTmpl); tmpl, m, tagName));
break; break;
case '/': case '/':
if(tagName.endsWith(parentTag)) if(parentTag != null && tagName.endsWith(parentTag.substring(1)))
return; return root;
log.severe("Closing non-opened tag: "+tag.toString());
root.add(new TmplStaticString(tag.toString()));
break;
default: default:
root.addEntity(new TmplDataAttribute(tagName)); root.add(new TmplDataAttribute(tagName));
} }
break; break;
default: default:
if(Character.isWhitespace(c)) // Not a valid tag if it contains whitespace
tagOpen = false;
data.append(c); data.append(c);
break; break;
} }
} }
if(tagOpen) if(tagOpen)
data.insert(0, tags); data.insert(0, tag);
if(data.length() > 0) if(data.length() > 0)
root.addEntity(new TmplStaticString(data.toString())); root.add(new TmplStaticString(data.toString()));
// If we get to this point means that this node is incorrectly close
// or this is the end of the file, so we convert it to a normal node
if(parentTag != null) {
root = new TemplateNode(root);
String tagName = "{{"+parentTag+"}}";
log.severe("Missing closure of tag: "+tagName);
root.addFirst(new TmplStaticString(tagName));
}
return root;
} }
@ -141,8 +158,14 @@ public class Templator {
public TemplateNode(){ public TemplateNode(){
this.entities = new ArrayList<TemplateEntity>(); this.entities = new ArrayList<TemplateEntity>();
} }
public TemplateNode(TemplateNode node){
this.entities = node.entities;
}
public void addEntity(TemplateEntity s){ public void addFirst(TemplateEntity s){
entities.add(0, s);
}
public void add(TemplateEntity s){
entities.add(s); entities.add(s);
} }