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.
|
* 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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue