📄 javatohtml.java
字号:
package org.jr.text;
/**
* <p>Copyright: Copyright (c) 2002-2003</p>
* <p>Company: JavaResearch(http://www.javaresearch.org)</p>
* <p>最后更新日期:2003年3月28日
* @author Cherami
*/
import java.io.*;
import java.util.*;
import org.jr.*;
import org.jr.util.*;
/**
* 将java源代码转换为HTML格式并且可以设置风格的工具类。
* 这个类应该是一个可以反复使用的类,不需生成太多的类实例。
* 用完以后重新设置其他的风格就可以继续使用。
* 一般情况下构造完一个实例后要设置需要的参数,否则虽然对代码进行了处理,但是没有任何效果。
* 当然也可以启用默认模式。
* @since 0.5
*/
public class JavaToHTML {
public static final int NONTYPE = -1;
public static final int WORD = 0;
public static final int QUOTE = 1;
public static final int LINE_COMMENT = 2;
public static final int COMMENT = 3;
protected static final TreeSet defaultReservedWords = TreeSetUtil.
ArrayToTreeSet(StringUtil.split("break,byte,boolean,catch,case,class,char,continue,default,double,do,else,extends,false,final,float,for,finally,if,import,implements,int,interface,instanceof,long,length,native,new,null,package,private,protected,public,final,return,switch,synchronized,short,static,super,try,true,this,throw,throws,threadsafe,transient,void,volatile,while"));
protected static final TreeSet defaultClassNames = ClassUtil.getAllClassname();
protected static final HTMLStyle defaultReservedWordsStyle = new HTMLStyle(
"<b><font color='#0000ff'>",
"</font></b>");
protected static final HTMLStyle defaultCommentStyle = new HTMLStyle(
"<i><font color='#339900'>", "</font></i>");
protected static final HTMLStyle defaultClassNameStyle = new HTMLStyle(
"<font color='#ff0000'>", "</font>");
protected static final HTMLStyle defaultQuoteStyle = new HTMLStyle(
"<font color='#ff33ff'>", "</font>");
protected TreeSet reservedWords;
protected TreeSet classNames;
protected HTMLStyle reservedWordsStyle;
protected HTMLStyle commentStyle;
protected HTMLStyle classNameStyle;
protected HTMLStyle quoteStyle;
protected int currentType = NONTYPE;
protected boolean showLineNumber = true;
private final int HEAD = 0;
private final int LINE = 1;
private final int END = 2;
/**
* 构造一个JavaToHTML。
* @since 0.5
*/
public JavaToHTML() {
reservedWords = new TreeSet();
classNames = new TreeSet();
reservedWordsStyle = new HTMLStyle();
commentStyle = new HTMLStyle();
classNameStyle = new HTMLStyle();
quoteStyle = new HTMLStyle();
}
/**
* 根据指定的参数构造一个JavaToHTML。
* @param useDefault 是否使用缺省设置
* @since 0.5
*/
public JavaToHTML(boolean useDefault) {
if (useDefault == true) {
useDefaultSet();
}
else {
reservedWords = new TreeSet();
classNames = new TreeSet();
reservedWordsStyle = new HTMLStyle();
commentStyle = new HTMLStyle();
classNameStyle = new HTMLStyle();
quoteStyle = new HTMLStyle();
}
}
/**
* 设置使用转换器的缺省设置。
*/
public void useDefaultSet() {
reservedWords = defaultReservedWords;
classNames = defaultClassNames;
reservedWordsStyle = defaultReservedWordsStyle;
commentStyle = defaultCommentStyle;
classNameStyle = defaultClassNameStyle;
quoteStyle = defaultQuoteStyle;
}
/**
* 设置是否显示行号。
* @param lineNumberVisible 是否显示行号,true的时候显示行号
* @since 0.5
*/
public void setLineNumberVisible(boolean lineNumberVisible) {
showLineNumber = lineNumberVisible;
}
/**
* 设置保留字。
* @param reservedWords 保留字
* @since 0.5
*/
public void setReservedWords(TreeSet reservedWords) {
this.reservedWords = reservedWords;
}
/**
* 设置已知类的类名。
* @param classNames 已知类的类名
* @since 0.5
*/
public void setClassNames(TreeSet classNames) {
this.classNames = classNames;
}
/**
* 设置保留字的风格。
* @param reservedWordsStyle 保留字的风格
* @since 0.5
*/
public void setReservedWordsStyle(HTMLStyle reservedWordsStyle) {
this.reservedWordsStyle = reservedWordsStyle;
}
/**
* 设置注释的风格。
* @param commentStyle 注释的风格
* @since 0.5
*/
public void setCommentStyle(HTMLStyle commentStyle) {
this.commentStyle = commentStyle;
}
/**
* 设置已知类名的风格。
* @param classNameStyle 已知类名的风格
* @since 0.5
*/
public void setClassNameStyle(HTMLStyle classNameStyle) {
this.classNameStyle = classNameStyle;
}
/**
* 设置字符串的风格。
* @param quoteStyle 字符串的风格
* @since 0.5
*/
public void setQuoteStyle(HTMLStyle quoteStyle) {
this.quoteStyle = quoteStyle;
}
/**
* 将HTML标签的'<'和'>'转换为对应的转义文本"<"和">"。
* @param source 原始文本
* @return 转换后的结果
* @since 0.5
*/
public static String escapeHTMLtag(String source) {
String result = source.replaceAll("<", "<");
result = result.replaceAll(">", ">");
return result;
}
/**
* 将单词转换为具有风格的结果。
* @param word 原始的单词
* @return 转换后的结果
*/
private String convertWord(String word) {
if (reservedWords.contains(word)) {
return reservedWordsStyle.getBegin() + word + reservedWordsStyle.getEnd();
}
else if (classNames.contains(word)) {
return classNameStyle.getBegin() + word + classNameStyle.getEnd();
}
else {
return word;
}
}
/**
* 将一行内容转换为具有风格的内容。
* @param line 一行文本
* @return 转换后的结果
*/
private String convertLine(String line) {
if (line.length() == 0) {
return "";
}
StringBuffer lineBuffer = new StringBuffer(line.length() * 2);
StringBuffer wordBuffer = new StringBuffer();
int start = 0;
int end = line.length() - 1;
char[] contents = line.toCharArray();
//循环判断一行中的最后一个字符前的字符状况
for (int i = start; i < end; i++) {
//如果没有当前类型
if (currentType == NONTYPE) {
//如果是合法的java字符开始标识符则将类型设置为单词类型并将当前字符添加到单词缓冲区
if (Character.isJavaIdentifierStart(contents[i])) {
currentType = WORD;
wordBuffer.append(contents[i]);
continue;
}
//如果是可能的注释开始
else if (contents[i] == '/') {
char nextChar = contents[i + 1];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -