Added condition logic to template. Not robust yet

This commit is contained in:
Ziver Koc 2015-03-24 21:45:23 +00:00
parent d7b66238ed
commit 255585c9b1
3 changed files with 68 additions and 15 deletions

View file

@ -32,11 +32,16 @@ import java.util.List;
* Class for generating dynamic text/code from set data. * Class for generating dynamic text/code from set data.
* The syntax is similar to the javascript mustache library. * The syntax is similar to the javascript mustache library.
* *
* <br /><br />
* Supported tags: * Supported tags:
* * {{key}}: will be replaced with the string from the key * <ul>
* <li><b> {{key}} </b><br>
* will be replaced with the string from the key</li>
* <li><b> {{#key}}...{{/key}} </b><br>
* will display content between the tags if key is defined</li>
* </ul>
* *
* * @author Ziver koc
* Created by Ziver on 2015-03-23.
*/ */
public class Templator { public class Templator {
private HashMap<String,Object> data; private HashMap<String,Object> data;
@ -70,10 +75,10 @@ public class Templator {
*/ */
private void parseTemplate(String tmpl){ private void parseTemplate(String tmpl){
TemplateNode node = new TemplateNode(); TemplateNode node = new TemplateNode();
parseTemplate(node, tmpl, new MutableInt()); parseTemplate(node, tmpl, new MutableInt(), null);
tmplRoot = node; tmplRoot = node;
} }
private void parseTemplate(TemplateNode root, String tmpl, MutableInt m){ private void parseTemplate(TemplateNode root, String tmpl, MutableInt m, String parentTag){
StringBuilder data = new StringBuilder(); StringBuilder data = new StringBuilder();
StringBuilder tags = new StringBuilder(); StringBuilder tags = new StringBuilder();
boolean tagOpen = false; boolean tagOpen = false;
@ -89,7 +94,6 @@ public class Templator {
tags.append("{{"); tags.append("{{");
tagOpen = true; tagOpen = true;
++m.i; ++m.i;
break; break;
case "}}": case "}}":
if(!tagOpen){ // Tag not opened, incorrect enclosure if(!tagOpen){ // Tag not opened, incorrect enclosure
@ -98,8 +102,20 @@ public class Templator {
} }
tagOpen = false; tagOpen = false;
++m.i; ++m.i;
root.addEntity(new TmplDataAttribute(data.toString())); String tagName = data.toString();
data.delete(0, data.length()); data.delete(0, data.length());
switch(tagName.charAt(0)) {
case '#':
TemplateCondition conTmpl = new TemplateCondition(tagName);
parseTemplate(conTmpl, tmpl, m, tagName.substring(1));
root.addEntity(conTmpl);
break;
case '/':
if(tagName.endsWith(parentTag))
return;
default:
root.addEntity(new TmplDataAttribute(tagName));
}
break; break;
default: default:
data.append(c); data.append(c);
@ -136,6 +152,19 @@ public class Templator {
} }
} }
protected class TemplateCondition extends TemplateNode {
private String key;
public TemplateCondition(String key){
this.key = key;
}
public void compile(StringBuilder str) {
if(data.containsKey(key))
super.compile(str);
}
}
protected class TmplStaticString implements TemplateEntity { protected class TmplStaticString implements TemplateEntity {
private String text; private String text;

View file

@ -25,14 +25,9 @@ package zutil.test;
import com.carrotsearch.junitbenchmarks.BenchmarkRule; import com.carrotsearch.junitbenchmarks.BenchmarkRule;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.rules.MethodRule; import zutil.test.JSONSerializerTest.TestClass;
import zutil.io.StringOutputStream;
import zutil.parser.json.JSONObjectInputStream;
import zutil.parser.json.JSONObjectOutputStream;
import zutil.test.JSONSerializerTest.*;
import java.io.*; import java.io.*;
import java.util.Arrays;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;

View file

@ -38,13 +38,11 @@ public class TemplatorTest {
tmpl.setData("test", "1234"); tmpl.setData("test", "1234");
assertEquals("<HTML>1234</HTML>", tmpl.compile()); assertEquals("<HTML>1234</HTML>", tmpl.compile());
} }
@Test @Test
public void emptyAttributeTest(){ public void emptyAttributeTest(){
Templator tmpl = new Templator("<HTML>{{test}}</HTML>"); Templator tmpl = new Templator("<HTML>{{test}}</HTML>");
assertEquals("<HTML>{{test}}</HTML>", tmpl.compile()); assertEquals("<HTML>{{test}}</HTML>", tmpl.compile());
} }
@Test @Test
public void incorrectTagsTest(){ public void incorrectTagsTest(){
assertEquals("<HTML>{{</HTML>", assertEquals("<HTML>{{</HTML>",
@ -64,4 +62,35 @@ public class TemplatorTest {
assertEquals("<HTML>{test}</HTML>", assertEquals("<HTML>{test}</HTML>",
new Templator("<HTML>{test}</HTML>").compile()); new Templator("<HTML>{test}</HTML>").compile());
} }
@Test
public void emptyConditionTest(){
Templator tmpl = new Templator(
"<HTML>{{#key}}123456789{{/key}}</HTML>");
assertEquals(
"<HTML></HTML>",
tmpl.compile());
}
@Test
public void simpleConditionTest(){
Templator tmpl = new Templator(
"<HTML>{{#key}}123456789{{/key}}</HTML>");
tmpl.setData("key", true);
assertEquals(
"<HTML></HTML>",
tmpl.compile());
}
@Test
public void incompleteConditionTest(){
assertEquals("<HTML>{{#key}}</HTML>",
new Templator("<HTML>{{#key}}</HTML>").compile());
assertEquals("<HTML>{{/key}}</HTML>",
new Templator("<HTML>{{/key}}</HTML>").compile());
assertEquals("",
new Templator("{{#key}}{{/key}}").compile());
assertEquals("<HTML></HTML>",
new Templator("<HTML>{{#key}}{{/key}}</HTML>").compile());
}
} }