📄 codesyntaxparser.java
字号:
package org.ehotsoft.yekki.filter.util;
import java.util.Hashtable;
public class CodeSyntaxParser {
private static Hashtable reservedWords = new Hashtable(80);
private boolean inMultiLineComment;
private String backgroundColor;
private String commentStart;
private String commentEnd;
private String stringStart;
private String stringEnd;
private String reservedWordStart;
private String reservedWordEnd;
public CodeSyntaxParser() {
inMultiLineComment = false;
backgroundColor = "#ffffff";
commentStart = "<font color=\"#006600\"><i>";
commentEnd = "</font></i>";
stringStart = "<font color=\"#FF00FF\">";
stringEnd = "</font>";
reservedWordStart = "<font color=\"#000099\"><b>";
reservedWordEnd = "</font></b>";
}
public String getCommentStart() {
return commentStart;
}
public void setCommentStart(String s) {
commentStart = s;
}
public String getCommentEnd() {
return commentEnd;
}
public void setCommentEnd(String s) {
commentEnd = s;
}
public String getStringStart() {
return stringStart;
}
public void setStringStart(String s) {
stringStart = s;
}
public String getStringEnd() {
return stringEnd;
}
public void setStringEnd(String s) {
stringEnd = s;
}
public String getReservedWordStart() {
return reservedWordStart;
}
public void setReservedWordStart(String s) {
reservedWordStart = s;
}
public String getReservedWordEnd() {
return reservedWordEnd;
}
public void setReservedWordEnd(String s) {
reservedWordEnd = s;
}
public String syntaxHighlight(String s) {
return htmlFilter(s);
}
private String htmlFilter(String s) {
if(s == null || s.equals(""))
{
return "";
} else
{
s = replace(s, "&", "&");
s = replace(s, "\\\"", "\"");
s = replace(s, "\\\\", "\\");
s = replace(s, "<", "<");
s = replace(s, ">", ">");
return multiLineCommentFilter(s);
}
}
private String multiLineCommentFilter(String s) {
if(s == null || s.equals(""))
return "";
StringBuffer stringbuffer = new StringBuffer();
int i;
if(inMultiLineComment && (i = s.indexOf("*/")) > -1 && !isInsideString(s, i))
{
inMultiLineComment = false;
stringbuffer.append(s.substring(0, i));
stringbuffer.append("*/").append(commentEnd);
if(s.length() > i + 2)
stringbuffer.append(inlineCommentFilter(s.substring(i + 2)));
return stringbuffer.toString();
}
if(inMultiLineComment)
return s;
if((i = s.indexOf("/*")) > -1 && !isInsideString(s, i))
{
inMultiLineComment = true;
stringbuffer.append(inlineCommentFilter(s.substring(0, i)));
stringbuffer.append(commentStart).append("/*");
stringbuffer.append(multiLineCommentFilter(s.substring(i + 2)));
return stringbuffer.toString();
} else
{
return inlineCommentFilter(s);
}
}
private String inlineCommentFilter(String s) {
if(s == null || s.equals(""))
return "";
StringBuffer stringbuffer = new StringBuffer();
int i;
if((i = s.indexOf("//")) > -1 && !isInsideString(s, i))
{
stringbuffer.append(stringFilter(s.substring(0, i)));
stringbuffer.append(commentStart);
stringbuffer.append(s.substring(i));
stringbuffer.append(commentEnd);
} else
{
stringbuffer.append(stringFilter(s));
}
return stringbuffer.toString();
}
private String stringFilter(String s) {
if(s == null || s.equals(""))
return "";
StringBuffer stringbuffer = new StringBuffer();
if(s.indexOf("\"") <= -1)
return keywordFilter(s);
int i = 0;
byte byte0 = -1;
byte byte1 = -1;
int k;
while((k = s.indexOf("\"")) > -1)
if(byte0 == -1)
{
byte0 = 0;
stringbuffer.append(stringFilter(s.substring(i, k)));
stringbuffer.append(stringStart).append("\"");
s = s.substring(k + 1);
} else
{
byte0 = -1;
int j = k;
stringbuffer.append(s.substring(0, j + 1));
stringbuffer.append(stringEnd);
s = s.substring(j + 1);
}
stringbuffer.append(keywordFilter(s));
return stringbuffer.toString();
}
private String keywordFilter(String s) {
if(s == null || s.equals(""))
return "";
StringBuffer stringbuffer = new StringBuffer();
Hashtable hashtable = new Hashtable();
int i = 0;
boolean flag = false;
StringBuffer stringbuffer1 = new StringBuffer();
while(i < s.length())
{
stringbuffer1.setLength(0);
char c = s.charAt(i);
int j = i;
while(i < s.length() && (c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z'))
{
stringbuffer1.append(c);
if(++i < s.length())
c = s.charAt(i);
}
String s1 = stringbuffer1.toString();
if(reservedWords.containsKey(s1) && !hashtable.containsKey(s1))
{
hashtable.put(s1, s1);
s = replace(s, s1, reservedWordStart + s1 + reservedWordEnd);
i += reservedWordStart.length() + reservedWordEnd.length();
} else
{
i++;
}
}
stringbuffer.append(s);
return stringbuffer.toString();
}
public static final String replace(String s, String s1, String s2) {
int i = 0;
if((i = s.indexOf(s1, i)) >= 0)
{
char ac[] = s.toCharArray();
char ac1[] = s2.toCharArray();
int j = s1.length();
StringBuffer stringbuffer = new StringBuffer(ac.length);
stringbuffer.append(ac, 0, i).append(ac1);
i += j;
int k;
for(k = i; (i = s.indexOf(s1, i)) > 0; k = i)
{
stringbuffer.append(ac, k, i - k).append(ac1);
i += j;
}
stringbuffer.append(ac, k, ac.length - k);
return stringbuffer.toString();
} else
{
return s;
}
}
private boolean isInsideString(String s, int i) {
if(s.indexOf("\"") < 0)
return false;
String s1 = s.substring(0, i);
String s2 = s.substring(i);
int k = 0;
int l = 0;
int j;
while((j = s1.indexOf("\"")) > -1)
{
k++;
s1 = s1.substring(j + 1);
}
while((j = s2.indexOf("\"")) > -1)
{
l++;
s2 = s2.substring(j + 1);
}
return l % 2 != 0 && k % 2 != 0;
}
private static void loadKeywords() {
reservedWords.put("abstract", "abstract");
reservedWords.put("boolean", "boolean");
reservedWords.put("break", "break");
reservedWords.put("byte", "byte");
reservedWords.put("case", "case");
reservedWords.put("catch", "catch");
reservedWords.put("char", "char");
reservedWords.put("class", "class");
reservedWords.put("const", "const");
reservedWords.put("continue", "continue");
reservedWords.put("default", "default");
reservedWords.put("do", "do");
reservedWords.put("double", "double");
reservedWords.put("else", "else");
reservedWords.put("extends", "extends");
reservedWords.put("final", "final");
reservedWords.put("finally", "finally");
reservedWords.put("float", "float");
reservedWords.put("for", "for");
reservedWords.put("goto", "goto");
reservedWords.put("if", "if");
reservedWords.put("implements", "implements");
reservedWords.put("import", "import");
reservedWords.put("instanceof", "instanceof");
reservedWords.put("int", "int");
reservedWords.put("interface", "interface");
reservedWords.put("long", "long");
reservedWords.put("native", "native");
reservedWords.put("new", "new");
reservedWords.put("package", "package");
reservedWords.put("private", "private");
reservedWords.put("protected", "protected");
reservedWords.put("public", "public");
reservedWords.put("return", "return");
reservedWords.put("short", "short");
reservedWords.put("static", "static");
reservedWords.put("strictfp", "strictfp");
reservedWords.put("super", "super");
reservedWords.put("switch", "switch");
reservedWords.put("synchronized", "synchronized");
reservedWords.put("this", "this");
reservedWords.put("throw", "throw");
reservedWords.put("throws", "throws");
reservedWords.put("transient", "transient");
reservedWords.put("try", "try");
reservedWords.put("void", "void");
reservedWords.put("volatile", "volatile");
reservedWords.put("while", "while");
}
static {
loadKeywords();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -