📄 latexoperatordocgenerator.java
字号:
/*
* YALE - Yet Another Learning Environment
* Copyright (C) 2001-2004
* Simon Fischer, Ralf Klinkenberg, Ingo Mierswa,
* Katharina Morik, Oliver Ritthoff
* Artificial Intelligence Unit
* Computer Science Department
* University of Dortmund
* 44221 Dortmund, Germany
* email: yale-team@lists.sourceforge.net
* web: http://yale.cs.uni-dortmund.de/
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA.
*/
package edu.udo.cs.yale.doc;
import edu.udo.cs.yale.tools.LogService;
import java.util.Stack;
import java.io.PrintWriter;
import java.io.StringReader;
import java.io.IOException;
import java.util.regex.*;
import javax.xml.parsers.*;
import org.xml.sax.helpers.*;
import org.xml.sax.*;
/** Formats operator documentation in LaTeX style.
*
* @yale.todo Lookup class when link is found and decide which tag to use (op, ioobj, ...)
* @version $Id: LatexOperatorDocGenerator.java,v 2.17 2004/08/27 11:57:31 ingomierswa Exp $
*/
public class LatexOperatorDocGenerator extends AbstractOperatorDocGenerator {
public static final String[][] TAGS = {
{ "", "" },
{ "\\operator{", "}" },
{ "\n\\begin{parameters}", "\\end{parameters}" },
{ "", "" },
{ "\\reqpar[", "]" },
{ "\\optpar[", "]" },
{ "", "" },
{ "\\opdescr ", "" },
{ "\\begin{opin} ", "\\end{opin}" },
{ "\\begin{opout} ", "\\end{opout}" },
{ "\\item[", "]" },
{ "\n\\begin{values}", "\\end{values}" },
{ "", "" },
{ "\\val[", "]" },
{ "", "" },
{ "\\index{", "}" },
{ "\\par References: ", "" },
{ "\\cite{", "}" }
};
public String getOpenTag(int tagNo) {
return TAGS[tagNo][0];
}
public String getCloseTag(int tagNo) {
return TAGS[tagNo][1];
}
public String marginIcon(String iconName) {
String epsfig = "\\epsfig{file=graphics/"+iconName+".eps}";
return "\\marginpar[\\flushright"+epsfig+"]{"+epsfig+"}";
}
public String escape(String toEscape) {
String escaped = toEscape.replaceAll("_", "\\\\_");
escaped = escaped.replaceAll("\\$", "\\\\\\$");
escaped = escaped.replaceAll("\u221E", "\\$\\\\infty\\$");
escaped = escaped.replaceAll("ä", "\\\\\"a");
escaped = escaped.replaceAll("ö", "\\\\\"o");
escaped = escaped.replaceAll("ü", "\\\\\"u");
escaped = escaped.replaceAll("Ä", "\\\\\"A");
escaped = escaped.replaceAll("Ö", "\\\\\"O");
escaped = escaped.replaceAll("Ü", "\\\\\"U");
escaped = escaped.replaceAll("ß", "\\\\\"s");
escaped = escaped.replaceAll(" ", "\\\\ ");
escaped = escaped.replaceAll("(\\w)"", "$1''");
escaped = escaped.replaceAll(""", "``");
escaped = escaped.replaceAll("#", "\\\\#");
escaped = escaped.replaceAll("&", "\\\\&");
escaped = escaped.replaceAll("\\[", "\\{\\[\\}");
escaped = escaped.replaceAll("\\]", "\\{\\]\\}");
escaped = escaped.replaceAll("Yale", "\\\\Yale");
return escaped;
}
public void beginGroup(String groupName, PrintWriter out) {
out.println("\\pagebreak[4]");
//out.println("\\section{" + escape(groupName) + "}");
//out.println("\\label{sec:reference_"+groupName.toLowerCase()+"}");
groupName = groupName.replace(' ', '_');
out.println("\\input{OpGroup"+groupName+".tex}");
}
public void endGroup(String groupName, PrintWriter out) {
out.println("\\vfill");
}
public String transformHTMLJavadocComment(String comment, final Class clazz) {
try {
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
comment = "<body>"+comment+"</body>";
final StringBuffer transformed = new StringBuffer();
final Stack closingTagStack = new Stack();
parser.parse(new InputSource(new StringReader(comment)), new DefaultHandler() {
public void characters(char[] ch, int start, int length) throws SAXException {
transformed.append(ch, start, length);
}
public InputSource resolveEntity(String publicId, String systemId) throws SAXException {
LogService.logMessage("Entity: "+publicId, LogService.TASK);
String latex;
if (systemId.equals(""")) {
latex = "``";
} else if (systemId.equals("ä")) {
latex = "\\\"a";
} else if (systemId.equals("ö")) {
latex = "\\\"o";
} else if (systemId.equals("ü")) {
latex = "\\\"u";
} else if (systemId.equals("Ä")) {
latex = "\\\"A";
} else if (systemId.equals("Ö")) {
latex = "\\\"O";
} else if (systemId.equals("Ü")) {
latex = "\\\"U";
} else if (systemId.equals("ß")) {
latex = "\\\"s";
} else if (systemId.equals(" ")) {
latex = "\\ ";
} else {
LogService.logMessage("Unknown entity: "+systemId, LogService.WARNING);
latex = systemId;
}
return new InputSource(new StringReader(latex));
}
public void endElement(String uri, String localName, String qName) {
transformed.append(closingTagStack.pop());
}
public void startElement(String uri,
String localName,
String qName,
Attributes attributes) {
qName = qName.toLowerCase();
if (qName.equals("code")) {
transformed.append("\\java{");
closingTagStack.push("}");
} else if (qName.equals("em")) {
transformed.append("\\emph{");
closingTagStack.push("}");
} else if (qName.equals("var")) {
transformed.append("\\para{");
closingTagStack.push("}");
} else if (qName.equals("b")) {
LogService.logMessage(clazz.getName()+": physical markup used (b,i, or tt).", LogService.WARNING);
transformed.append("\\textbf{");
closingTagStack.push("}");
} else if (qName.equals("i")) {
LogService.logMessage(clazz.getName()+": physical markup used (b,i, or tt).", LogService.WARNING);
transformed.append("\\textit{");
closingTagStack.push("}");
} else if (qName.equals("tt")) {
LogService.logMessage(clazz.getName()+": physical markup used (b,i, or tt).", LogService.WARNING);
transformed.append("\\texttt{");
closingTagStack.push("}");
} else if (qName.equals("center")) {
transformed.append("\n\\begin{center}\n");
closingTagStack.push("\n\\end{center}\n");
} else if (qName.equals("ol")) {
transformed.append("\n\\begin{enumerate}\n");
closingTagStack.push("\n\\end{enumerate}\n");
} else if (qName.equals("ul")) {
transformed.append("\n\\begin{itemize}\n");
closingTagStack.push("\n\\end{itemize}\n");
} else if (qName.equals("li")) {
transformed.append("\n\\item ");
closingTagStack.push("");
} else if (qName.equals("dl")) {
transformed.append("\n\\begin{description}\n");
closingTagStack.push("\n\\end{description}\n");
} else if (qName.equals("dt")) {
transformed.append("\n\\item[");
closingTagStack.push("]");
} else if (qName.equals("dd")) {
// nothing for dd
closingTagStack.push("");
} else if (qName.equals("body")) {
transformed.append("");
closingTagStack.push("");
} else if (qName.equals("sup")) {
transformed.append("$^{");
closingTagStack.push("}$");
} else if (qName.equals("sub")) {
transformed.append("$_{");
closingTagStack.push("}$");
} else if (qName.equals("br")) {
transformed.append("\\par\n");
closingTagStack.push("");
} else if (qName.equals("p")) {
transformed.append("\\par\n");
closingTagStack.push("");
} else if (qName.equals("a")) {
closingTagStack.push("\\footnote{\\url{"+attributes.getValue("href")+"}}");
} else if (qName.equals("h1") || qName.equals("h2") ||
qName.equals("h3") || qName.equals("h4") || qName.equals("h5")) {
transformed.append("\n\\paragraph{");
closingTagStack.push("}");
} else if (qName.equals("pre")) {
transformed.append("\\begin{verbatim}");
closingTagStack.push("\\end{verbatim}");
} else {
transformed.append("");
closingTagStack.push("");
LogService.logMessage("Unknown tag: "+qName +" ("+clazz.getName()+")", LogService.WARNING);
}
}
});
StringBuffer linksReplaced = new StringBuffer();
Pattern pattern = Pattern.compile("\\{@link (.*?)\\}");
Matcher matcher = pattern.matcher(transformed);
while (matcher.find()) {
String classname = matcher.group(1);
int period = classname.lastIndexOf(".");
if (period != -1) classname = classname.substring(period+1);
matcher.appendReplacement(linksReplaced, "\\\\op{"+classname+"}");
}
matcher.appendTail(linksReplaced);
return linksReplaced.toString();
} catch (Throwable e) {
LogService.logMessage(clazz.getName()+": "+e, LogService.ERROR);
return "Cannot parse class comment: "+e;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -