将java代码生成html并且高亮显示
import java.util.*;
import java.io.*;
public class java2html
{
private static boolean comment=false;
private static boolean lineComment=false;
private static boolean START = true;
private static boolean END = false;
private static boolean backslash=false;
private static boolean stringlit = false;
private static boolean stringlit2 = false;
private static int tabWidth = 0;
private static String tab=\" \";
private static Collection varList = new ArrayList();
private static StringBuffer out = new StringBuffer();
private static Collection primitives = new ArrayList();
static
{
String[] primString =
{\"int\",\"Integer\", \"byte\",\"Byte\", \"boolean\",\"Boolean\", \"short\", \"Short\", \"long\", \"Long\", \"char\", \"Character\", \"float\", \"Float\", \"double\", \"Double\", \"String\", \"void\",\"StringBuffer\",\"Collection\"};
for(int i=0; i<primString.length; i++)
primitives.add(primString[i]);
}
private static Collection operators = new ArrayList();
static
{
String[] operString =
{\"=\", \">\", \"<\", \"!\", \"~\", \"?\", \":\", \"==\", \"<=\", \">=\", \"!=\", \"&&\", \"||\", \"++\", \"--\", \"+\", \"-\", \"*\", \"/\", \"&\", \"|\", \"^\", \"%\", \">>\", \"<<\", \">>>\", \"+=\", \"-=\", \"*=\", \"/=\", \"&=\", \"|=\", \"^=\", \"%=\", \"<<=\", \">>=\", \"<<<\"};
for(int i=0; i<operString.length; i++)
operators.add(operString[i]);
}
private static Collection string = new ArrayList();
static
{
String[] stringString =
{\"/\"\"};
for(int i=0; i<stringString.length; i++)
string.add(stringString[i]);
}
private static Collection flow = new ArrayList();
static
{
String[] flowString =
{\"true\" , \"false\" , \"null\" , \"import\"};
for(int i=0; i<flowString.length; i++)
flow.add(flowString[i]);
}
private static Collection resWords = new ArrayList();
static
{
String[] reswString =
{\"private\", \"static\", \"new\", \"public\", \"final\", \"class\", \"this\", \"synchronized\", \"native\", \"package\", \"if\", \"then\", \"else\", \"finally\", \"switch\", \"do\", \"while\", \"case\", \"default\", \"return\", \"break\", \"continue\", \"throw\", \"throws\", \"catch\", \"try\", \"for\",\"protected\"};
for(int i=0; i<reswString.length; i++)
resWords.add(reswString[i]);
}
private static void java2html(String fileName)
{ }
public static void tabIncrease(boolean up)
{
//prComment(START);out.append(\"tabs\");prComment(END);
if(up)
{
tabWidth++;
} else
{
tabWidth--;
}
tab=\" \";
for(int i=tabWidth; i>0; i--)
{
tab = tab+\" \";
}
}
public static void prTitle(String str)
{
out.append(\"<TITLE>\" + str + \"</TITLE>\");
out.append(\"/n\");
}
public static void prPrimitive(String str)
{
if (comment || lineComment)
{
prJComment(str);
} else if (stringlit)
{
prStringLit(str);
} else
{
out.append(\"<b><FONT color=red>\" + str + \"</FONT></b>\");
out.append(\"/n\");
}
}
public static void prVar(String str)
{
if (comment || lineComment)
{
prJComment(str);
} else if (stringlit)
{
prStringLit(str);
} else
{
out.append(\"<FONT color=red>\" + str + \"</FONT>\");
out.append(\"/n\");
}
}
public static void prFlow(String str)
{
if (comment || lineComment)
{
prJComment(str);
} else if (stringlit)
{
prStringLit(str);
} else
{
out.append(\"<b><FONT color=black>\" + str + \"</FONT></b>\");
out.append(\"/n\");
}
}
public static void prResWord(String str)
{
if (comment || lineComment)
{
prJComment(str);
} else if (stringlit)
{
prStringLit(str);
} else
{
out.append(\"<b><FONT color=black>\" + str + \"</FONT></b>\");
out.append(\"/n\");
}
}
public static void prNormal(String str)
{
if (comment || lineComment)
{
prJComment(str);
} else if (stringlit)
{
prStringLit(str);
} else
{
out.append(str);
out.append(\"/n\");
}
}
public static void prJComment(String str)
{
out.append(\"<FONT color=#888888>\" + str + \"</FONT>\");
out.append(\"/n\");
}
public static void prOperator(String str)
{
if (comment || lineComment)
{
prJComment(str);
} else if (stringlit)
{
prStringLit(str);
} else
{
out.append(\"<FONT color=black>\" + str + \"</FONT>/n\");
}
}
public static void prNumber(String str)
{
if (comment || lineComment)
{
prJComment(str);
} else if (stringlit)
{
prStringLit(str);
} else
{
out.append(\"<FONT color=blue>\" + str + \"</FONT>/n\");
}
}
public static void prStringLit(String str)
{
out.append(str +\"/n\");
}
public static void prHead(boolean start)
{
if(start)
{
out.append(\"<HEAD>\");
out.append(\"/n\");
} else
{
out.append(\"</HEAD>\");
out.append(\"/n\");
}
}
public static void prBody(boolean start)
{
if (start)
{
out.append(\"<BODY bgcolor=white color=red>\");
out.append(\"/n\");
out.append(\"<tt><FONT color=red>\");
out.append(\"/n\");
} else
{
out.append(\"</FONT></tt>\");
out.append(\"/n\");
out.append(\"</BODY>\");
out.append(\"/n\");
}
}
public static void prComment(boolean start)
{
if(start)
{
out.append(\"<!--\");
out.append(\"/n\");
} else
{
out.append(\"-->\");
out.append(\"/n\");
}
}
public static void prHtml(boolean start)
{
if(start)
{
out.append(\"<HTML>\");
out.append(\"/n\");
} else
{
out.append(\"</HTML>\");
out.append(\"/n\");
}
}
public static void prBr(boolean start)
{
if(start)
{
out.append(\"<BR>\");
out.append(\"/n\");
} else
{
out.append(\"<BR>\");
out.append(\"/n\");
}
out.append(tab);
}
public static void prP(boolean start)
{
if(start)
{
out.append(\"<P>\");
out.append(\"/n\");
} else
{
out.append(\"</P>\");
out.append(\"/n\");
}
}
public static void prTable(boolean start)
{
if(start)
{
out.append(\"<TABLE>\");
out.append(\"/n\");
} else
{
out.append(\"</TABLE>\");
out.append(\"/n\");
}
}
public static void prTr(boolean start)
{
if(start)
{
out.append(\"<TR>\");
out.append(\"/n\");
} else
{
out.append(\"</TR>\");
out.append(\"/n\");
}
}
public static void prTd(boolean start)
{
if(start)
{
out.append(\"<TD>\");
out.append(\"/n\");
} else
{
out.append(\"</TD>\");
out.append(\"/n\");
}
}
public static void prStringOne(boolean start)
{
if (comment || lineComment)
{
prJComment(\"/\'\");
} else if(start)
{
out.append(\"<FONT color=green>/\'/n\");
stringlit=true;
} else
{
out.append(\"/\'</FONT>/n\");
stringlit=false;
}
}
public static void prStringTwo(boolean start)
{
if (comment || lineComment)
{
prJComment(\"/\"\");
} else if(start)
{
out.append(\"<FONT color=green>/\"/n\");
stringlit=true;
stringlit2=true;
} else
{
out.append(\"/\"</FONT>/n\");
stringlit=false;
stringlit2=false;
}
}
public static void main(String[] args)
{
if (args.length<2)
{
System.out.println(\"/n错误:参数不足!\");
System.out.println(\"java2html [源文件] [将生成文件名]\");
}
else
{
FileInputStream file;
StreamTokenizer st;
String htmlFile = args[1];
boolean isVar=false;
putHtml puthtml = new putHtml();
boolean firstOfComment=false;
int b = 8;
int a = 10 / b;
try
{
file = new FileInputStream(args[0]);
Reader r = new BufferedReader(new InputStreamReader(file));
st = new StreamTokenizer(r);
st.eolIsSignificant(true);
st.ordinaryChar(\'/\"\');
st.ordinaryChar(\'/\');
st.ordinaryChar(\'//\');
st.ordinaryChar(\'.\');
st.ordinaryChar(\'/\'\');
prHtml(START);
prHead(START);
prTitle(args[0]);
prHead(END);
prBody(START);
while(st.nextToken() != StreamTokenizer.TT_EOF)
{
switch(st.ttype)
{
case StreamTokenizer.TT_WORD:
if(firstOfComment)
{
if((!comment && !lineComment)) prOperator(\"/\");
}
firstOfComment=false;
if(primitives.contains(st.sval))
{
prPrimitive(st.sval);
isVar=true;
backslash=false;
break;
}
if(flow.contains(st.sval))
{
isVar=false;
prNumber(st.sval);
backslash=false;
break;
}
if(resWords.contains(st.sval))
{
isVar=false;
prResWord(st.sval);
backslash=false;
break;
}
if(varList.contains(st.sval))
{
isVar=false;
prVar(st.sval);
backslash=false;
break;
}
if(isVar && !(varList.contains(st.sval)))
{
varList.add(st.sval);
prVar(st.sval);
} else
{
prNormal(st.sval);
}
backslash=false;
break;
case StreamTokenizer.TT_EOL:
isVar=false;
if(firstOfComment)
{
prOperator(\"/\");
firstOfComment=false;
}
firstOfComment=false;
lineComment=false;
prBr(START);
backslash=false;
break;
case StreamTokenizer.TT_NUMBER:
isVar=false;
if(firstOfComment)
{
prOperator(\"/\");
firstOfComment=false;
}
firstOfComment=false;
if(String.valueOf((char)st.ttype).equals(\".\"))
{
prFlow(\".\");
backslash=false;
break;
}
prNumber(new Double(st.nval).toString());
backslash=false;
break;
default:
isVar=false;
if(operators.contains(String.valueOf((char)st.ttype)))
{
if (firstOfComment)
{
if (comment)
{
//there has been a star, waiting for slash
if (String.valueOf((char)st.ttype).equals(\"/\"))
{
firstOfComment=false;
prJComment(\"*/\");
comment=false;
backslash=false;
firstOfComment=false;
break;
} else firstOfComment=false;
} else
{
//there has been a slash, waiting for slash or star
if (String.valueOf((char)st.ttype).equals(\"/\"))
{
if (!stringlit)
{
lineComment=true;
prJComment(\"//\");
} else
{
lineComment=false;
prNormal(\"//\");
}
firstOfComment=false;
comment=false;
backslash=false;
break;
} else if (String.valueOf((char)st.ttype).equals(\"*\"))
{
if (!stringlit)
{
comment=true;
prJComment(\"/*\");
} else
{
comment=false;
prNormal(\"/*\");
}
firstOfComment=false;
lineComment=false;
backslash=false;
break;
} else
{
firstOfComment=false;
if (!lineComment) prOperator(\"/\");
prOperator(String.valueOf((char)st.ttype));
backslash=false;
break;
}
}
} else
{
if (comment)
{
//waiting for star
if (String.valueOf((char)st.ttype).equals(\"*\"))
{
firstOfComment=true;
backslash=false;
break;
} else firstOfComment=false;
} else
{
//waiting for slash
if (String.valueOf((char)st.ttype).equals(\"/\"))
{
firstOfComment=true;
backslash=false;
break;
} else
{
firstOfComment=false;
prOperator(String.valueOf((char)st.ttype));
backslash=false;
break;
}
}
}
}
if(String.valueOf((char)st.ttype).equals(\"/\"\"))
{
if(firstOfComment)
{
if (!(comment || lineComment)) prOperator(\"/\");
firstOfComment=false;
}
if (!backslash) prStringTwo(!stringlit);
else prNormal(\"/\"\");
backslash=false;
break;
}
if(String.valueOf((char)st.ttype).equals(\"//\"))
{
if(firstOfComment)
{
prOperator(\"/\");
firstOfComment=false;
}
prNormal(\"//\");
backslash=!backslash;
break;
}
if(String.valueOf((char)st.ttype).equals(\"/\'\"))
{
if(firstOfComment)
{
prOperator(\"/\");
firstOfComment=false;
}
if (!backslash && !stringlit2) prStringOne(!stringlit);
else prNormal(\"/\'\");
backslash=false;
break;
}
if(String.valueOf((char)st.ttype).equals(\";\"))
{
if(firstOfComment)
{
prOperator(\"/\");
&