package rtf;
import java.io.*;
import java.util.StringTokenizer;
import futils.ReaderUtil;
import futils.WriterUtil;
public class RtfUtil implements JavaText {
public static final String HEADER = "{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1033" +
"{\\fonttbl{\\f0\\fswiss\\fcharset0 Arial;}}" +
"\\viewkind4\\uc1\\pard\\f0\\fs20";
private boolean javaDocComment = false;
private boolean cStyleComment = false;
private boolean cppStyleComment = false;
private int quoteCount = 0;
private BufferedWriter bw = null;
public void javaToRtf(BufferedReader br, BufferedWriter _bw) {
String line = null;
try {
bw = _bw;
write(HEADER);
while ((line = ReaderUtil.readLine(br)) != null) {
processLine(line);
}
write("}");
bw.flush();
ReaderUtil.close(br);
} catch (IOException e) {
e.printStackTrace();
}
}
public void javaToRtf(File javaFile, File rtfFile) {
javaToRtf(ReaderUtil.getBufferedReader(javaFile),
WriterUtil.getBufferedWriter(rtfFile));
}
private void processLine(String line) {
String token = null;
StringTokenizer st = new StringTokenizer(line, " \t\n\r\f", true);
try
{
while (st.hasMoreTokens()) {
token = st.nextToken();
if (token.equals(" ")) {
write(" ");
}
else {
if (token.equals("\t")) {
write(getTab());
} else {
if (token.equals("\n") ||
token.equals("\r") ||
token.equals("\f")) {
write(getPar());
} else {
processToken(token);
}
}
}
}
write(getPar());
cppStyleComment = false;
} catch (Exception e) {
e.printStackTrace();
}
}
private void processToken(String _token) {
boolean reservedWord = false;
String token = null;
String previousToken = null;
String previousPreviousToken = null;
StringTokenizer st = new StringTokenizer(_token, "\";><=&|!(){}[],\\.:", true);
try {
while (st.hasMoreTokens()) {
reservedWord = false;
token = st.nextToken();
checkForStartComment(token);
if (javaDocComment == true) {
write(getItalic(token));
if (checkForEndComment(token) == true) {
javaDocComment = false;
}
} else {
if (cStyleComment == true) {
write(getPlain(token));
if (checkForEndComment(token) == true) {
cStyleComment = false;
}
} else {
if (cppStyleComment == true) {
write(getPlain(token));
} else {
if (checkForStringQuote(previousPreviousToken, previousToken, token) == true) {
quoteCount++;
}
if (quoteCount != 1) {
if (isJavaReservedWord(token) == true) {
reservedWord = true;
write(getBold(token));
}
}
if (reservedWord == false) {
write(getPlain(token));
}
if (quoteCount == 2) {
quoteCount = 0;
}
}
}
}
previousPreviousToken = previousToken;
previousToken = token;
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void checkForStartComment(String token) {
if (quoteCount != 1) {
if (token.indexOf("/**") != -1) {
javaDocComment = true;
} else {
if (token.indexOf("/*") != -1) {
cStyleComment = true;
} else {
if (token.indexOf("//") != -1) {
cppStyleComment = true;
}
}
}
}
}
private boolean checkForEndComment(String token) {
boolean endComment = false;
if (quoteCount != 1) {
if (token.indexOf("*/") != -1) {
endComment = true;
}
}
return endComment;
}
private boolean checkForStringQuote(String previousPreviousToken, String previousToken, String token) {
boolean stringQuote = false;
if (javaDocComment == false &&
cStyleComment == false &&
cppStyleComment == false) {
if (token.indexOf("\"") != -1) {
stringQuote = true;
if (previousToken != null) {
if (previousToken.equals("\\") == true) {
stringQuote = false;
if (previousPreviousToken != null) {
if (previousPreviousToken.equals("\\") == true) {
stringQuote = true;
}
}
}
}
}
}
return stringQuote;
}
private boolean isJavaReservedWord(String token) {
boolean reservedWord = false;
for (int i = 0; i < javaReservedWords.length; i++) {
if (token.compareTo(javaReservedWords[i]) == 0) {
reservedWord = true;
break;
}
}
return reservedWord;
}
private void write(String s) {
try {
bw.write(s, 0, s.length());
} catch (IOException e) {
e.printStackTrace();
}
}
public static String getItalic(String s) {
return "{\\i " + formatCurlyBracesAndBackslashes(s) + "}";
}
public static String getBold(String s) {
return "{\\b " + formatCurlyBracesAndBackslashes(s) + "}";
}
public static String getPlain(String s) {
return "{" + formatCurlyBracesAndBackslashes(s) + "}";
}
public static String getPar() {
return "{\\par}";
}
public static String getTab() {
return "{\\tab}";
}
public static String formatCurlyBracesAndBackslashes(String s) {
String formattedString = "";
char ch;
for (int i = 0; i < s.length(); i++) {
ch = s.charAt(i);
if (ch == '{' || ch == '}' || ch == '\\') {
formattedString = formattedString.concat("\\");
}
formattedString = formattedString.concat(String.valueOf(ch));
}
return formattedString;
}
}