将java代码生成html并且高亮显示

80酷酷网    80kuku.com

  高亮显示|生成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("
");
            out.append("\n");
        } else
        {
            out.append("
");
            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("/");
                                firstOfComment=false;
                            }
                            prFlow(";");
                            backslash=false;
                            break;
                        }
                        if(String.valueOf((char)st.ttype).equals(","))
                        {
                            if(firstOfComment)
                            {
                                prOperator("/");
                                firstOfComment=false;
                            }
                            prFlow(",");
                            backslash=false;
                            break;
                        }
                        if(String.valueOf((char)st.ttype).equals("."))
                        {
                            if(firstOfComment)
                            {
                                prOperator("/");
                                firstOfComment=false;
                            }
                            prFlow(".");
                            backslash=false;
                            break;
                        }
                        if(String.valueOf((char)st.ttype).equals(")"))
                        {
                            if(firstOfComment)
                            {
                                prOperator("/");
                                firstOfComment=false;
                            }
                            prFlow(")");
                            backslash=false;
                            break;
                        }
                        if(String.valueOf((char)st.ttype).equals("("))
                        {
                            if(firstOfComment)
                            {
                                prOperator("/");
                                firstOfComment=false;
                            }
                            prFlow("(");
                            backslash=false;
                            break;
                        }
                        if(String.valueOf((char)st.ttype).equals("]"))
                        {
                            if(firstOfComment)
                            {
                                prOperator("/");
                                firstOfComment=false;
                            }
                            prFlow("]");
                            backslash=false;
                            break;
                        }
                        if(String.valueOf((char)st.ttype).equals("["))
                        {
                            if(firstOfComment)
                            {
                                prOperator("/");
                                firstOfComment=false;
                            }
                            prFlow("[");
                            backslash=false;
                            break;
                        }
                        if(String.valueOf((char)st.ttype).equals("{"))
                        {
                            if(firstOfComment)
                            {
                                prOperator("/");
                                firstOfComment=false;
                            }
                            tabIncrease(true);
                            prFlow("{");
                            backslash=false;
                            break;
                        }
                        if(String.valueOf((char)st.ttype).equals("}"))
                        {
                            if(firstOfComment)
                            {
                                prOperator("/");
                                firstOfComment=false;
                            }
                            tabIncrease(false);
                            if (out.substring(out.length()-24).equals("    "))
                            {
                                out.delete(out.length()-24,out.length());
                            }
                            prFlow("}");
                            backslash=false;
                            break;
                        }
                        prNormal(String.valueOf((char)st.ttype));
                        backslash=false;
                        break;
                    }
                }
                prBody(END);
                prHtml(END);
            } catch (FileNotFoundException e)
            {
                System.out.println("Could not find the file: " + args[0]);
            } catch (IOException e)
            {
                e.printStackTrace();
            } catch (ArrayIndexOutOfBoundsException e)
            {
                System.out.println("There is no input file");
            }
            if(puthtml.put(htmlFile,out.toString()))
            {
                System.out.println("成功生成"+htmlFile+"文件");
            }
            else
            {
                System.out.println("生成"+htmlFile+"文件失败");
            }

        }
    }
}

class putHtml
{
    boolean put(String fileName , String fileBody)
    {

        boolean returnMessage = false;
        String file = fileName;
        try
        {
            PrintWriter pw = new PrintWriter(new FileOutputStream(file));
            pw.println(fileBody);
            pw.close();
            returnMessage = true ;
        } catch(IOException e)
        {
            returnMessage = false;
        }
        return returnMessage;
    }
}

 



分享到
  • 微信分享
  • 新浪微博
  • QQ好友
  • QQ空间
点击: