diff --git a/pom.xml b/pom.xml index aa8e814..5be5d7c 100644 --- a/pom.xml +++ b/pom.xml @@ -21,12 +21,47 @@ + + + scala-tools + http://scala-tools.org/repo-releases + + + renejeschke-releases + http://maven.renejeschke.de + + + com.keypoint png-encoder 1.5 + + + + + + + + com.github.rjeschke + txtmark + 0.7 + + diff --git a/src/main/java/org/stfm/texdoclet/HTMLtoLaTeXBackEnd.java b/src/main/java/org/stfm/texdoclet/HTMLtoLaTeXBackEnd.java index b2fa34d..f0969cd 100755 --- a/src/main/java/org/stfm/texdoclet/HTMLtoLaTeXBackEnd.java +++ b/src/main/java/org/stfm/texdoclet/HTMLtoLaTeXBackEnd.java @@ -13,6 +13,7 @@ import java.io.StringReader; import java.text.NumberFormat; import java.text.ParseException; import java.util.Hashtable; +import java.util.Scanner; import java.util.Stack; import javax.swing.ImageIcon; @@ -21,6 +22,7 @@ import javax.swing.text.html.HTML; import javax.swing.text.html.HTMLEditorKit; import javax.swing.text.html.parser.ParserDelegator; +import com.github.rjeschke.txtmark.Processor; import com.keypoint.PngEncoder; /** @@ -40,6 +42,9 @@ import com.keypoint.PngEncoder; */ public class HTMLtoLaTeXBackEnd extends HTMLEditorKit.ParserCallback { + private static final String MARKDOWN1 = "md"; + private static final String MARKDOWN2 = "markdown"; + private static final String IMAGES_DIR = "texdoclet_images"; /** @@ -47,11 +52,11 @@ public class HTMLtoLaTeXBackEnd extends HTMLEditorKit.ParserCallback { */ StringBuffer ret; - Stack tblstk = new Stack(); + Stack tblstk = new Stack(); TableInfo tblinfo; int verbat = 0; int colIdx = 0; - Hashtable colors = new Hashtable(10); + Hashtable colors = new Hashtable(10); String block = ""; String refurl = null; String doPrintURL = null; @@ -59,6 +64,7 @@ public class HTMLtoLaTeXBackEnd extends HTMLEditorKit.ParserCallback { String refimg = null; boolean notex = false; int imageindex = 0; + boolean inPreMarkdown = false; /** * Constructs a new instance. @@ -78,8 +84,6 @@ public class HTMLtoLaTeXBackEnd extends HTMLEditorKit.ParserCallback { @Override public void handleSimpleTag(HTML.Tag tag, MutableAttributeSet attrSet, int pos) { - String str = null; - int i = 0; if (tag.toString().equalsIgnoreCase("tex")) { if (attrSet.containsAttribute(HTML.Attribute.ENDTAG, "true")) { notex = false; @@ -210,13 +214,16 @@ public class HTMLtoLaTeXBackEnd extends HTMLEditorKit.ParserCallback { @Override public void handleStartTag(HTML.Tag tag, MutableAttributeSet attrSet, int pos) { - String str = null; - int i = 0; if (notex) { return; } else if (tag == HTML.Tag.PRE) { - ret.append(TeXDoclet.TRUETYPE + "\\small\n\\mbox{}\\newline "); - verbat++; + if (attrSet.containsAttribute("format", MARKDOWN1) + || attrSet.containsAttribute("format", MARKDOWN2)) { + inPreMarkdown = true; + } else { + ret.append(TeXDoclet.TRUETYPE + "\\small\n\\mbox{}\\newline "); + verbat++; + } } else if (tag == HTML.Tag.H1) { ret.append("\\chapter*{"); } else if (tag == HTML.Tag.H2) { @@ -261,8 +268,8 @@ public class HTMLtoLaTeXBackEnd extends HTMLEditorKit.ParserCallback { File file = new File(TeXDoclet.packageDir, refurl); if (file.exists()) { if (TeXDoclet.appendencies.contains(file.getPath())) { - refurl = (String) TeXDoclet.appendencies - .get(file.getPath()); + refurl = TeXDoclet.appendencies.get(file + .getPath()); } else { refurl = "appendix" + new Integer( @@ -312,6 +319,8 @@ public class HTMLtoLaTeXBackEnd extends HTMLEditorKit.ParserCallback { ret.append("\\begin{itemize}"); } else if (tag == HTML.Tag.I) { ret.append(TeXDoclet.ITALIC + " "); + } else if (tag == HTML.Tag.EM) { + ret.append(TeXDoclet.ITALIC + " "); } else if (tag == HTML.Tag.TABLE) { tblstk.push(tblinfo); tblinfo = new TableInfo(); @@ -323,7 +332,7 @@ public class HTMLtoLaTeXBackEnd extends HTMLEditorKit.ParserCallback { } else if (tag == HTML.Tag.TR) { tblinfo.startRow(attrSet); } else if (tag == HTML.Tag.FONT) { - String sz = (String) attrSet.getAttribute(HTML.Attribute.SIZE); + // String sz = (String) attrSet.getAttribute(HTML.Attribute.SIZE); String col = (String) attrSet.getAttribute(HTML.Attribute.COLOR); ret.append("{"); if (col != null) { @@ -332,8 +341,7 @@ public class HTMLtoLaTeXBackEnd extends HTMLEditorKit.ParserCallback { } else { if ("abcdefABCDEF0123456789".indexOf(col.charAt(0)) != -1) { Color cc = new Color((int) Long.parseLong(col, 16)); - String name = (String) colors - .get("color" + cc.getRGB()); + String name = colors.get("color" + cc.getRGB()); if (name == null) { ret.append("\\definecolor{color" + colIdx + "}[rgb]{" + (cc.getRed() / 255.0) + "," @@ -358,13 +366,15 @@ public class HTMLtoLaTeXBackEnd extends HTMLEditorKit.ParserCallback { */ @Override public void handleEndTag(HTML.Tag tag, int pos) { - int i = 0; - if (notex) { return; } else if (tag == HTML.Tag.PRE) { - verbat--; - ret.append("}\n"); + if (!inPreMarkdown) { + verbat--; + ret.append("}\n"); + } else { + inPreMarkdown = false; + } } else if (tag == HTML.Tag.H1) { ret.append("}"); } else if (tag == HTML.Tag.H2) { @@ -437,9 +447,11 @@ public class HTMLtoLaTeXBackEnd extends HTMLEditorKit.ParserCallback { ret.append("\n\\end{itemize}\n"); } else if (tag == HTML.Tag.I) { ret.append("}"); + } else if (tag == HTML.Tag.EM) { + ret.append("}"); } else if (tag == HTML.Tag.TABLE) { ret = tblinfo.endTable(); - tblinfo = (TableInfo) tblstk.pop(); + tblinfo = tblstk.pop(); } else if (tag == HTML.Tag.TH) { tblinfo.endCol(); } else if (tag == HTML.Tag.TD) { @@ -457,6 +469,50 @@ public class HTMLtoLaTeXBackEnd extends HTMLEditorKit.ParserCallback { @Override public void handleText(char[] data, int pos) { String str = new String(data); + + if (inPreMarkdown) { + + String html = ""; + + // usually java documentation has a leading space character in each + // line + // that is to remove for markdown processing ! + if (str.startsWith(" ")) { + str = removeLeadingSpaces(str); + } + + // test some Markdown processors here : + + // 1. MarkdownJ + + // MarkdownProcessor m = new MarkdownProcessor(); + // html = m.markdown(str); + + // 2. PegDown + + // PegDownProcessor pp = new PegDownProcessor(); + // html = pp.markdownToHtml(str); + + // 3. MarkdownPapers + + // Markdown md = new Markdown(); + // StringWriter sw = new StringWriter(); + // try { + // md.transform(new StringReader(str), sw); + // } catch (org.tautua.markdownpapers.parser.ParseException e) { + // e.printStackTrace(); + // } + // html = sw.toString(); + + // 4. Txtmark + + html = Processor.process(str); + + String toAppend = HTMLtoLaTeXBackEnd.fixText(html); + ret.append(toAppend); + return; + } + for (int i = 0; i < str.length(); ++i) { int c = str.charAt(i); if (notex) { @@ -621,4 +677,18 @@ public class HTMLtoLaTeXBackEnd extends HTMLEditorKit.ParserCallback { return new String(result); } + private String removeLeadingSpaces(String str) { + StringBuffer sb = new StringBuffer(); + Scanner scanner = new Scanner(str); + while (scanner.hasNextLine()) { + String l = scanner.nextLine(); + if (l.startsWith(" ")) { + sb.append(l.substring(1) + System.getProperty("line.separator")); + } else { + sb.append(l + System.getProperty("line.separator")); + } + } + return sb.toString(); + } + } diff --git a/src/main/java/org/stfm/texdoclet/TeXDoclet.java b/src/main/java/org/stfm/texdoclet/TeXDoclet.java index f206f7d..ed5e087 100755 --- a/src/main/java/org/stfm/texdoclet/TeXDoclet.java +++ b/src/main/java/org/stfm/texdoclet/TeXDoclet.java @@ -90,9 +90,10 @@ import com.sun.javadoc.Type; * src="http://upload.wikimedia.org/wikipedia/commons/9/92/LaTeX_logo.svg"> * * - *

