001 package de.java2html.converter;
002
003 import java.io.BufferedWriter;
004 import java.io.IOException;
005 import java.io.Writer;
006
007 import de.java2html.javasource.TypedSource;
008 import de.java2html.javasource.TypedSourceIterator;
009 import de.java2html.javasource.SourceRun;
010 import de.java2html.javasource.SourceType;
011 import de.java2html.options.JavaSourceConversionOptions;
012 import de.java2html.options.JavaSourceStyleEntry;
013 import de.java2html.options.JavaSourceStyleTable;
014 import de.java2html.util.RGB;
015
016 /**
017 * @author Markus Gebhard
018 */
019 public class JavaSource2RtfConverter extends AbstractJavaSourceConverter {
020
021 public JavaSource2RtfConverter() {
022 super(new ConverterMetaData("rtf", "RTF (Rich Text Format)", "rtf"));
023 }
024
025 private final static int FONT_SIZE = 9;
026 private final static String FONT_NAME = "Courier New";
027
028 @Override
029 public String getDocumentHeader(JavaSourceConversionOptions options, String title) {
030 return "";
031 }
032
033 @Override
034 public String getDocumentFooter(JavaSourceConversionOptions options) {
035 return "";
036 }
037
038 @Override
039 public String getBlockSeparator(JavaSourceConversionOptions options) {
040 return "";
041 }
042
043 @Override
044 public void convert(TypedSource source, JavaSourceConversionOptions options, BufferedWriter writer)
045 throws IOException {
046 writer.write("{\\rtf1\\ansi\\deff0{\\fonttbl{");
047 writer.write("\\f0\\fmodern ");
048 writer.write(FONT_NAME);
049 writer.write(";");
050 writer.write("}");
051 writer.write("}\n");
052
053 writer.write("{\\colortbl");
054 final SourceType[] types = SourceType.getAll();
055 for (int i = 0; i < types.length; ++i) {
056 final JavaSourceStyleEntry style = options.getStyleTable().get(types[i]);
057 writeColor(style.getColor(), writer);
058 }
059 writer.write("}\n");
060
061 writer.write("\\deflang1031\\pard\\plain\\f0");
062 writer.write("\\fs" + FONT_SIZE * 2);
063 writer.write("\\cb" + SourceType.BACKGROUND.getID());
064
065 final int lineCifferCount = String.valueOf(source.getLineCount()).length();
066 final TypedSourceIterator iterator = source.getIterator();
067 int lineNumber = 1;
068 while (iterator.hasNext()) {
069 final SourceRun run = iterator.getNext();
070
071 if (run.isAtStartOfLine()) {
072 if (lineNumber > 1) {
073 writer.newLine();
074 writer.write("\\par ");
075 }
076
077 if (options.isShowLineNumbers()) {
078 writeLineNumber(writer, lineCifferCount, lineNumber, options);
079 }
080 ++lineNumber;
081 }
082 writeText(options, run, writer);
083 }
084
085 writer.write("}");
086 }
087
088 private void writeText(JavaSourceConversionOptions options, SourceRun run, BufferedWriter writer)
089 throws IOException {
090 writeText(options.getStyleTable(), writer, run.getCode(), run.getType());
091 }
092
093 private void writeText(JavaSourceStyleTable styleTable, BufferedWriter writer, String text, SourceType type)
094 throws IOException {
095 final JavaSourceStyleEntry style = styleTable.get(type);
096
097 writer.write("{\\f0");
098 if (style.isBold()) {
099 writer.write("\\b");
100 }
101 if (style.isItalic()) {
102 writer.write("\\i");
103 }
104
105 writer.write("\\cf" + type.getID() + " ");
106
107 for (int i = 0; i < text.length(); ++i) {
108 final char ch = text.charAt(i);
109 if (ch == '\\') {
110 writer.write("\\\\");
111 }
112 else if (ch == '{') {
113 writer.write("\\{");
114 }
115 else if (ch == '}') {
116 writer.write("\\}");
117 }
118 else {
119 writer.write(ch);
120 }
121 }
122
123 writer.write("}");
124 }
125
126 private void writeLineNumber(
127 BufferedWriter writer,
128 int lineCifferCount,
129 int lineNumber,
130 JavaSourceConversionOptions options) throws IOException {
131
132 String text = String.valueOf(lineNumber);
133 int cifferCount = lineCifferCount - text.length();
134 while (cifferCount > 0) {
135 text = '0' + text;
136 --cifferCount;
137 }
138 text = text + " ";
139
140 writeText(options.getStyleTable(), writer, text, SourceType.LINE_NUMBERS);
141 }
142
143 private static void writeColor(RGB color, Writer writer) throws IOException {
144 writer.write("\\red" + color.getRed()); //$NON-NLS-1$
145 writer.write("\\green" + color.getGreen()); //$NON-NLS-1$
146 writer.write("\\blue" + color.getBlue()); //$NON-NLS-1$
147 writer.write(";"); //$NON-NLS-1$
148 }
149 }
|