Skip to content

Instantly share code, notes, and snippets.

@contextfw
Created July 31, 2011 12:05
Show Gist options
  • Select an option

  • Save contextfw/1116736 to your computer and use it in GitHub Desktop.

Select an option

Save contextfw/1116736 to your computer and use it in GitHub Desktop.
JsTemplateProcessor
import java.util.List;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Text;
public class JsTemplateProcessor {
public String process(Document document) {
List<Element> elements = document.getRootElement().selectNodes("//js:template");
StringBuilder b = new StringBuilder();
for (Element element : elements) {
b.append(element.attributeValue("declaration")).append(" { \n");
StringBuilder buffer = new StringBuilder();
b.append("var b = [];\n");
for (Object obj : element.content()) {
traverse(b, buffer, obj);
}
flushBuffer(b, buffer);
b.append("return b.join('');\n");
b.append("}\n");
element.detach();
}
return b.toString();
}
private void traverse(StringBuilder b, StringBuilder buffer, Object obj) {
if (obj instanceof Text) {
buffer.append(((Text) obj).getText());
} else if (obj instanceof Element) {
traverseEl(b, buffer, (Element) obj);
} else {
b.append(obj.getClass().getSimpleName()).append("\n");
}
}
private void traverseEl(StringBuilder b, StringBuilder buffer, Element element) {
String name = element.getName();
String prefix = element.getNamespacePrefix();
if ("js".equals(prefix)) {
flushBuffer(b, buffer);
if ("script".equals(name)) {
b.append(StringUtils.trimToEmpty(element.getText()) + "\n");
} else if ("var".equals(name)) {
b.append("b.push(" + element.attributeValue("name") + ");\n");
} else if ("if".equals(name)) {
b.append("if (" + element.attributeValue("test") + ") {\n");
for (Object obj : element.content()) {
traverse(b, buffer, obj);
}
flushBuffer(b, buffer);
b.append("}\n");
} else if ("elseif".equals(name)) {
b.append("} else if (" + element.attributeValue("test") + ") {\n");
}
} else {
buffer.append("<").append(name);
addAttributes(b, buffer, element.attributes());
String lName = name.toLowerCase();
if ("area".equals(lName) ||
"base".equals(lName) ||
"basefont".equals(lName) ||
"br".equals(lName) ||
"col".equals(lName) ||
"frame".equals(lName) ||
"hr".equals(lName) ||
"img".equals(lName) ||
"input".equals(lName) ||
"link".equals(lName) ||
"meta".equals(lName) ||
"param".equals(lName)) {
buffer.append("/>");
} else {
buffer.append(">");
for (Object obj : element.content()) {
traverse(b, buffer, obj);
}
buffer.append("</" + name + ">");
}
}
}
private void flushBuffer(StringBuilder b, StringBuilder buffer) {
b.append("b.push('" + StringEscapeUtils.escapeJavaScript(buffer.toString()) + "');\n");
buffer.setLength(0);
}
private void addAttributes(StringBuilder b, StringBuilder buffer, List<Attribute> attrs) {
if (attrs.size() > 0) {
for (Attribute attr : attrs) {
if (attr.getNamespacePrefix().equals("js")) {
flushBuffer(b, buffer);
b.append("if (" + attr.getValue() + " != undefined) b.push(' " + attr.getName()
+ "=\"'+" + attr.getValue() + "+'\"');\n");
} else {
buffer.append(" " + attr.getName() + "=\"" + attr.getValue() + "\"");
}
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment