X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Ftib%2FTibDoc.java;h=a86fb2b21b258a3297abae91e23e7ef4e40f3153;hb=87695da08b22551ad4a7695cd3144903364dd4bb;hp=3a53cf24029593c07eedba07461c8d33cdbe1413;hpb=2177e4743ea680e24f0cc0525185e8f95d0dd41b;p=sbp.git
diff --git a/src/edu/berkeley/sbp/tib/TibDoc.java b/src/edu/berkeley/sbp/tib/TibDoc.java
index 3a53cf2..a86fb2b 100644
--- a/src/edu/berkeley/sbp/tib/TibDoc.java
+++ b/src/edu/berkeley/sbp/tib/TibDoc.java
@@ -9,11 +9,13 @@ import edu.berkeley.sbp.util.*;
import edu.berkeley.sbp.chr.*;
import java.util.*;
import java.io.*;
+import static edu.berkeley.sbp.misc.Demo.*;
public class TibDoc {
-
- public static Text lf() { Chars ret = new Chars(); ret.text = "\n"; return ret; }
- public static Text cr() { Chars ret = new Chars(); ret.text = "\r"; return ret; }
+ /*
+ public static Text lf() { Chars ret = new Chars(); ret.text = "\n"; return ret; }
+ public static Text cr() { Chars ret = new Chars(); ret.text = "\r"; return ret; }
+ public static Text emdash() { return new Entity("mdash"); }
public static char urlescape(int a, int b) { return (char)(10*a+b); }
@@ -22,16 +24,16 @@ public class TibDoc {
public static abstract class Text implements ToHTML {
public static final Class[] subclasses = new Class[] { Chars.class, URL.class, Email.class };
public void toHTML(ToHTML.HTML sb) { }
- }
- public static class TextString extends Text {
- public String text;
- public String tag() { return null; }
- public void toHTML(ToHTML.HTML sb) { sb.tag(tag(), text); }
- }
- public static class TextArray extends Text {
- public Text[] t;
- public String tag() { return null; }
- public void toHTML(ToHTML.HTML sb) { sb.tag(tag(), t); }
+ public static class TextString extends Text {
+ public String text;
+ public String tag() { return null; }
+ public void toHTML(ToHTML.HTML sb) { sb.tag(tag(), text); }
+ }
+ public static class TextArray extends Text {
+ public Text[] t;
+ public String tag() { return null; }
+ public void toHTML(ToHTML.HTML sb) { sb.tag(tag(), t); }
+ }
}
@@ -59,35 +61,74 @@ public class TibDoc {
}
}
- // Tags //////////////////////////////////////////////////////////////////////////////
- public static class Keyword extends TextString { public String tag() { return "tt"; } }
- public static class Bold extends TextArray { public String tag() { return "b"; } }
- public static class Smallcap extends TextArray { public String tag() { return "sc"; } }
- public static class Subscript extends TextString { public String tag() { return "sub"; } }
- public static class Superscript extends TextString { public String tag() { return "super"; } }
- public static class Strikethrough extends TextArray { public String tag() { return "strike"; } }
- public static class TT extends TextArray { public String tag() { return "tt"; } }
- public static class Underline extends TextArray { public String tag() { return "u"; } }
- public static class Citation extends TextArray { /* FIXME */ }
- public static class Footnote extends TextArray { /* FIXME */ }
-
- public static class Chars extends TextString { }
- public static class Symbol extends TextString { }
-
- public static interface Host extends ToHTML { }
- public static class DNS implements Host {
- public String[] part;
+ // Paragraph //////////////////////////////////////////////////////////////////////////////
+
+ public static interface Paragraph extends ToHTML {
+ public static final Class[] subclasses = new Class[] { Blockquote.class, P.class, HR.class };
+ public static class HR implements Paragraph { public void toHTML(ToHTML.HTML sb) { sb.append("\n
\n"); } }
+ public static class P extends Text.TextArray implements Paragraph { public String tag() { return "p"; } }
+ public static class Blockquote extends Text.TextArray implements Paragraph { public String tag() { return "blockquote"; } }
+ }
+
+ public static abstract class List extends Text {
+ public Text[][] points;
+ public abstract String tag();
public void toHTML(ToHTML.HTML sb) {
- sb.append("");
- for(int i=0; i");
+ sb.append("<"+tag()+">\n");
+ for(Text[] t : points) sb.tag("li", t);
+ sb.append(""+tag()+">\n");
}
}
- public static class IP implements Host {
- public int a, b, c, d;
- public void toHTML(ToHTML.HTML sb) { sb.append(""+a+"."+b+"."+c+"."+d+""); }
+ public static class OL extends List { public String tag() { return "ol"; } }
+ public static class UL extends List { public String tag() { return "ul"; } }
+
+
+
+ // Tags //////////////////////////////////////////////////////////////////////////////
+
+ public static class Chars extends Text.TextString { }
+ public static class Symbol extends Text.TextString { }
+ public static class Keyword extends Text.TextString { public String tag() { return "tt"; } }
+ public static class Subscript extends Text.TextString { public String tag() { return "sub"; } }
+ public static class Superscript extends Text.TextString { public String tag() { return "super"; } }
+ public static class Bold extends Text.TextArray { public String tag() { return "b"; } }
+ public static class Smallcap extends Text.TextArray { public String tag() { return "sc"; } }
+ public static class Strikethrough extends Text.TextArray { public String tag() { return "strike"; } }
+ public static class TT extends Text.TextArray { public String tag() { return "tt"; } }
+ public static class Underline extends Text.TextArray { public String tag() { return "u"; } }
+ public static class Italic extends Text.TextArray { public String tag() { return "i"; } }
+ public static class Citation extends Text.TextArray { } // FIXME
+ public static class Footnote extends Text.TextArray { } // FIXME
+ public static class LineBreak extends Text { public void toHTML(ToHTML.HTML sb) { sb.tag("br"); } }
+ public static class Today extends Text { }
+ public static class Euro extends Text { public void toHTML(ToHTML.HTML sb) { sb.entity(8364); } }
+ public static class Link extends Text {
+ public Text[] text;
+ public URI href;
+ public void toHTML(ToHTML.HTML sb) { sb.tag("a", new Object[] { "href", href }, text); }
+ }
+ public static class Entity extends Text {
+ public final String entity;
+ public Entity(String entity) { this.entity = entity; }
+ public void toHTML(ToHTML.HTML sb) { sb.entity(entity); }
+ }
+
+
+ // Network //////////////////////////////////////////////////////////////////////////////
+
+ public static interface Host extends ToHTML {
+ public static class DNS implements Host {
+ public String[] part;
+ public void toHTML(ToHTML.HTML sb) {
+ for(int i=0; i");
- sb.append(body);
- sb.append("");
- }
- }
-
- public static class LineBreak extends Text {
- public void toHTML(ToHTML.HTML sb) {
- sb.append("
");
- }
- }
- public static class Today extends Text { }
- public static class Euro extends Text {
- public void toHTML(ToHTML.HTML sb) {
- sb.append("€");
- }
- }
- public static class Link extends Text {
- public static final Class[] subclasses = new Class[] { LinkWord.class, LinkText.class };
- public static class LinkWord extends Link {
- public String word;
- public URI href;
- public void toHTML(ToHTML.HTML sb) {
- sb.append("");
- sb.append(word);
- sb.append("");
- }
- }
- public static class LinkText extends Link {
- public Text[] text;
- public URI href;
- public void toHTML(ToHTML.HTML sb) {
- sb.append("");
- sb.append(text);
- sb.append("");
- }
- }
- }
-
-
- // Paragraph //////////////////////////////////////////////////////////////////////////////
- public static interface Paragraph extends ToHTML {
- public static final Class[] subclasses = new Class[] { Blockquote.class, P.class, HR.class };
- public static class HR implements Paragraph {
- public void toHTML(ToHTML.HTML sb) { sb.append("\n
\n"); }
- }
- public static class P extends TextArray implements Paragraph {
- public void toHTML(ToHTML.HTML sb) {
- sb.append("\n ");
- super.toHTML(sb);
- sb.append("
\n");
- }
- }
- public static class Blockquote extends TextArray implements Paragraph {
- public String tag() { return "blockquote"; }
- }
- }
- // Lists //////////////////////////////////////////////////////////////////////////////
-
- public static abstract class List extends Text {
- public Text[][] points;
- public abstract String tag();
- public void toHTML(ToHTML.HTML sb) {
- sb.append("<"+tag()+">\n");
- for(Text[] t : points) {
- sb.append(" ");
- sb.append(t);
- sb.append(" \n");
- }
- sb.append(""+tag()+">\n");
- }
- }
- public static class OL extends List { public String tag() { return "ol"; } }
- public static class UL extends List { public String tag() { return "ul"; } }
-
-
- // Main //////////////////////////////////////////////////////////////////////////////
-
- public static void main(String[] s) throws Exception {
- try {
- System.out.println("parsing " + s[0]);
- Tree res = new CharParser(MetaGrammar.make()).parse(new FileInputStream(s[0])).expand1();
- MetaGrammar gram = new Tib.Grammar(TibDoc.class);
- gram = (MetaGrammar)gram.walk(res);
- //System.out.println(gram);
- Union mg = gram.done();
-
- System.out.println("\nparsing " + s[1]);
- Forest f = new CharParser(mg).parse(new Tib(new FileInputStream(s[1])));
- //((Tree)new StringifyWalker().walk(f.expand1())).toPrettyString()
- System.out.println();
- System.out.println(f.expand1().toPrettyString());
- System.out.println();
- Doc doc = (Doc)new ReflectiveGrammar(TibDoc.class).build(f.expand1());
- System.out.println(doc);
- System.out.println();
- System.out.println();
- System.out.println();
- System.out.println();
- StringBuffer sb = new StringBuffer();
- doc.toHTML(new ToHTML.HTML(sb));
- System.out.println(sb);
- /*
- String st = new HTMLWalker().walk(f.expand1()).toString();
- System.out.println(st);
- FileOutputStream fos = new FileOutputStream("out.html");
- PrintWriter p = new PrintWriter(new OutputStreamWriter(fos));
- p.println(st);
- p.flush();
- p.close();
- */
- } catch (Ambiguous a) {
- FileOutputStream fos = new FileOutputStream("/Users/megacz/Desktop/out.dot");
- PrintWriter p = new PrintWriter(new OutputStreamWriter(fos));
- GraphViz gv = new GraphViz();
- a.ambiguity.toGraphViz(gv);
- gv.dump(p);
- p.flush();
- p.close();
- a.printStackTrace();
-
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
+ */
/*
- public static enum Style { H, UL, TT, SO, IT, Q, B, PRE, LIST, EMDASH; }
-
- public static AST h(AST a) { return new Gather(a, Style.H); }
- public static AST ul(AST a) { return new Gather(a, Style.UL); }
- public static AST tt(AST a) { return new Gather(a, Style.TT); }
- public static AST so(AST a) { return new Gather(a, Style.SO); }
- public static AST it(AST a) { return new Gather(a, Style.IT); }
- public static AST q(AST a) { return new Gather(a, Style.Q); }
- public static AST b(AST a) { return new Gather(a, Style.B); }
- public static AST pre(AST a) { return new Gather(a, Style.PRE); }
- public static AST list(AST a) { return new Gather(a, Style.LIST); }
- public static AST emdash() { return new Gather(Style.EMDASH); }
-
- public static AST seq(AST a) { return new Gather(a); }
-
- public static class Latex {
- public static void emit(PrintWriter p, AST a) {
- prefix(p);
- emit(p, a, "");
- suffix(p);
- }
- public static void emit2(PrintWriter p, AST ast, String head) {
- for(AST a = ast.getFirstChild(); a != null; a = a.getNextSibling()) emit(p, a, head);
- }
- public static void emit(PrintWriter p, AST ast, String head) {
- if (!(ast instanceof Gather)) {
- if (ast.getNumberOfChildren()==0) {
- p.print(ast.getText());
- } else {
- emit2(p, ast, head);
- }
- return;
- }
- Gather a = (Gather)ast;
- if (a.style==null) {
- emit2(p, a, head);
- return;
- }
- switch(a.style) {
- case H: p.println(); p.println(); p.print("\\"+head+"section{"); emit2(p, a, "sub"+head); p.println("}"); break;
- case B: p.print("{\\bf{"); emit2(p, a, head); p.print("}}"); break;
- case UL: p.print("{\\ul{"); emit2(p, a, head); p.print("}}"); break;
- case IT: p.print("{\\it{"); emit2(p, a, head); p.print("}}"); break;
- case TT: p.print("{\\tt{"); emit2(p, a, head); p.print("}}"); break;
- case SO: p.print("{\\overstrike{"); emit2(p, a, head); p.print("}}"); break;
- case Q: p.print("``"); emit2(p, a, head); p.print("''"); break;
- case EMDASH: p.print(" \\emdash "); break;
- case LIST: p.println(); p.println("\\startitemize[symbol]"); emit2(p, a, head); p.println("\\stopitemize"); break;
- case PRE:
- if (a.getFirstChild() != null) {
- p.println();
- p.println("\\begin{verbatim}");
- p.println(a.getFirstChild().getText());
- p.println("\\end{verbatim}");
- }
- }
- }
public static void prefix(PrintWriter p) {
p.println("% generated by TIBDOC");
for(int i=0; i");
+ return ret.toString();
+ }
+ }
+
+ public @nonterminal("Body") static class Body {
+ public Section[] sections;
+ // FIXME: it would be nice to be able to
+ // void kv(String, String) { ... } imperatively
+ public String toString() {
+ StringBuffer ret = new StringBuffer();
+ ret.append("<");
+ for(Object kv : sections) ret .append(kv);
+ ret.append(">");
+ return ret.toString();
+ }
+ }
+
+ public @nonterminal("Section") static class Section {
+ public Object @arg header;
+ public Object[] @arg paragraphs;
+ }
+
+ public @nonterminal("kv") static class KV {
+ public @arg("key") String key;
+ public @arg("val") Object val;
+ public String toString() { return "KV["+key+"="+val+"]"; }
+ }
+ }
+
+ public static void main(String[] s) throws Exception {
+ try {
+
+ Demo.ReflectiveMeta m =
+ new Demo.ReflectiveMeta(TibDoc.TD.class,
+ new Class[] {
+ TibDoc.TD.Doc.class,
+ TibDoc.TD.Header.class,
+ TibDoc.TD.Section.class,
+ TibDoc.TD.Body.class,
+ TibDoc.TD.KV.class
+ });
+ Tree res = new CharParser(MetaGrammar.make()).parse(new FileInputStream(s[0])).expand1();
+ MetaGrammar.Meta.MetaGrammarFile mgf = m.new MetaGrammarFile(res);
+ MetaGrammar.BuildContext bc = new MetaGrammar.BuildContext(mgf);
+ Union tibgram = mgf.get("s").build(bc);
+
+ System.err.println("parsing " + s[1]);
+ Tree t = new CharParser(tibgram).parse(new Tib(new FileInputStream(s[1]))).expand1();
+ System.out.println("tree:\n" + t.toPrettyString());
+
+ Reducer red = (Reducer)t.head();
+ Object result = red.reduce(t);
+ System.out.println((TD.Doc)result);
+ /*
+ System.out.println("parsing " + s[0]);
+ Tree res = new CharParser(MetaGrammar.make()).parse(new FileInputStream(s[0])).expand1();
+ MetaGrammar gram = new Tib.Grammar(TibDoc.class);
+ gram = (MetaGrammar)gram.walk(res);
+ System.out.println("\nparsing " + s[1]);
+ Forest f = new CharParser(gram.done()).parse(new Tib(new FileInputStream(s[1])));
+ System.out.println();
+ System.out.println(f.expand1().toPrettyString());
+ System.out.println();
+ Doc doc = (Doc)new ReflectiveGrammar(TibDoc.class).build(f.expand1());
+ System.out.println(doc);
+ System.out.println();
+ System.out.println();
+ System.out.println();
+ System.out.println();
+ StringBuffer sb = new StringBuffer();
+ doc.toHTML(new ToHTML.HTML(sb));
+ System.out.println(sb);
+
+ FileOutputStream fos = new FileOutputStream("out.html");
+ PrintWriter p = new PrintWriter(new OutputStreamWriter(fos));
+ p.println(sb);
+ p.flush();
+ p.close();
+ */
+ } catch (Ambiguous a) {
+ FileOutputStream fos = new FileOutputStream("/Users/megacz/Desktop/out.dot");
+ PrintWriter p = new PrintWriter(new OutputStreamWriter(fos));
+ GraphViz gv = new GraphViz();
+ a.ambiguity.toGraphViz(gv);
+ gv.dump(p);
+ p.flush();
+ p.close();
+ a.printStackTrace();
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
}