最近手机开发倍受青睐,奔着与时俱进笨鸟先飞的原则 近日鄙人也准备学习android开发,在开始新的旅程之前本人习惯找一份中文的chm文档或是根据官网的api打一个chm文档,但是问题出现了 万恶的google提供的API通过FAR或其他的工具打包chm总是出现问题,于是乎找到jrex开发了一个java版本的CHM工具,工具开发完感觉还是可以没有了脚本错误但是由于google API中那个sidebar和大量脚本的存在加载页面很是消耗内存速度也很慢,无奈之下今晚又抽了点时间将其侧边栏去掉 只保留右侧API部分进行制作chm,速度果然快了很多,明天就准备学习android了 今天将API工具和精简google的API页面共享之,希望对学习android的童鞋们有点用。
最终生成的chm阅读效果如下:
googleapi去掉左边侧边栏写了两个很简单的类,根据自己的doc目录修改main方法就可以将其侧边栏去掉,测试环境 android2.2 没有出现任何异常
/**************** * *Create Class:HtmlTemplete.java *Author:a276202460 *Create at:2010-8-25 */ package com.rich.android.api; public class HtmlTemplete { public static StringBuffer htmlprefix = new StringBuffer("<html>/n"); static{ htmlprefix.append("<head>/n"); htmlprefix.append("<meta http-equiv=/"Content-Type/" content=/"text/html; charset=utf-8/">/n"); htmlprefix.append("<link rel=/"shortcut icon/" type=/"image/x-icon/" href="/" mce_href="/""../../../favicon.ico/" />/n"); } public static StringBuffer htmlmiddle = new StringBuffer("</head>/n"); static{ htmlmiddle.append("<body>/n"); } public static StringBuffer htmlstuff = new StringBuffer("</body>/n</html>"); }
APIUtil.java类粘贴代码总是出错就随便贴下吧
/****************
*
*Create Class:APIUtil.java
*Author:a276202460
*Create at:2010-8-25
*/
package com.rich.android.api;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.regex.Pattern;
public class APIUtil {
public static Pattern contentstartpattern = Pattern.compile(".*id=/"jd//-content/".*");
public static Pattern contentendpattern = Pattern.compile(".*<!--.*jd//-content.*");
public static Pattern titlepattern = Pattern.compile(".*<title>.*</title>.*");
public static final String tempstuff = ".temp";
public static Pattern csslinkpattern = Pattern.compile(".*<link.*type=/"text/css/".*");
public static boolean iscontentstart(String line){
return contentstartpattern.matcher(line).matches();
}
public static boolean iscontentend(String line){
return contentendpattern.matcher(line).matches();
}
public static boolean istitle(String line){
return titlepattern.matcher(line).matches();
}
public static boolean iscssline(String line){
return csslinkpattern.matcher(line).matches();
}
public static boolean ishtmlfile(File file){
String filename = file.getName().toLowerCase();
if(filename.endsWith(".html") || filename.endsWith(".htm")){
return true;
}
return false;
}
public static void formatandroidapi(File apifile) throws Exception{
if(apifile.isDirectory()){
File[] filelist = apifile.listFiles();
for(File f:filelist){
formatandroidapi(f);
}
}else{
if(ishtmlfile(apifile)){
cuthtml(apifile);
}
}
}
public static File createtempfile(File htmlfile) throws IOException{
String basepath = htmlfile.getParent();
String filename = htmlfile.getName();
File tempfile = new File(basepath+"/"+filename+tempstuff);
int i = 0;
while(tempfile.exists()){
tempfile = new File(basepath+"/"+filename+tempstuff+i);
i++;
}
tempfile.createNewFile();
return tempfile;
}
public static void cuthtml(File htmlfile) throws Exception{
BufferedReader reader = null;
PrintWriter writer = null;
File tempfile = null;
String filename = htmlfile.getPath();
String titleline = null;
boolean start = false;
String cssline = null;
try{
reader = new BufferedReader(new InputStreamReader(new FileInputStream(htmlfile)));
String line = null;
while((line = reader.readLine()) != null){
if(titleline == null){
if(istitle(line)){
titleline = line;
}
}
if(cssline == null){
if(iscssline(line)){
cssline = line;
}
}
if(!start){
start = iscontentstart(line);
}else {
if(iscontentend(line)){
if(writer != null){
writer.println(HtmlTemplete.htmlstuff.toString());
}
break;
}else{
if(tempfile == null){
tempfile = createtempfile(htmlfile);
writer = new PrintWriter(new FileOutputStream(tempfile));
writer.println(HtmlTemplete.htmlprefix.toString());
if(cssline != null){
writer.println(cssline);
}
if(titleline != null){
writer.println(titleline);
}
writer.println(HtmlTemplete.htmlmiddle.toString());
}else{
writer.println(line);
}
}
}
}
}finally{
if(reader != null){
reader.close();
}
if(writer != null){
writer.flush();
writer.close();
}
if(htmlfile.delete())
if(tempfile != null){
tempfile.renameTo(new File(filename));
// System.out.println(new File(tempfile.getParent()+"/"+filename));
}
}
}
public static void main(String[] s){
long starttime = System.currentTimeMillis();
//修改file的目录就可以
File apifile = new File("E:/java资料/Android/docs/reference");
try {
APIUtil.formatandroidapi(apifile);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println((System.currentTimeMillis() - starttime) / 1000);
}
}
执行APIUtil类侧边栏和顶部那些没用的东西就去掉了,为了防止出错最好将docs目录备份一个。
去掉侧边栏代码后还要修改css文件让页面出现滚动条
修改docs/assets/android-developer-core.css
去掉开头部分的如下代码:
html,body,div,h1,h2,h3,h4,h5,h6,p,img, dl,dt,dd,ol,ul,li,table,caption,tbody, tfoot,thead,tr,th,td,form,fieldset, embed,object,applet { margin: 0; padding: 0; border: 0; } /* BASICS */ html, body { overflow:hidden; /* keeps scrollbar off IE */ background-color:#fff; }
在浏览下reference(我只是修改了此目录下的html页面)的页面是不是只剩右侧部分了,感觉也不一样了吧。
这个java版的chm制作工具虽然很粗糙很不成熟 但是还是有点好处就是再大的doc目录都可以做 速度也很快。目前只是测试版本好多功能没有做也没有移动doc的html页面到程序目录下 这样只能在本机运行此工具才能找到页面(android学习要紧,这些小功能以后有时间在做)
工具使用jrex作为java内置的浏览器 不了解jrex的google之~,使用lucene为api建立索引。
下载地址:http://download.csdn.net/source/2647245
源代码地址:http://download.csdn.net/source/2647276
代码比较乱也没仔细设计无聊的时候就写几行代码。
使用方法:解压下载后的文件到任何目录 修改chmtool.bat 中的jre的目录 注意是JRE的目录不是jdk的目录 运行即可(JDK1.6 编译 编译级别1.6)
工具 - 打开API目录 选择要制作的doc目录操作图解如下:
打开目录后api目录树生成 然后点击 创建索引 选择索引的保存目录 等待索引创建成功
索引创建成功后就算完成制作了 ---》点击 保存 保存为API后缀的文件
文件对话框中的保存按钮的label没换过来 还是打开 没关系啦将就下 保存完以后再倒入android2.2.API 就算成功了
点击 我的API 切换到浏览界面 右键左侧树中的 我的API 节点 添加API或是添加API分组 (添加API将android2.2.API导入)
我的API中左侧API树支持拖拽和编辑操作 选择对应的API 即可浏览使用