package org.rendersnake.generator;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.rendersnake.StringResource;
import org.rendersnake.generator.AttributesMethodsGenerator.Attribute;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class CanvasMethodsGenerator extends DefaultHandler {
class Method {
public String name;
public String selector;
public String description;
public boolean deprecated = false;
public boolean endTagForbidden = false;
}
private Map<String, Method> attributesMap = new HashMap<String, Method>();
boolean isTest = false;
public static void main(String[] args) throws Exception {
SAXParser p = SAXParserFactory.newInstance().newSAXParser();
String input = "../html-codegen/html4-doc.xml";
CanvasMethodsGenerator gen = new CanvasMethodsGenerator();
if (args.length > 0) {
gen.isTest = args[0].equals("t");
}
p.parse(new File(input), gen);
gen.exportMethods();
}
@Override
public void startElement(String uri, String localName, String qname, Attributes attrs) throws SAXException {
if (!"tag".equals(qname))
return;
Method method = new Method();
method.name = attrs.getValue("name");
method.selector = this.selectorFor(method.name);
method.description = attrs.getValue("description");
method.deprecated = "true".equals(attrs.getValue("deprecated"));
method.endTagForbidden = "forbidden".equals(attrs.getValue("endTag"));
attributesMap.put(method.name, method);
}
protected void exportMethods() {
for (Method each : attributesMap.values())
this.exportMethodFor(each);
}
protected String selectorFor(String name) {
// apply exceptions because of reserved words in the Java language
if (name.indexOf("-") > 0) {
return name.replace("-", "_");
} else if (name.indexOf(":") > 0) {
return name.replace(":", "_");
} else if (name.startsWith("on")) {
// capitalize char after on
return "on" + (Character.toUpperCase(name.charAt(2))) + name.substring(3);
}
// use as is
return name;
}
protected void exportMethodFor(Method method) {
if (method.deprecated) return;
String template = "content/CanvasMethod.txt";
if (isTest) {
template = "content/CanvasTestMethod.txt";
if (method.endTagForbidden) template = "content/CanvasTestSelfClosingMethod.txt";
}
System.out.print(String.format(StringResource.get(template)
,method.name
,method.selector
,method.description));
}
}