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()); } }