java核心技术上的一道课后习题从控制台输入一个java源文件名,然后生成一个与之对应的html文件,要求打开生成的html文件后,java关键字用蓝色显示,注释用绿色显示,其他语句默认黑色显示。这是Map后面的习题,我的想法是从文件中分离出关键字字符串和一般语句字符串以及注释字符串,然后分别为这三种类型的字符串配对一个Integer类型的值,表示类型(是关键字还是其他),然后将这些字符串和其Integer值构成一个映射存在map中。然后将这些字符串分别以对应的颜色写入html文件,到这里我不会将其以对应的颜色写入啊,求大家帮忙。
java核心技术上的一道课后习题从控制台输入一个java源文件名,然后生成一个与之对应的html文件,要求打开生成的html文件后,java关键字用蓝色显示,注释用绿色显示,其他语句默认黑色显示。这是Map后面的习题,我的想法是从文件中分离出关键字字符串和一般语句字符串以及注释字符串,然后分别为这三种类型的字符串配对一个Integer类型的值,表示类型(是关键字还是其他),然后将这些字符串和其Integer值构成一个映射存在map中。然后将这些字符串分别以对应的颜色写入html文件,到这里我不会将其以对应的颜色写入啊,求大家帮忙。
我倾向用正则表达式或者其他的字符串搜索算法,找到匹配的字符串就替换为相应的HTML代码,然后写入文件。
public class Test { public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(new File("E:/eclipse 3.6.2/workspace/MySQL/src/andycpp/SQLTest.java"));
StringBuilder builder = null;
StringBuilder result = new StringBuilder();
result.append(createHtmlHeader());
String s = null;
while(sc.hasNext()) {
builder = new StringBuilder("<div>");
builder.append(String(sc.nextLine()));
builder.append("</div>");
s = builder.toString();
if(s.matches("<div>\\s*</div>")) {
s = "<br/>";
}
result.append(s+"\n");
}
result.append(createHtmlFooter());
saveToFile("d:/aa.html", result.toString());
}
private static String String(String s) {
StringBuilder sb = new StringBuilder();
Pattern p = Pattern.compile("(\\s+|\\S+)");
Matcher m = p.matcher(s);
String token = null;
while(m.find()) {
token = m.group();
if(Character.isWhitespace(token.charAt(0))) {
sb.append(Space(token));
}else {
sb.append(Keys(token));
}
}
return sb.toString();
}
private static String Space(String token) {
StringBuilder sb = new StringBuilder();
char c;
for(int i=0; i<token.length(); i++) {
c = token.charAt(i);
if(c == ' ') {
sb.append(" ");
}else {
sb.append(" ");
}
}
return sb.toString();
}
private static String Keys(String token) {
String[] keyWords = {"package", "import", "public", "private", "static", "void", "new", "throws", "while", "for", "class"};
HashSet<String> set = new HashSet<String>(Arrays.asList(keyWords));
StringBuilder sb = new StringBuilder();
if(set.contains(token)) {
sb.append("<span class=\"keyword\">");
sb.append(token);
sb.append("</span>");
}else {
sb.append(token);
}
return sb.toString();
} private static String createHtmlHeader() {
StringBuilder sb = new StringBuilder();
sb.append("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n");
sb.append("\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n");
sb.append("<html xmlns=\"http://www.w3.org/1999/xhtml\">\n");
sb.append("<head>\n");
sb.append("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n");
sb.append("<style type=\"text/css\">\n");
sb.append(".keyword {\n");
sb.append(" color:#F00;\n");
sb.append("}\n");
sb.append("div {\n");
sb.append(" font-family:\"Courier New\", Courier, monospace;\n");
sb.append(" font-size:16px;\n");
sb.append("}\n");
sb.append("</style>\n");
sb.append("<title>无标题文档</title>\n");
sb.append("</head>\n");
sb.append("<body>\n");
return sb.toString();
}
private static String createHtmlFooter() {
StringBuilder sb = new StringBuilder();
sb.append("</body>\n");
sb.append("</html>\n");
return sb.toString();
}
private static void saveToFile(String dest, String s) {
try {
OutputStreamWriter w = new OutputStreamWriter(new FileOutputStream(dest), Charset.forName("UTF-8"));
PrintWriter writer = new PrintWriter(w);
writer.print(s);
writer.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}