}
public static class HTMLWalker extends ReflectiveWalker {
- public void stringify() { /*mode = HEADER;*/throw new Error(); }
+ //public void header() { throw new Error(); }
+ public String ul(Object o) { return "<ul>"+o+"</ul>"; }
+ private Tree<String> lone(String s) {
+ StringBuffer sb = new StringBuffer();
+ for(int i=0; i<s.length(); i++) {
+ switch(s.charAt(i)) {
+ case '&': sb.append("&"); break;
+ case '<': sb.append("<"); break;
+ case '>': sb.append(">"); break;
+ case '\'': sb.append("'"); break;
+ case '\"': sb.append("""); break;
+ default: sb.append(s.charAt(i)); break;
+ }
+ }
+ return new Tree<String>(null, sb.toString(), new Tree[0]);
+ }
public Object walk(Tree<String> t) {
String head = t.head();
if ("stringify".equals(head)) {
StringBuffer ret = new StringBuffer();
for(Tree<String> child : t.child(0)) ret.append(child);
- return new Tree<String>(null, ret.toString());
+ return lone(ret.toString());
}
return super.walk(t);
}
public Object walk(String head, Object[] children) {
- if (children.length==0) return new Tree<String>(null, head, new Tree[0]);
- return new Tree<String>(null, head, (Tree<String>[])Reflection.lub(children));
+ Tree<String>[] kids = new Tree[children.length];
+ for(int i=0; i<children.length; i++) {
+ if (children[i]==null) kids[i]=null;
+ else if (children[i] instanceof String) kids[i] = lone((String)children[i]);
+ else kids[i] = (Tree<String>)children[i];
+ }
+ return new Tree<String>(null, head, kids);
}
}
styled ::= "__" text "__" => ul
| "((" text "))" => footnote
- | ( "[[" text "]]" => tt
- > "[" word "]" => citation
+ | ( "[[" text "]]" => tt
+ > "[" word "]" => citation
)
| "!!" text "!!" => strikethrough
| "^^" (word|block) => superscript
// Tokens ///////////////////////////////////////////////////////////////////
-word ::= alphanum++
+word ::= alphanum++ => stringify
| quoted
quoted ::= "\"" ((~[\"\\] | escaped)+) "\""