X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fibex%2Futil%2FDoc.java;h=255495205b906ab9d037ef9a31e29cdc314b97b5;hb=4daeeb4119b901d53b44913c86f8af3ce67db925;hp=f2780b0a98f2b2676f54e559a551ba395e1ba672;hpb=acbf688069a3aaabebb525dc9d35a5f79cb178ea;p=org.ibex.core.git
diff --git a/src/org/ibex/util/Doc.java b/src/org/ibex/util/Doc.java
index f2780b0..2554952 100644
--- a/src/org/ibex/util/Doc.java
+++ b/src/org/ibex/util/Doc.java
@@ -1,226 +1,702 @@
+
+// FEATURE:
-- syntax highlighting
+// FEATURE:
-- LaTeX moreverb package can help
+// FIXME: nest TextNodes within each other for bold+italic
+// FEATURE: property tree
+
package org.ibex.util;
import java.util.*;
import java.io.*;
import org.ibex.util.*;
public class Doc extends XML {
+
+ public static boolean slides = false;
+ Root root = null;
+ int skip = 0;
+ Vec nodeStack = new Vec();
+ String pending = "";
+ char[] buffer = new char[1024 * 1024];
+ int preStart = -1;
+
+ public Doc() { }
+
public static void main(String[] s) throws Exception {
+ if (s.length > 0 && "slides".equals(s[0])) slides = true;
Doc d = new Doc();
- d.parse(new InputStreamReader(System.in));
- ((Node)d.nodeStack.elementAt(0)).dumpLatex(System.out);
- System.out.println("\\end{document}");
+ Reader r = new InputStreamReader(System.in);
+ int len = 0;
+ while(true) {
+ int numread = r.read(d.buffer, len, d.buffer.length - len);
+ if (numread == -1) break;
+ len += numread;
+ if (len >= d.buffer.length) {
+ char[] newbuffer = new char[d.buffer.length * 2];
+ System.arraycopy(d.buffer, 0, newbuffer, 0, d.buffer.length);
+ d.buffer = newbuffer;
+ }
+ }
+ d.parse(new CharArrayReader(d.buffer));
+ StringBuffer sb = new StringBuffer();
+ d.root.dumpLatex(sb);
+ System.out.println(sb);
}
-
- Vec top = new Vec();
- Vec nodeStack = new Vec();
- public Doc() { nodeStack.addElement(new Node()); }
public void startElement(Element e) throws Exn {
+ if (preStart != -1) return;
+
+ Node target = (Node)nodeStack.lastElement();
+ if (target == null) target = (Node)victim;
+ if (target != null) {
+ if (pending.length() > 0) target.addText(pending);
+ pending = "";
+ }
+
String name = e.getLocalName();
- if (nodeStack.lastElement() != null && (nodeStack.lastElement() instanceof PRE)) {
- ((PRE)nodeStack.lastElement()).addText("<" + e.getQName() + ">");
- buffer++;
- return;
+ Node newGuy = null;
+ if (name.equals("ibex-doc")) { newGuy = new Root(e);
+ } else if (name.equals("section")) { newGuy = new Section(e);
+ } else if (name.equals("heading")) { newGuy = new Heading(e);
+ } else if (name.equals("appendix")) { newGuy = new Appendix(e);
+ } else if (name.equals("list")) { newGuy = new List();
+
+ } else if (name.equals("pre")) { preStart = getGlobalOffset();
+
+ } else if (name.equals("definition")) { newGuy = new Definition(e);
+ } else if (name.equals("math")) { newGuy = new Math(e);
+ } else if (name.equals("property")) { newGuy = new Property(e);
+
+ } else if (name.equals("link")) { newGuy = new Link(e);
+ } else if (name.equals("image")) { newGuy = new Image(e);
+
+ } else {
+ System.err.println("warning: unknown tag " + name);
+ skip++;
}
- if (name.equals("ibex-doc")) {
- String title = "You forgot the title, you idiot!";
- String author = "Your Mom";
- String email = null;
- String subtitle = null;
- for(int i=0; i 0) {
- buffer--;
- if (nodeStack.lastElement() instanceof PRE)
- ((PRE)nodeStack.lastElement()).addText("" + e.getLocalName() + ">");
+
+ Node target = (Node)nodeStack.lastElement();
+ if (target == null) target = (Node)victim;
+ if (preStart != -1) {
+ if (!e.getLocalName().equals("pre")) return;
+ target.addChild(new PRE(preStart, getGlobalOffset()));
+ preStart = -1;
+ } else if (skip > 0) {
+ skip--;
+ return;
} else {
+ if (target != null) {
+ if (pending.length() > 0) target.addText(pending);
+ pending = "";
+ }
+ if (nodeStack.lastElement() instanceof Section) victim = nodeStack.lastElement();
nodeStack.setSize(nodeStack.size() - 1);
}
}
+
public void characters(char[] ch, int start, int length) throws Exn, IOException {
- Node n = ((Node)nodeStack.lastElement());
- if (n != null) n.addText(new String(ch, start, length));
- }
-
- boolean intt = false;
- class Node {
- Vec children = new Vec();
- final Node parent;
- public Node() { this((Node)nodeStack.lastElement()); }
- public Node(Node parent) { this.parent = parent; if (parent != null) parent.add(this); }
- public void add(Node child) { children.addElement(child); }
- public void addText(String s) { children.addElement(s); }
- void printText(PrintStream p, String mt2) { p.print(fix(mt2)); }
- String fix(String mt2) {
- mt2 = mt2.replaceAll("\\\\", "\\backslash ");
- mt2 = mt2.replaceAll("LaTeX", "\\LaTeX");
- mt2 = mt2.replaceAll("\\$", "\\\\\\$ ");
- mt2 = mt2.replaceAll("\\%", "\\\\% ");
- mt2 = mt2.replaceAll("#", "\\\\# ");
- mt2 = mt2.replaceAll("\\{", "\\\\{ ");
- mt2 = mt2.replaceAll("\\}", "\\\\} ");
- mt2 = mt2.replaceAll("\\&", "\\\\& ");
- mt2 = mt2.replaceAll("\\~", "\\\\~ ");
- mt2 = mt2.replaceAll("_", "\\\\_");
- if (!intt) {
- mt2 = mt2.replaceAll("\" ", "'' ");
- mt2 = mt2.replaceAll("\"\n", "''\n");
- }
- mt2 = mt2.replaceAll(" \"", " ``");
- mt2 = mt2.replaceAll("\"", "``");
- return mt2;
- }
- public void dumpLatex(PrintStream p) {
- for(int i=0; i is 6 chars long...
+ if (Character.isWhitespace(buffer[end])) {
+ while(Character.isWhitespace(buffer[end])) end--;
+ end++;
+ }
+ mytext = new String(buffer, start, end - start);
+ gobble = 9999;
+ int i = 0;
+ while(true) {
+ int start2 = i;
+ while(i 13 && name.trim().indexOf(' ') == -1) {
+ sb.append("\n\n{\\color{CodeBorder}\\hspace{-2cm}\\dotfill\\\\\\color{black}}");
+ sb.append("\\marginpar{\\raggedleft{\\texttt{\\textbf{\\footnotesize{"+fname+"}}}}\\\\"+type+" }");
+ sb.append("\\\\");
+ sb.append(s);
+ } else {
+ sb.append("\n\n{\\color{CodeBorder}\\hspace{-2cm}\\dotfill\\\\\\color{black}}");
+ sb.append(s.substring(0, s.indexOf(' ')));
+ sb.append("\\marginpar{\\raggedleft{\\texttt{\\textbf{\\footnotesize{"+fname+"}}}}\\\\"+type+" }");
+ sb.append(s.substring(s.indexOf(' ')));
+ }
+ if (default_ != null) {
+ String fd = fixLatex(default_);
+ fd = fd.replaceAll(" ``", " \"");
+ fd = fd.replaceAll("''", "\"");
+ sb.append("\\\\{\\it default: }{\\texttt{" + fd + "}}\n\n");
+ } else {
+ sb.append("\n\n");
+ }
+ }
+ }
+
+ class Definition extends ParagraphNode {
+ String name = "";
+ public Definition(XML.Element e) { name = e.getAttrVal("term"); }
+ public void dumpLatex(StringBuffer sb) {
+ StringBuffer sb2 = new StringBuffer();
+ super.dumpLatex(sb2);
+ String s = sb2.toString();
+ while(Character.isSpace(s.charAt(0))) s = s.substring(1);
+ sb.append(s.substring(0, s.indexOf(' ')));
+ sb.append("\\marginpar{\\raggedleft{\\textbf{"+fixLatex(name)+"}}}");
+ sb.append(s.substring(s.indexOf(' ')));
+ }
+ }
+
+ class Math extends ParagraphNode {
+ String tex = "";
+ public Math(XML.Element e) { tex = e.getAttrVal("tex"); if (tex == null) tex = ""; }
+ public void addText(String s) { tex += s; }
+ public void dumpLatex(StringBuffer sb) { sb.append("\n\n$$\n" + tex.replaceAll("\n", " ") + "\n$$\n\n"); }
+ }
- class Section extends Node {
- String secname;
- boolean appendix = false;
- public Section(String secname, boolean appendix) { this.secname = secname; this.appendix = appendix;}
- public void dumpLatex(PrintStream p) {
+ class Section extends ParagraphNode {
+ String name;
+ public Section(XML.Element e) {
+ name = e.getAttrVal("title");
+ if (slides) super.addChild(new List());
+ }
+ public void addText(String s) {
+ if (slides) ((List)children.elementAt(0)).addText(s);
+ else super.addText(s);
+ }
+ public void addChild(Node n) {
+ /* if (slides) ((List)children.elementAt(0)).addChild(n);
+ else*/ super.addChild(n);
+ }
+ public void dumpLatex(StringBuffer sb) {
String secs = "";
- for(Node n = parent; n != null; n = n.parent) if (n instanceof Section) secs += "sub";
- if (appendix) {
- p.println("\n\n\\appendix{"+secname+"}\n");
+ String base = "section";
+ int count = 0;
+ String pile = "";
+ for(Node n = parent; n != null; n = n.parent)
+ if (n instanceof Section || n instanceof Appendix) {
+ base = "section";
+ secs += "sub";
+ for (int i=0; i 0) {
- if (!used) acc = acc.replaceAll("^\\s*", "");
- if (children.elementAt(i) instanceof List) acc = acc.replaceAll("\\n\\s*$", "");
- acc = acc.replaceAll("\\n\\s*\\n", "\n\n\\\\item ");
- if (acc.trim().length() > 0) {
- used = true;
- p.print(acc);
- }
- acc = "";
+ if (spawn != null) {
+ spawn.dumpLatex(sb);
+ unusedItem = false;
+ spawn = null;
}
- ((Node)children.elementAt(i)).dumpLatex(p);
+ ((Node)kid).dumpLatex(sb);
+ continue;
+ }
+ if (txt.trim().length() == 0) continue;
+ if (indentation == -1) indentation = indentof(txt);
+ if (indentof(txt) > indentation) {
+ if (spawn == null) spawn = new List();
+ spawn.addText(txt);
+ spawn.addChild(new ParagraphBreak());
+ continue;
}
+ if (spawn != null) {
+ spawn.dumpLatex(sb);
+ unusedItem = false;
+ spawn = null;
+ }
+ if (!unusedItem) { unusedItem = true; sb.append("\n\n\\item\n"); }
+ sb.append(fixLatex(txt));
+ }
+ if (spawn != null) {
+ spawn.dumpLatex(sb);
+ spawn = null;
}
- if (acc.length() > 0) {
- if (!used) acc = acc.replaceAll("^\\s*", "");
- acc = acc.replaceAll("\\n\\s*$", "");
- p.print(acc.replaceAll("\\n\\s*\\n", "\n\n\\\\item "));
- acc = "";
+ if (sb.toString().replaceAll("\\[.+\\]", "").trim().length() > 0) {
+ sb0.append("\n\\begin{itemize}\n");
+ sb0.append(sb.toString());
+ sb0.append("\n\\end{itemize}\n");
}
- p.println("\n\\end{itemize}%\n");
}
}
+ class Root extends ParagraphNode {
+ String title = "You forgot the title, you idiot!";
+ String author = "Your Mom";
+ String email = null;
+ String subtitle = null;
+ public Root(XML.Element e) {
+ root = this;
+ title = e.getAttrVal("title");
+ author = e.getAttrVal("author");
+ email = e.getAttrVal("email");
+ subtitle = e.getAttrVal("subtitle");
+ }
+ public void addText(String s) {
+ if (victim != null) ((Node)victim).addText(s);
+ }
+ public void addChild(Node n) {
+ if (!(n instanceof Section))
+ ((Section)victim).addChild(n);
+ else
+ super.addChild(n);
+ }
+ public void dumpLatex(StringBuffer sb) {
+ if (slides) {
+ sb.append("\\documentclass[letter]{seminar}\n");
+ sb.append("\\usepackage{calc} % Simple computations with LaTeX variables\n");
+ sb.append("\\usepackage[hang]{caption2} % Improved captions\n");
+ sb.append("\\usepackage{fancybox} % To have several backgrounds\n");
+ sb.append(" % (must be loaded before `fancyvrb')\n");
+ sb.append("\\usepackage{fancyhdr} % Headers and footers definitions\n");
+ sb.append("\\usepackage{fancyvrb} % Fancy verbatim environments\n");
+ sb.append("\\usepackage{wrapfig}\n");
+ sb.append("\\usepackage{float}\n");
+ sb.append("\\usepackage{amsmath}\n");
+ sb.append("\\usepackage{amssymb}\n");
+ sb.append("\\usepackage{pdftricks}\n");
+ sb.append("\\begin{psinputs}\n");
+ sb.append(" \\usepackage{pstcol} % PSTricks with the standard color package\n");
+ sb.append(" % (before `graphicx' for the \\scalebox macro)\n");
+ sb.append(" \\usepackage{graphicx} % Standard graphics package\n");
+ sb.append(" \\usepackage{multido} % General loop macro\n");
+ sb.append(" \\usepackage{pifont} % Ding symbols (mainly for lists)\n");
+ sb.append(" \\usepackage{pst-fr3d} % PSTricks 3D framed boxes\n");
+ sb.append(" \\usepackage{pst-grad} % PSTricks gradient mode\n");
+ sb.append(" \\usepackage{pst-node} % PSTricks nodes\n");
+ sb.append(" \\usepackage{pst-slpe} % Improved PSTricks gradients\n");
+ sb.append("\\end{psinputs}\n");
+ sb.append("\\usepackage{color}\n");
+ sb.append("\\definecolor{CodeBorder}{rgb}{0.6,0.6,0.6}\n");
+ sb.append("\\definecolor{CodeBackground}{rgb}{0.93,0.93,0.93}\n");
+ sb.append("\\usepackage{graphicx}\n");
+ sb.append("\\usepackage{courier}\n");
+ sb.append("\\usepackage{fancyvrb}\n");
+ sb.append("\\usepackage{float}\n");
+ sb.append("\\usepackage{fvrb-ex}\n");
+ sb.append("\\usepackage{bold-extra}\n");
+ sb.append("\\usepackage{ulem}\n");
+ sb.append("\\usepackage{amssymb,amsmath,epsfig,alltt}\n");
+ sb.append("\\usepackage{semcolor} % Seminar colored slides\n");
+ sb.append("\\usepackage{semhelv} % Seminar helvetica fonts\n");
+ sb.append("\\usepackage{semlayer} % Seminar overlays\n");
+ sb.append("\\usepackage{slidesec} % Seminar sections and list of slides\n");
+ sb.append("\\usepackage{url} % Convenient URL typesetting\n");
+ sb.append("\\usepackage[pdftex,letterpaper,pdffitwindow=true,colorlinks=true,pdfpagemode=UseNone,\n");
+ sb.append(" bookmarks=true]{hyperref} % Hyperlinks for PDF versions\n");
+ sb.append("\\usepackage{hcolor}\n");
+ sb.append("\\slidepagestyle{fancy}\n");
+ sb.append("\n");
+ sb.append("\\slidesmag{4} % Set magnification of slide\n");
+ sb.append("\\def\\SeminarPaperWidth{\\paperwidth / 2}\n");
+ sb.append("\\def\\SeminarPaperHeight{\\paperheight / 2}\n");
+ sb.append("\\slideframe{none} % No default frame\n");
+ sb.append("\n");
+ sb.append(" \n");
+ sb.append("\n");
+ sb.append(" % General size parameters\n");
+ sb.append("\\renewcommand{\\slideparindent}{5mm}\n");
+ sb.append("\\raggedslides[0mm]\n");
+ sb.append("% \\renewcommand{\\slidetopmargin}{15.5mm}\n");
+ sb.append("% \\renewcommand{\\slidebottommargin}{13mm}\n");
+ sb.append("% \\renewcommand{\\slideleftmargin}{4mm}\n");
+ sb.append("% \\renewcommand{\\sliderightmargin}{4mm}\n");
+ sb.append(" % To adjust the frame length to the header and footer ones\n");
+ sb.append("% \\autoslidemarginstrue\n");
+ sb.append(" % We suppress the header and footer `fancyhdr' rules\n");
+ sb.append("\\fancyhf{} % Clear all fields\n");
+ sb.append("\\renewcommand{\\headrule}{}\n");
+ sb.append("\\renewcommand{\\footrule}{}\n");
+ sb.append("\n");
+ sb.append("% \\usepackage{nohyperref} % To deactivate the `hyperref' features\n");
+ sb.append("% \\overlaysfalse % To suppress overlays\n");
+ sb.append("% \\def\\special@paper{}% Needed to avoid `hyperref' to collapse with ``dvips''\n");
+ sb.append("\\newslideframe{IMAGE}{%\n");
+ sb.append(" \\boxput{\\rput(0,0){%\n");
+ sb.append(" \\includegraphics[width=\\SeminarPaperHeight,height=\\SeminarPaperWidth]{background.pdf}}}{#1}}\n");
+ sb.append("\\slideframe*{IMAGE}\n");
+ sb.append("%\\renewcommand{\\slideleftmargin}{3cm}\n");
+ sb.append("%\\addtolength{\\slidewidth}{-\\slideleftmargin}\n");
+ sb.append("\\RequirePackage[T1]{fontenc}\n");
+ sb.append("\\RequirePackage{textcomp}\n");
+ sb.append("\\renewcommand{\\rmdefault}{trebuchet}\n");
+ sb.append("\\renewcommand{\\slidefonts}{%\n");
+ sb.append(" \\renewcommand{\\rmdefault}{trebuchet}%\n");
+ sb.append(" \\renewcommand{\\ttdefault}{courier}}%\n");
+ sb.append(" \\newcommand{\\ParagraphTitle}[2][black]{%\n");
+ sb.append(" \\noindent\\psshadowbox[fillstyle=solid,fillcolor=#1]{\\large{#2}}}\n");
+ sb.append(" \\newcommand{\\CenteredParagraphTitle}[2][black]{%\n");
+ sb.append(" \\centerline{\\psshadowbox[fillstyle=solid,fillcolor=#1]{\\large{#2}}}}\n");
+ sb.append(" \\renewcommand{\\makeslideheading}[1]{%\n");
+ sb.append(" \\CenteredParagraphTitle[black]{%\n");
+ sb.append(" \\textcolor{black}{\\huge\\textbf{#1}}}}\n");
+ sb.append(" \\renewcommand{\\makeslidesubheading}[1]{%\n");
+ sb.append(" \\CenteredParagraphTitle{\\Large\\theslidesubsection{} -- #1}}\n");
+ sb.append(" \\renewenvironment{dinglist}[2][black]\n");
+ sb.append(" {\\begin{list}{\\ding{#2}}{}}{\\end{list}}\n");
+ sb.append(" \\newcommand{\\DingListSymbolA}{43}\n");
+ sb.append(" \\newcommand{\\DingListSymbolB}{243}\n");
+ sb.append(" \\newcommand{\\DingListSymbolC}{224}\n");
+ sb.append(" \\newcommand{\\DingListSymbolD}{219}\n");
+ sb.append(" \\newcommand{\\eqbox}[2][0.6]{%\n");
+ sb.append(" \\centerline{\\psshadowbox[fillstyle=solid,fillcolor=gray]{%\n");
+ sb.append(" \\parbox{#1\\hsize}{%\n");
+ sb.append(" \\[\n");
+ sb.append(" \\textcolor{black} {#2}\n");
+ sb.append(" \\]}}}}\n");
+ sb.append("\\begin{document}\n");
+ sb.append("\\begin{slide}\n");
+ sb.append("\\begin{center}\n");
+ sb.append("\\ParagraphTitle{\\bf \\Large "+title+"}\n");
+ sb.append("\\vspace{5mm} \\\n");
+ sb.append("\\textit{\\large "+subtitle+"} \\\\\n");
+ sb.append("\\vspace{5mm} \\\n");
+ sb.append("\\textit{"+author+"} \\\n");
+ sb.append("\\end{center}\n");
+ sb.append("\\end{slide}\n\n");
+ super.dumpLatex(sb);
+ sb.append("\\end{document}");
+ } else {
+ sb.append("\\documentclass{article}\n");
+ sb.append("\\def\\ninept{\\def\\baselinestretch{.95}\\let\\normalsize\\small\\normalsize}\n");
+ sb.append("\\ninept\n");
+ sb.append("\\usepackage{color}\n");
+ sb.append("\\definecolor{CodeBorder}{rgb}{0.6,0.6,0.6}\n");
+ sb.append("\\definecolor{CodeBackground}{rgb}{0.93,0.93,0.93}\n");
+ sb.append("\\usepackage{graphicx}\n");
+ sb.append("\\usepackage{courier}\n");
+ sb.append("\\usepackage{fancyvrb}\n");
+ sb.append("\\usepackage{float}\n");
+ sb.append("\\usepackage{wrapfig}\n");
+ sb.append("\\usepackage{fvrb-ex}\n");
+ sb.append("\\usepackage{bold-extra}\n");
+ sb.append("\\usepackage{ulem}\n");
+ sb.append("\\usepackage{amssymb,amsmath,epsfig,alltt}\n");
+ sb.append("\\sloppy\n");
+ sb.append("\\usepackage{palatino}\n");
+ sb.append("\\usepackage{sectsty}\n");
+ sb.append("\\allsectionsfont{\\sffamily}\n");
+ sb.append("\\sectionfont{\\color{black}\\leftskip=-2cm");
+ sb.append("\\hrulefill\\\\\\sffamily\\bfseries\\raggedleft\\vspace{1cm}}\n");
+ sb.append("\\subsectionfont{\\color{black}\\dotfill\\\\\\sffamily\\raggedright\\hspace{-4cm}}\n");
+ sb.append("\\newdimen\\sectskip\n");
+ sb.append("\\newdimen\\subsectskip\n");
+ sb.append("\\newdimen\\saveskip\n");
+ sb.append("\\saveskip=\\leftskip\n");
+ sb.append("\\sectskip=-2cm\n");
+ sb.append("\\subsectskip=0cm\n");
+ sb.append("\\let\\oldsection\\section\n");
+ sb.append("\\let\\oldsubsection\\subsection\n");
+ sb.append("\\def\\subsection#1{\\leftskip=\\sectskip\\oldsubsection{#1}\\leftskip=0cm}\n");
+ sb.append("\\usepackage{parskip}\n");
+ sb.append("\\usepackage{tabularx}\n");
+ sb.append("\\usepackage{alltt}\n");
+ sb.append("\\usepackage[pdftex,colorlinks=true,urlcolor=blue,linkcolor=blue,bookmarks=true]{hyperref}\n");
+ // FIXME: pdfauthor, pdftitle, pdfsubject, pdfkeywords?
+ sb.append("\n");
+ sb.append("\\begin{document}\n");
+ sb.append("\\reversemarginpar\n");
+ sb.append("\n");
+ sb.append("\\title{\\textbf{\\textsf{\n");
+ sb.append(title);
+ if (subtitle != null) sb.append("\\\\{\\large " + subtitle + "}\n");
+ sb.append("}}}\n");
+ if (author != null) {
+ sb.append("\\author{\n");
+ sb.append(author);
+ if (email != null) sb.append("\\\\{\\tt " + email + "}\n");
+ sb.append("}\n");
+ }
+ sb.append("\n");
+ sb.append("\\maketitle\n");
+ sb.append("\\clearpage\n");
+ sb.append("\\tableofcontents\n");
+ sb.append("\\clearpage\n");
+ sb.append("\\onecolumn\n");
+ super.dumpLatex(sb);
+ sb.append("\\end{document}");
+ }
+ }
+ }
}
+