Extra tags

A new tag is defined: <TEX>. This tag - * is useful for passing TeX code directly to the TeX compiler. The following code: + *

Extra tags

<TEX>

A new tag is defined: + * <TEX>. This tag is useful for passing TeX code directly to the TeX + * compiler. The following code: * *
  * 
@@ -111,12 +112,74 @@ import com.sun.javadoc.Type;
  *  The "alternative" text is ignored by the TeXDoclet, but useful if you
  * want to use both the TeXDoclet and a regular HTML based doclet.
  * 
+ * 

<PRE format="markdown">

+ * + * Instead of writing your java documentation in often hard to read HTML code + * you can make use of Markdown syntax. The HTML + * <PRE> tag is used therefore to prevent your IDE from + * automatically reordering your Markdown documentation text. Markdown parsing + * is based on the Pegdown + * implementation. The following code : + * + *
+ * 
+ * <PRE format="markdown">
+ * 
+ * some text some text some text some text some text some text some text 
+ * 
+ * ##### Lists
+ * 
+ * - item1
+ *     1. item11
+ *     2. item12
+ * - item1
+ * 
+ * ##### Text formatting
+ * 
+ * _emphasis_ and __strong__ and some `code` :
+ * 
+ *     code line 1
+ *     code line 2
+ *     
+ * some text some text some text some text some text some text some text
+ * 
+ * <PRE>
+ * 
+ * 
+ * + * will produce the following :
+ *

