KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > de > java2html > converter > JavaSource2TeXConverter


1 package de.java2html.converter;
2
3 import java.io.BufferedWriter JavaDoc;
4 import java.io.IOException JavaDoc;
5 import java.io.StringWriter JavaDoc;
6
7 import de.java2html.Version;
8 import de.java2html.javasource.JavaSource;
9 import de.java2html.javasource.JavaSourceIterator;
10 import de.java2html.javasource.JavaSourceParser;
11 import de.java2html.javasource.JavaSourceRun;
12 import de.java2html.javasource.JavaSourceType;
13 import de.java2html.options.JavaSourceConversionOptions;
14 import de.java2html.options.JavaSourceStyleTable;
15 import de.java2html.util.RGB;
16
17 /**
18  * Algorithm and stuff for converting a
19  * {@link de.java2html.javasource.JavaSource} object to to a TeX string
20  * representation (experimental!).
21  *
22  * For questions, suggestions, bug-reports, enhancement-requests etc. I may be
23  * contacted at: <a HREF="mailto:markus@jave.de">markus@jave.de</a>
24  *
25  * The Java2html home page is located at: <a HREF="http://www.java2html.de">
26  * http://www.java2html.de</a>
27  *
28  * @author <a HREF="mailto:markus@jave.de">Markus Gebhard</a>
29  * @version 2.0, 05/07/02
30  *
31  * Copyright (C) Markus Gebhard 2000-2002
32  *
33  * This program is free software; you can redistribute it and/or modify it
34  * under the terms of the GNU General Public License as published by the Free
35  * Software Foundation; either version 2 of the License, or (at your option)
36  * any later version.
37  *
38  * This program is distributed in the hope that it will be useful, but WITHOUT
39  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
40  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
41  * more details.
42  *
43  * You should have received a copy of the GNU General Public License along with
44  * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
45  * Place - Suite 330, Boston, MA 02111-1307, USA.
46  */

