added pretty good pretty-printing
authoradam <adam@megacz.com>
Thu, 12 Jan 2006 07:18:47 +0000 (02:18 -0500)
committeradam <adam@megacz.com>
Thu, 12 Jan 2006 07:18:47 +0000 (02:18 -0500)
darcs-hash:20060112071847-5007d-fb5bea953ae6d64db23b1e1612efed112fa25100.gz

src/edu/berkeley/sbp/Tree.java
src/edu/berkeley/sbp/tib/TibDoc.java
src/edu/berkeley/sbp/util/PrintableTree.java

index e7f2ef7..6b295a5 100644 (file)
@@ -30,6 +30,13 @@ public class Tree<T> extends PrintableTree<Tree<T>> implements Iterable<Tree<T>>
         this.children = children2;
     }
 
+    /** since Tree instances are immutable, we can cache this to make pretty-printing MUCH faster */
+    public String toString() {
+        if (toString!=null) return toString;
+        return toString = super.toString();
+    }
+    private String toString = null;
+
     protected String headToString() { return head==null?null:head.toString(); }
     protected String headToJava()   { return head==null?null:StringUtil.toJavaString(head+""); }
 }
index a262191..a823b36 100644 (file)
@@ -22,7 +22,8 @@ public class TibDoc {
         System.out.println("\nparsing " + s[1]);
         Forest f = new CharToken.CharToStringParser(mg).parse(new Tib(new FileInputStream(s[1])));
         System.out.println(f);
-        System.out.println(((Tree)walk(f.expand1())).toString(0, 0, 120));
+        //System.out.println(((Tree)walk(f.expand1())).toString(0, 0, 120));
+        System.out.println(((Tree)walk(f.expand1())).toPrettyString());
     }
 
     public static Tree<String> walk(Tree<String> tree) {
index c805cab..f0947fb 100644 (file)
@@ -9,68 +9,33 @@ public abstract class PrintableTree<T extends PrintableTree> implements Iterable
 
     protected abstract String headToString();
     protected abstract String headToJava();    
+    protected abstract int    numChildren();
 
-    private boolean empty() {
-        for(T t : this) return false;
-        return true;
-    }
-
-    private static final int MAXDEPTH=3;
-    public int depth() {
-        int depth = headToString()==null ? 0 : 1;
-        int ret = depth;
-        for(T t : this) ret = Math.max(ret, depth+t.depth());
-        return ret;
-    }
-    public String toString(int indent0, int cur, int limit) {
-        int indent = indent0;
-        String s = toString();
-        if (depth()<MAXDEPTH && s.length() < limit-cur) return s;
-        StringBuffer ret = new StringBuffer();
+    private static final int MAXCHARS=40;
 
-        if (cur>indent) {
-            ret.append('\n'); for(int i=0; i<indent; i++) ret.append(' ');
-            cur = indent;
-        }
-        
+    private boolean basic() { return toString().length() < MAXCHARS; }
+    public String toPrettyString() { return toPrettyString("\n"); }
+    private String toPrettyString(String nl) {
+        String str = toString();
+        if (str.length() < MAXCHARS) return str;
         String head = headToString();
-        if (head==null) {
-            ret.append("{");
-        } else {
-            ret.append(head);
-            if (empty()) return ret.toString();
-            ret.append(":");
-            indent += 2;
-            ret.append('\n'); for(int i=0; i<indent; i++) ret.append(' ');
-            cur = indent;
-        }
-
+        StringBuffer ret = new StringBuffer();
+        if (numChildren()==0) return head==null ? "{}" : head;
+        ret.append(head==null?"{ ":(head+":"+nl));
+        boolean first = true;
+        int len = 0;
         for(T t : this) {
-            s = t.toString(indent+2, cur, limit);
-            while(s.indexOf('\n') != -1) {
-                ret.append(s.substring(0, s.indexOf('\n')));
-                s = s.substring(s.indexOf('\n')+1);
-                if (s.length() > 0) ret.append("\n  ");
+            String s = t.basic() ? t.toString() : t.toPrettyString(nl+"  ");
+            if (!first) {
+                if (!t.basic())                ret.append(nl);
+                if (s.length()+len>MAXCHARS) { ret.append(nl); len = 0; }
+                else                         { ret.append(" "); len++; }
             }
+            first = false;
             ret.append(s);
-            if (s.indexOf('\n')!=-1)
-                cur = s.length()-s.lastIndexOf('\n');
-            else
-                cur += s.length();
-            if (cur>indent) {
-                ret.append(' ');
-                cur += s.length()+1;
-            }
-        }
-        if (head==null) {
-            ret.append("}");
-        } else if (cur>indent) {
-            /*
-            indent = indent0;
-            ret.append('\n'); for(int i=0; i<indent; i++) ret.append(' ');
-            cur = indent;
-            */
+            len += s.length();
         }
+        if (head==null) ret.append(" }");
         return ret.toString();
     }