+ * + *

+ * 
+ * some text some text some text some text some text some text some text 
+ * 
+ * ##### Lists
+ * 
+ * - item1
+ *     1. item11
+ *     2. item12
+ * - item1
+ * 
+ * ##### Text formatting
+ * 
+ * _emphasis_ and __strong__ and some `code` :
+ * 
+ *     code line 1
+ *     code line 2
+ *     
+ * some text some text some text some text some text some text some text
+ * 
+ * 
+ * * @see HTMLtoLaTeXBackEnd * @see #start(RootDoc) start * @author Gregg Wonderly - C2 Technologies Inc. * @author Soeren Caspersen - XO Software. * @author Stefan Marx */ +@SuppressWarnings("restriction") public class TeXDoclet extends Doclet { private static final String OUT_FILENAME_DOCS_TEX = "docs.tex"; @@ -137,8 +200,8 @@ public class TeXDoclet extends Doclet { /** Writer for writing to output file */ public static PrintWriter os = null; static boolean inherited = true; - static Hashtable map2; - static Vector map; + static Hashtable map2; + static Vector map; static ClassFilter clsFilt; static RootDoc theroot; static String docclass = "report"; @@ -162,9 +225,9 @@ public class TeXDoclet extends Doclet { static String packageFile = "docpackage.tex"; static String preambleFile = "docinit.tex"; static File packageDir = null; - static Hashtable appendencies = new Hashtable(); - static Hashtable refs = new Hashtable(); - static Hashtable externalrefs = new Hashtable(); + static Hashtable appendencies = new Hashtable(); + static Hashtable> refs = new Hashtable>(); + static Hashtable> externalrefs = new Hashtable>(); static boolean includeTexOutputInOtherTexFile = false; static String sectionLevelMax = null; @@ -382,7 +445,7 @@ public class TeXDoclet extends Doclet { FileInputStream in = new FileInputStream(args[i][2] + ".map"); ObjectInputStream p = new ObjectInputStream(in); - Hashtable exref = (Hashtable) p.readObject(); + Hashtable exref = (Hashtable) p.readObject(); externalrefs.put(args[i][1], exref); } catch (Exception e) { e.printStackTrace(); @@ -428,8 +491,8 @@ public class TeXDoclet extends Doclet { public static void init() { - map2 = new Hashtable(); - map = new Vector(); + map2 = new Hashtable(); + map = new Vector(); try { os = new PrintWriter(new FileWriter(outfile)); } catch (Exception ex) { @@ -559,8 +622,6 @@ public class TeXDoclet extends Doclet { ClassDoc[] cls = root.classes(); - ExecutableMemberDoc[] mems; - PackageDoc[] specifiedPackages = root.specifiedPackages(); System.out.println("specifiedPackages : " + specifiedPackages.length); for (int i = 0; i < specifiedPackages.length; i++) { @@ -586,7 +647,7 @@ public class TeXDoclet extends Doclet { Package v; PackageDoc pkgDoc = cd.containingPackage(); String pkg = pkgDoc.name(); - if ((v = (Package) map2.get(pkg)) == null) { + if ((v = map2.get(pkg)) == null) { v = new Package(pkg, pkgDoc); map2.put(pkg, v); map.add(v); @@ -595,9 +656,9 @@ public class TeXDoclet extends Doclet { } // Sorting - Enumeration h = map.elements(); + Enumeration h = map.elements(); while (h.hasMoreElements()) { - final Package pkg = (Package) h.nextElement(); + final Package pkg = h.nextElement(); pkg.sort(); } @@ -614,9 +675,9 @@ public class TeXDoclet extends Doclet { // Packages - Enumeration e = map.elements(); + Enumeration e = map.elements(); while (e.hasMoreElements()) { - final Package pkg = (Package) e.nextElement(); + final Package pkg = e.nextElement(); // os.println( "\\newpage" ); @@ -697,10 +758,10 @@ public class TeXDoclet extends Doclet { // i++; // } os.println("\\begin{appendix}"); - Iterator it = appendencies.keySet().iterator(); + Iterator it = appendencies.keySet().iterator(); int i = 0; while (it.hasNext()) { - String sfa = (String) it.next(); + String sfa = it.next(); File f = new File(sfa); String fname = f.getName().replace("_", "\\_"); System.out.println(fname); @@ -888,7 +949,7 @@ public class TeXDoclet extends Doclet { /** * Produces a table-of-contents for classes. */ - static void tocForClasses(String title, Vector v) { + static void tocForClasses(String title, Vector v) { if (v.size() > 0) { os.println("\\vskip .13in"); @@ -896,7 +957,7 @@ public class TeXDoclet extends Doclet { + HTMLtoLaTeXBackEnd.fixText(title) + "}}"); for (int i = 0; i < v.size(); ++i) { - ClassDoc cd = (ClassDoc) v.elementAt(i); + ClassDoc cd = v.elementAt(i); os.print("\\entityintro{" + HTMLtoLaTeXBackEnd.fixText(cd.name()) + "}" + "{" + refName(makeRefKey(cd.qualifiedName())) + "}" + "{"); @@ -925,11 +986,11 @@ public class TeXDoclet extends Doclet { // Classes ClassHierachy classHierachy = new ClassHierachy(); - Enumeration f = map.elements(); + Enumeration f = map.elements(); while (f.hasMoreElements()) { - final Package pkg = (Package) f.nextElement(); + final Package pkg = f.nextElement(); for (int i = 0; i < pkg.classes.size(); i++) { - classHierachy.add((ClassDoc) pkg.classes.get(i)); + classHierachy.add(pkg.classes.get(i)); } } if (classHierachy.root.size() != 0) { @@ -947,9 +1008,9 @@ public class TeXDoclet extends Doclet { InterfaceHierachy interfaceHierachy = new InterfaceHierachy(); f = map.elements(); while (f.hasMoreElements()) { - final Package pkg = (Package) f.nextElement(); + final Package pkg = f.nextElement(); for (int i = 0; i < pkg.interfaces.size(); i++) { - interfaceHierachy.add((ClassDoc) pkg.interfaces.get(i)); + interfaceHierachy.add(pkg.interfaces.get(i)); } } if (interfaceHierachy.root.size() != 0) { @@ -961,9 +1022,9 @@ public class TeXDoclet extends Doclet { ClassHierachy exceptionHierachy = new ClassHierachy(); f = map.elements(); while (f.hasMoreElements()) { - final Package pkg = (Package) f.nextElement(); + final Package pkg = f.nextElement(); for (int i = 0; i < pkg.exceptions.size(); i++) { - exceptionHierachy.add((ClassDoc) pkg.exceptions.get(i)); + exceptionHierachy.add(pkg.exceptions.get(i)); } } if (exceptionHierachy.root.size() != 0) { @@ -975,9 +1036,9 @@ public class TeXDoclet extends Doclet { ClassHierachy errorHierachy = new ClassHierachy(); f = map.elements(); while (f.hasMoreElements()) { - final Package pkg = (Package) f.nextElement(); + final Package pkg = f.nextElement(); for (int i = 0; i < pkg.errors.size(); i++) { - errorHierachy.add((ClassDoc) pkg.errors.get(i)); + errorHierachy.add(pkg.errors.get(i)); } } if (errorHierachy.root.size() != 0) { @@ -997,9 +1058,9 @@ public class TeXDoclet extends Doclet { * @param classes * Vector of the classes to be laid out. */ - static void layoutClasses(String type, Vector classes) { + static void layoutClasses(String type, List classes) { for (int i = 0; i < classes.size(); ++i) { - ClassDoc cd = (ClassDoc) classes.elementAt(i); + ClassDoc cd = classes.get(i); // os.println( // "\\gdef\\classname{"+HTMLtoLaTeXBackEnd.fixText(cd.name())+"}" ); @@ -1207,8 +1268,6 @@ public class TeXDoclet extends Doclet { if (inherited == true) { - boolean yet = false; - if (!cd.isInterface()) { ClassDoc par = cd.superclass(); @@ -1223,7 +1282,7 @@ public class TeXDoclet extends Doclet { } else { - List superclasses = new Vector(); + List superclasses = new Vector(); while (getSuperClass(cd, superclasses) != null) { } @@ -1231,7 +1290,7 @@ public class TeXDoclet extends Doclet { for (int m = superclasses.size() - 1; m >= 0; m--) { - ClassDoc par = (ClassDoc) superclasses.get(m); + ClassDoc par = superclasses.get(m); printInherited(par); @@ -1251,7 +1310,7 @@ public class TeXDoclet extends Doclet { * subsclass, that is not already in the list of superclasses adn adds it to * the list if found */ - static ClassDoc getSuperClass(ClassDoc subclass, List superclasses) { + static ClassDoc getSuperClass(ClassDoc subclass, List superclasses) { ClassDoc[] cls = theroot.classes(); for (int n = 0; n < cls.length; ++n) { ClassDoc cd2 = cls[n]; @@ -1265,16 +1324,16 @@ public class TeXDoclet extends Doclet { return null; } - static List sortSuperclasses(List superclasses) { - List result = new Vector(); + static List sortSuperclasses(List superclasses) { + List result = new Vector(); int count = superclasses.size(); for (int k = 0; k < count; k++) { for (int i = 0; i < superclasses.size(); i++) { - ClassDoc cd = (ClassDoc) superclasses.get(i); + ClassDoc cd = superclasses.get(i); boolean isSubInterface = false; for (int j = 0; j < superclasses.size(); j++) { - ClassDoc cd2 = (ClassDoc) superclasses.get(j); + ClassDoc cd2 = superclasses.get(j); if (cd.subclassOf(cd2) && cd != cd2) { isSubInterface = true; break; @@ -1379,12 +1438,11 @@ public class TeXDoclet extends Doclet { } os.println("\\" + sectionLevels[2] + "{" + title + "}{"); os.println("\\begin{verse}"); - boolean first = true; - List l = Arrays.asList(dmems); + List l = Arrays.asList(dmems); Collections.sort(l); - Iterator itr = l.iterator(); + Iterator itr = l.iterator(); for (int i = 0; itr.hasNext(); ++i) { - ExecutableMemberDoc mem = (ExecutableMemberDoc) itr.next(); + ExecutableMemberDoc mem = itr.next(); if (hyperref) { os.print("\\hyperlink{" + refName(makeRefKey(mem.qualifiedName() @@ -1418,12 +1476,11 @@ public class TeXDoclet extends Doclet { } os.println("\\" + sectionLevels[2] + "{" + title + "}{"); os.println("\\begin{verse}"); - boolean first = true; - List l = Arrays.asList(dmems); + List l = Arrays.asList(dmems); Collections.sort(l); - Iterator itr = l.iterator(); + Iterator itr = l.iterator(); for (int i = 0; itr.hasNext(); ++i) { - FieldDoc mem = (FieldDoc) itr.next(); + FieldDoc mem = itr.next(); if (hyperref) { os.print("\\hyperlink{" + refName(makeRefKey(mem.qualifiedName())) + "}{"); @@ -1452,13 +1509,13 @@ public class TeXDoclet extends Doclet { if (useHr) { os.println("\\rule[1em]{\\hsize}{2pt}\\vskip -2em"); } - List l = Arrays.asList(dmems); + List l = Arrays.asList(dmems); Collections.sort(l); - Iterator itr = l.iterator(); + Iterator itr = l.iterator(); os.println("\\vskip -2em"); os.println("\\begin{itemize}"); for (int i = 0; itr.hasNext(); ++i) { - ExecutableMemberDoc mem = (ExecutableMemberDoc) itr.next(); + ExecutableMemberDoc mem = itr.next(); if (i > 0) { if (useHr) { @@ -1794,14 +1851,14 @@ public class TeXDoclet extends Doclet { if (useHr) { os.println("\\rule[1em]{\\hsize}{2pt}\\vskip -2em"); } - List l = Arrays.asList(dmems); + List l = Arrays.asList(dmems); Collections.sort(l); - Iterator itr = l.iterator(); + Iterator itr = l.iterator(); if (shortInheritance) { for (int i = 0; itr.hasNext(); ++i) { - MemberDoc mem = (MemberDoc) itr.next(); + MemberDoc mem = itr.next(); // print only member names if (i != 0) { @@ -1817,7 +1874,7 @@ public class TeXDoclet extends Doclet { os.println("\\vskip -2em"); os.println("\\begin{itemize}"); for (int i = 0; itr.hasNext(); ++i) { - MemberDoc mem = (MemberDoc) itr.next(); + MemberDoc mem = itr.next(); // Print signature