47 public class JavaSource2TeXConverter extends AbstractJavaSourceConverter {
48   private static String JavaDoc[] texFormats;
49   static {
50     JavaSourceType[] allTypes = JavaSourceType.getAll();
51     texFormats = new String JavaDoc[allTypes.length];
52     for (int i = 0; i < allTypes.length; ++i) {
53       texFormats[i] = "\\jttstyle" + (char) ('a' + i) + " ";
54     }
55   }
56
57   private String JavaDoc createFormatDefinition(JavaSourceStyleTable styleTable) {
58     StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
59     sb.append("%Java2TeX style definitions\n");
60     sb.append("%You can modify them to fit your needs\n");
61
62     JavaSourceType[] allTypes = JavaSourceType.getAll();
63     for (int i = 0; i < allTypes.length; ++i) {
64       sb.append("\\newcommand{\\jttstyle");
65       sb.append((char) ('a' + i));
66       sb.append("}{\\color[rgb]{");
67
68       RGB color = styleTable.get(allTypes[i]).getColor();
69       float[] cs = new float[]{ color.getRed() / 255.0f, color.getGreen() / 255.0f, color.getBlue() / 255.0f, };
70       sb.append(floatToCharArray(cs[0]));
71       sb.append(',');
72       sb.append(floatToCharArray(cs[1]));
73       sb.append(',');
74       sb.append(floatToCharArray(cs[2]));
75
76       sb.append("}} %");
77       sb.append(allTypes[i].getName());
78       sb.append('\n');
79
80     }
81     sb.append('\n');
82     return sb.toString();
83   }
84
85   /** Document header */
86   protected final static String JavaDoc DOCUMENT_HEADER = "\\documentclass[11pt,a4paper]{article}\n"
87       + "\n"
88       + "\\usepackage{color}\n"
89       + "\n"
90       + "\\begin{document}\n"
91       + "\n";
92
93   /** Document header */
94   protected final static String JavaDoc DOCUMENT_FOOTER = "\\end{document}";
95
96   /** Block seperator for between two blocks of converted source code */
97   protected final static String JavaDoc DOCUMENT_BLOCK_SEPARATOR = "\n\n";
98
99   protected final static String JavaDoc BLOCK_HEADER = "%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n"
100       + "% Java Sourcecode to TeX automatically converted code\n"
101       + "% "
102       + Version.getJava2HtmlConverterTitle()
103       + " "
104       + Version.getBuildDate()
105       + "by Markus Gebhard markus@jave.de\n"
106       + "% Further information: http://www.java2html.de\n";
107
108   public JavaSource2TeXConverter() {
109     super(new ConverterMetaData("tex", "TeX", "tex"));
110   }
111
112   protected final static char[] floatToCharArray(float f) {
113     if (f >= 1.0) {
114       return new char[]{ '1', '.', '0', '0' };
115     }
116
117     return new char[]{ '.', (char) ('0' + f * 10), (char) ('0' + f * 100 % 10), (char) ('0' + f * 1000 % 10) };
118   }
119
120   public String JavaDoc getDocumentHeader(JavaSourceConversionOptions options, String JavaDoc title) {
121     return DOCUMENT_HEADER + createFormatDefinition(options.getStyleTable());
122   }
123
124   public String JavaDoc getDocumentFooter(JavaSourceConversionOptions options) {
125     return DOCUMENT_FOOTER;
126   }
127
128   public String JavaDoc getBlockSeparator(JavaSourceConversionOptions options) {
129     return DOCUMENT_BLOCK_SEPARATOR;
130   }
131
132   /**
133    * Converts the parsed source code to HTML by adding color information,
134    * adding line breaks and replacing characters as needed for HTML. Also adds
135    * a table with line numbers etc.
136    */

137   public void convert(JavaSource source, JavaSourceConversionOptions options, BufferedWriter JavaDoc writer)
138       throws IOException JavaDoc {
139     if (source == null) {
140       throw new IllegalStateException JavaDoc("Trying to write out converted code without having source set.");
141     }
142
143     writer.write(BLOCK_HEADER);
144
145     //1) Header with filename if available
146
if (options.isShowFileName() && source.getFileName() != null) {
147       //TODO: Pretty print file name
148
}
149
150     writer.write("{");
151     writer.newLine();
152     writer.write("\\noindent \\ttfamily");
153     writer.newLine();
154
155     int lineCount = source.getLineCount();
156     int lineNumber = 1;
157     JavaSourceIterator iterator = source.getIterator();
158     while (iterator.hasNext()) {
159       JavaSourceRun run = iterator.getNext();
160       if (run.isAtStartOfLine() && options.isShowLineNumbers()) {
161         writeLineNumber(writer, lineNumber++, lineCount);
162       }
163       toTeX(run, writer);
164       if (run.isAtEndOfLine()) {
165         writer.write("\\\\");
166         writer.newLine();
167       }
168     }
169
170     writer.newLine();
171     writer.write("}");
172     writer.newLine();
173   }
174
175   public void writeLineNumber(BufferedWriter JavaDoc writer, int lineNumber, int lineCount) throws IOException JavaDoc {
176     writer.write(texFormats[JavaSourceType.LINE_NUMBERS.getID()]);
177     writer.write(leftSpace(lineNumber, lineCount));
178     writer.write(String.valueOf(lineNumber));
179     writer.write('~');
180   }
181
182   protected void toTeX(JavaSourceRun run, BufferedWriter JavaDoc writer) throws IOException JavaDoc {
183     writer.write(texFormats[run.getType().getID()]);
184
185     //Replace white space by non-breaking space and line breaks by \\
186
//Also enclose special characters in \\verb# #
187
String JavaDoc text = run.getCode();
188     for (int i = 0; i < text.length(); ++i) {
189       char ch = text.charAt(i);
190       if (ch == ' ')
191         writer.write('~');
192       else if (ch == '_'
193           || ch == '\\'
194           || ch == '^'
195           || ch == '~'
196           || ch == '\"'
197           || ch == '|'
198           || ch == '<'
199           || ch == '>'
200           || ch == '*')
201         writer.write("\\verb#" + ch + "#");
202       else if (ch == '{' || ch == '}' || ch == '_' || ch == '&' || ch == '%' || ch == '$' || ch == '#') {
203         writer.write("\\" + ch);
204       }
205       else {
206         writer.write(ch);
207       }
208     }
209   }
210
211   protected final static String JavaDoc[] WHITESPACES = { "", "~", "~~", "~~~", "~~~~", };
212
213   protected final static String JavaDoc whiteSpace(int size) {
214     if (size < WHITESPACES.length)
215       return WHITESPACES[size];
216
217     char[] result = new char[size];
218     while (size > 0)
219       result[--size] = '~';
220
221     return new String JavaDoc(result);
222   }
223
224   protected final static String JavaDoc leftSpace(int num, int max) {
225     int count = (int) (Math.log(max) / Math.log(10)) - (int) (Math.log(num) / Math.log(10));
226
227     return whiteSpace(count);
228   }
229
230   //TODO Sep 13, 2004 (Markus Gebhard): Convert this into JDemo demos
231
public static void main(String JavaDoc args[]) throws IOException JavaDoc {
232     long time0 = System.currentTimeMillis();
233     JavaSource source = (new JavaSourceParser()).parse(new java.io.File JavaDoc("JavaSourceParser.java"));
234
235     long time1 = System.currentTimeMillis();
236     JavaSource2TeXConverter conn1 = new JavaSource2TeXConverter();
237     conn1.convert(source, JavaSourceConversionOptions.getDefault(), new StringWriter JavaDoc());
238     long time2 = System.currentTimeMillis();
239     JavaSource2HTMLConverter conn2 = new JavaSource2HTMLConverter();
240     conn2.convert(source, JavaSourceConversionOptions.getDefault(), new StringWriter JavaDoc());
241     long time3 = System.currentTimeMillis();
242
243     System.out.println("Parse: " + (time1 - time0) + "ms");
244     System.out.println("toTeX: " + (time2 - time1) + "ms");
245     System.out.println("toHTML: " + (time3 - time2) + "ms");
246   }
247 }
Popular Tags