package org.qrone.r7.parser;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
public abstract class HTML5TagWriter extends HTML5Visitor {
public static final String[] noendtags = {"br", "img", "hr", "meta", "input", "embed", "area", "base", "col", "keygen", "link", "param", "source"};
public static final String[] nnendtags = {"li", "dt", "dd", "p", "tr", "td", "th", "rt", "rp", "optgroup", "option", "thread", "tfoot"};
public static final Set<String> noendtaglist = new HashSet<String>();
protected HTML5Writer b;
protected String id;
protected URI uri;
protected String ticket;
public HTML5TagWriter(HTML5Writer b, String id, URI uri, String ticket) {
super();
this.b = b;
this.id = id;
this.uri = uri;
this.ticket = ticket;
}
protected void append_pre(String str) {
char[] ch = str.toCharArray();
for (int i = 0; i < ch.length; i++) {
switch (ch[i]) {
case '<':
b.append("<");
break;
case '>':
b.append(">");
break;
case '"':
b.append(""");
break;
case '&':
b.append("&");
break;
case ' ':
case '\u00A0':
b.append(" ");
break;
case '\0':
break;
default:
b.append(ch[i]);
break;
}
}
}
protected void append(String str) {
if(str == null) return;
b.append(str);
}
protected String escape(String str) {
StringBuilder b = new StringBuilder();
boolean white = false;
char[] ch = str.toCharArray();
for (int i = 0; i < ch.length; i++) {
switch (ch[i]) {
case '\t':
case '\r':
case '\n':
case ' ':
if (!white) {
b.append(' ');
white = true;
}
break;
case '<':
b.append("<");
break;
case '>':
b.append(">");
break;
case '"':
b.append(""");
break;
case '&':
b.append("&");
break;
case '\u00A0':
b.append(" ");
break;
case '\0':
break;
default:
b.append(ch[i]);
white = false;
break;
}
}
return b.toString();
}
protected void start(Element e) {
b.append('<');
b.append(e.getNodeName());
NamedNodeMap map = e.getAttributes();
for (int i = 0; i < map.getLength(); i++) {
Node n = map.item(i);
if(n.getNodeName().equals("id")){
b.append(' ');
b.append(n.getNodeName());
b.append('=');
b.append('"');
String rawid = n.getNodeValue();
if(rawid.startsWith("qrone.")){
b.append("qrone.");
b.append("id",id);
b.append(".");
b.append(escape(rawid.substring("qrone.".length())));
}else{
b.append(escape(rawid));
}
b.append('"');
}else if(n.getNodeValue().indexOf("__QRONE_ID__") >= 0 && (
n.getNodeName().startsWith("on") || (
n.getNodeName().startsWith("href")
&& n.getNodeValue().startsWith("javascript:")
))){
b.append(' ');
b.append(n.getNodeName());
b.append('=');
b.append('"');
String[] jslist = n.getNodeValue().split("__QRONE_ID__");
for (int j = 0; j < jslist.length; j++) {
if(j != 0){
b.append(escape("qrone(\"" + uri.toString() + "\",\""));
b.append("id",id);
b.append(escape("\")"));
}
b.append(jslist[j]);
}
b.append('"');
}else{
Attr attr = (Attr)n;
b.append(' ');
b.append(attr.getNodeName());
b.append('=');
b.append('"');
b.append(escape(attr.getNodeValue()));
b.append('"');
}
}
b.append('>');
}
protected void end(Element e) {
if(!noendtaglist.contains(e.getNodeName())){
b.append('<');
b.append('/');
b.append(e.getNodeName());
b.append('>');
}
}
}