Added condition logic to template. Not robust yet
This commit is contained in:
parent
d7b66238ed
commit
255585c9b1
3 changed files with 68 additions and 15 deletions
|
|
@ -32,11 +32,16 @@ import java.util.List;
|
|||
* Class for generating dynamic text/code from set data.
|
||||
* The syntax is similar to the javascript mustache library.
|
||||
*
|
||||
* <br /><br />
|
||||
* 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>
|
||||
*
|
||||
*
|
||||
* Created by Ziver on 2015-03-23.
|
||||
* @author Ziver koc
|
||||
*/
|
||||
public class Templator {
|
||||
private HashMap<String,Object> data;
|
||||
|
|
@ -70,10 +75,10 @@ public class Templator {
|
|||
*/
|
||||
private void parseTemplate(String tmpl){
|
||||
TemplateNode node = new TemplateNode();
|
||||
parseTemplate(node, tmpl, new MutableInt());
|
||||
parseTemplate(node, tmpl, new MutableInt(), null);
|
||||
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 tags = new StringBuilder();
|
||||
boolean tagOpen = false;
|
||||
|
|
@ -89,7 +94,6 @@ public class Templator {
|
|||
tags.append("{{");
|
||||
tagOpen = true;
|
||||
++m.i;
|
||||
|
||||
break;
|
||||
case "}}":
|
||||
if(!tagOpen){ // Tag not opened, incorrect enclosure
|
||||
|
|
@ -98,8 +102,20 @@ public class Templator {
|
|||
}
|
||||
tagOpen = false;
|
||||
++m.i;
|
||||
root.addEntity(new TmplDataAttribute(data.toString()));
|
||||
String tagName = data.toString();
|
||||
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;
|
||||
default:
|
||||
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 {
|
||||
private String text;
|
||||
|
||||
|
|
|
|||
|
|
@ -25,14 +25,9 @@ package zutil.test;
|
|||
import com.carrotsearch.junitbenchmarks.BenchmarkRule;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.rules.MethodRule;
|
||||
import zutil.io.StringOutputStream;
|
||||
import zutil.parser.json.JSONObjectInputStream;
|
||||
import zutil.parser.json.JSONObjectOutputStream;
|
||||
import zutil.test.JSONSerializerTest.*;
|
||||
import zutil.test.JSONSerializerTest.TestClass;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.Arrays;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
|
|
|
|||
|
|
@ -38,13 +38,11 @@ public class TemplatorTest {
|
|||
tmpl.setData("test", "1234");
|
||||
assertEquals("<HTML>1234</HTML>", tmpl.compile());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void emptyAttributeTest(){
|
||||
Templator tmpl = new Templator("<HTML>{{test}}</HTML>");
|
||||
assertEquals("<HTML>{{test}}</HTML>", tmpl.compile());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void incorrectTagsTest(){
|
||||
assertEquals("<HTML>{{</HTML>",
|
||||
|
|
@ -64,4 +62,35 @@ public class TemplatorTest {
|
|||
assertEquals("<HTML>{test}</HTML>",
|
||||
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());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue