checkpoint
[sbp.git] / src / edu / berkeley / sbp / tib / TibDoc.java
index 1a2fe23..ed6a31e 100644 (file)
@@ -40,19 +40,39 @@ public class TibDoc {
     }
 
     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("&amp;"); break;
+                    case '<':  sb.append("&lt;"); break;
+                    case '>':  sb.append("&gt;"); break;
+                    case '\'': sb.append("&apos;"); break;
+                    case '\"': sb.append("&quot;"); 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);
         }
     }