diff --git a/src/zutil/parser/Templator.java b/src/zutil/parser/Templator.java
index 85289db..950b59e 100644
--- a/src/zutil/parser/Templator.java
+++ b/src/zutil/parser/Templator.java
@@ -27,6 +27,7 @@ import zutil.struct.MutableInt;
import java.lang.reflect.Field;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.logging.Level;
@@ -43,18 +44,26 @@ import java.util.logging.Logger;
* {{obj.attr}}
* Will be replaced with the string from the key.
*
{{#key}}...{{/key}}
- * Will display content between the tags if key is defined.
- * {{^key}}
- * A negative condition, will display content if key is not set.
+ * {{#obj.attr}}...{{/obj.attr}}
+ * Will display content between the tags if:
+ * key is defined,
+ * if the key references a list the content will be iterated
+ * for every element, the element can be referenced by the tag {{.}},
+ * if key is a true boolean (false will not display content).
+ * {{^key}}
+ * {{^obj.attr}}...{{/obj.attr}}
+ * A negative condition, will display content if:
+ * the key is undefined,
+ * the key is a empty list,
+ * the key is a false boolean.
* {{! ignore me }}
* Comment, will be ignored.
*
*
- * TODO:
- * * {{#person}}: support for boolean
- * * {{#person}}: support for iterators
- * * {{> file}}: include file
- * * {{=<% %>=}}: change delimiter
+ * TODO: {{#key}}: support for boolean
+ * TODO: {{> file}}: include file
+ * TODO: {{=<% %>=}}: change delimiter
+ *
* @author Ziver koc
*/
public class Templator {
@@ -160,23 +169,6 @@ public class Templator {
}
-
-
- /**************************** Utility functions *************************************/
- public static Object getFieldValue(Object obj, String attrib){
- try {
- for (Field field : obj.getClass().getDeclaredFields()) {
- if(field.getName().equals(attrib)) {
- field.setAccessible(true);
- return field.get(obj);
- }
- }
- }catch (IllegalAccessException e){
- log.log(Level.WARNING, null, e);
- }
- return null;
- }
-
/**************************** Template Helper Classes *************************************/
protected interface TemplateEntity {
@@ -207,28 +199,53 @@ public class Templator {
}
protected class TemplateCondition extends TemplateNode {
- private String key;
+ private TemplateDataAttribute attrib;
public TemplateCondition(String key){
- this.key = key.trim();
+ this.attrib = new TemplateDataAttribute(key);
}
public void compile(StringBuilder str) {
- if(data.containsKey(key))
- super.compile(str);
+ Object obj = attrib.getObject();
+ if(obj != null) {
+ if(obj instanceof Boolean){
+ if ((Boolean) obj)
+ super.compile(str);
+ }
+ else if(obj instanceof Iterable){
+ for(Object o : (Iterable)obj){ // Iterate through the whole list
+ set(".", o);
+ super.compile(str);
+ }
+ set(".", null);
+ }
+ else
+ super.compile(str);
+ }
}
}
protected class TemplateNegativeCondition extends TemplateNode {
- private String key;
+ private TemplateDataAttribute attrib;
public TemplateNegativeCondition(String key){
- this.key = key.trim();
+ this.attrib = new TemplateDataAttribute(key);
}
public void compile(StringBuilder str) {
- if( ! data.containsKey(key))
+ Object obj = attrib.getObject();
+ if(obj == null)
super.compile(str);
+ else {
+ if(obj instanceof Boolean) {
+ if ( ! (Boolean) obj)
+ super.compile(str);
+ }
+ else if(obj instanceof Collection) {
+ if (((Collection) obj).isEmpty())
+ super.compile(str);
+ }
+ }
}
}
@@ -245,30 +262,54 @@ public class Templator {
}
protected class TemplateDataAttribute implements TemplateEntity {
+ private String tag;
private String key;
private String attrib;
- public TemplateDataAttribute(String key){
- String[] s = key.trim().split("\\.", 2);
+ public TemplateDataAttribute(String tag){
+ this.tag = tag;
+ String[] s = tag.trim().split("\\.", 2);
this.key = s[0];
if(s.length > 1)
this.attrib = s[1];
}
- public void compile(StringBuilder str) {
- if (data.containsKey(key)) {
+
+ public Object getObject(){
+ if (data.containsKey(tag))
+ return data.get(tag);
+ else if (data.containsKey(key)) {
if (attrib != null) {
Object obj = getFieldValue(data.get(key), attrib);
if(obj != null)
- str.append(obj.toString());
- else
- str.append("{{").append(key).append(".").append(attrib).append("}}");
+ return obj;
}
else
- str.append(data.get(key).toString());
+ return data.get(key);
}
+ return null;
+ }
+ protected Object getFieldValue(Object obj, String attrib){
+ try {
+ for (Field field : obj.getClass().getDeclaredFields()) {
+ if(field.getName().equals(attrib)) {
+ field.setAccessible(true);
+ return field.get(obj);
+ }
+ }
+ }catch (IllegalAccessException e){
+ log.log(Level.WARNING, null, e);
+ }
+ return null;
+ }
+
+
+ public void compile(StringBuilder str) {
+ Object obj = getObject();
+ if(obj != null)
+ str.append(obj.toString());
else
- str.append("{{").append(key).append("}}");
+ str.append("{{").append(tag).append("}}");
}
}
}
diff --git a/src/zutil/test/TemplatorTest.java b/src/zutil/test/TemplatorTest.java
index 1fc4121..c4720d7 100644
--- a/src/zutil/test/TemplatorTest.java
+++ b/src/zutil/test/TemplatorTest.java
@@ -25,6 +25,10 @@ package zutil.test;
import org.junit.Test;
import zutil.parser.Templator;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
import static org.junit.Assert.*;
/**
@@ -35,27 +39,10 @@ public class TemplatorTest {
public String attr;
}
+
+
@Test
- public void emptyAttributeTest(){
- Templator tmpl = new Templator("{{test}}");
- assertEquals("{{test}}", tmpl.compile());
- }
- @Test
- public void simpleAttributeTest() {
- Templator tmpl = new Templator("{{test}}");
- tmpl.set("test", "1234");
- assertEquals("1234", tmpl.compile());
- }
- @Test
- public void objectAttributeTest(){
- Templator tmpl = new Templator("{{test.attr}}");
- TestClass obj = new TestClass();
- obj.attr = "1234";
- tmpl.set("test", obj);
- assertEquals("1234", tmpl.compile());
- }
- @Test
- public void incorrectTagsTest(){
+ public void tagIncorrectTest(){
assertEquals("{{",
new Templator("{{").compile());
assertEquals("}}",
@@ -73,27 +60,30 @@ public class TemplatorTest {
assertEquals("{test}",
new Templator("{test}").compile());
}
+ @Test
+ public void attributeEmptyTest(){
+ Templator tmpl = new Templator("{{test}}");
+ assertEquals("{{test}}", tmpl.compile());
+ }
+ @Test
+ public void attributeSimpleTest() {
+ Templator tmpl = new Templator("{{test}}");
+ tmpl.set("test", "1234");
+ assertEquals("1234", tmpl.compile());
+ }
+ @Test
+ public void attributeObjectTest(){
+ Templator tmpl = new Templator("{{test.attr}}");
+ TestClass obj = new TestClass();
+ obj.attr = "1234";
+ tmpl.set("test", obj);
+ assertEquals("1234", tmpl.compile());
+ }
+
@Test
- public void emptyConditionTest(){
- Templator tmpl = new Templator(
- "{{#key}}123456789{{/key}}");
- assertEquals(
- "",
- tmpl.compile());
- }
- @Test
- public void simpleConditionTest(){
- Templator tmpl = new Templator(
- "{{#key}}123456789{{/key}}");
- tmpl.set("key", "set");
- assertEquals(
- "123456789",
- tmpl.compile());
- }
- @Test
- public void incompleteConditionTest(){
+ public void conditionIncompleteTest(){
assertEquals("{{#key}}",
new Templator("{{#key}}").compile());
assertEquals("{{/key}}",
@@ -103,25 +93,122 @@ public class TemplatorTest {
assertEquals("",
new Templator("{{#key}}{{/key}}").compile());
}
-
-
@Test
- public void emptyNegativeConditionTest(){
+ public void conditionEmptyTest(){
Templator tmpl = new Templator(
- "{{^key}}123456789{{/key}}");
+ "{{#key}}123456789{{/key}}");
+ assertEquals(
+ "",
+ tmpl.compile());
+ }
+ @Test
+ public void conditionSimpleTest(){
+ Templator tmpl = new Templator(
+ "{{#key}}123456789{{/key}}");
+ tmpl.set("key", "set");
assertEquals(
"123456789",
tmpl.compile());
}
@Test
- public void setNegativeConditionTest(){
+ public void conditionObjectTest(){
+ Templator tmpl = new Templator("{{#test.attr}}5678{{/test.attr}}");
+ TestClass obj = new TestClass();
+ obj.attr = "1234";
+ tmpl.set("test", obj);
+ assertEquals("5678", tmpl.compile());
+
+ tmpl.clear();
+ tmpl.set("test", new TestClass());
+ assertEquals("", tmpl.compile());
+ }
+ @Test
+ public void conditionBooleanTest(){
+ Templator tmpl = new Templator(
+ "{{#key}}123456789{{/key}}");
+ tmpl.set("key", true);
+ assertEquals(
+ "123456789", tmpl.compile());
+
+ tmpl.set("key", false);
+ assertEquals(
+ "", tmpl.compile());
+ }
+
+
+
+ @Test
+ public void conditionIteratorEmptyTest(){
+ Templator tmpl = new Templator("{{#list}}1234 {{.}} {{/list}}");
+ tmpl.set("list", new ArrayList());
+ assertEquals(
+ "", tmpl.compile());
+ }
+ @Test
+ public void conditionIteratorTest(){
+ Templator tmpl = new Templator("{{#list}}{{.}}{{/list}}");
+ tmpl.set("list", Arrays.asList(1,2,3,4,5,6,7,8,9));
+ assertEquals(
+ "123456789", tmpl.compile());
+ }
+
+
+ @Test
+ public void negativeConditionEmptyTest(){
+ Templator tmpl = new Templator(
+ "{{^key}}123456789{{/key}}");
+ assertEquals(
+ "123456789", tmpl.compile());
+ }
+ @Test
+ public void negativeConditionSetTest(){
Templator tmpl = new Templator(
"{{^key}}123456789{{/key}}");
tmpl.set("key", "set");
assertEquals(
- "",
- tmpl.compile());
+ "", tmpl.compile());
}
+ @Test
+ public void negativeConditionObjectTest(){
+ Templator tmpl = new Templator("{{^test.attr}}5678{{/test.attr}}");
+ TestClass obj = new TestClass();
+ obj.attr = "1234";
+ tmpl.set("test", obj);
+ assertEquals("", tmpl.compile());
+
+ tmpl.clear();
+ tmpl.set("test", new TestClass());
+ assertEquals("5678", tmpl.compile());
+ }
+ @Test
+ public void negativeConditionIteratorTest(){
+ Templator tmpl = new Templator(
+ "{{^key}}123456789{{/key}}");
+ tmpl.set("key", Arrays.asList(1,2,3,4,5,6,7,8,9));
+ assertEquals(
+ "", tmpl.compile());
+ }
+ @Test
+ public void negativeConditionIteratorEmptyTest(){
+ Templator tmpl = new Templator(
+ "{{^key}}123456789{{/key}}");
+ tmpl.set("key", new ArrayList());
+ assertEquals(
+ "123456789", tmpl.compile());
+ }
+ @Test
+ public void negativeConditionBooleanTest(){
+ Templator tmpl = new Templator(
+ "{{^key}}123456789{{/key}}");
+ tmpl.set("key", true);
+ assertEquals(
+ "", tmpl.compile());
+
+ tmpl.set("key", false);
+ assertEquals(
+ "123456789", tmpl.compile());
+ }
+
@Test
@@ -129,7 +216,6 @@ public class TemplatorTest {
Templator tmpl = new Templator(
"{{! This is a comment}}");
assertEquals(
- "",
- tmpl.compile());
+ "", tmpl.compile());
}
}