导出html帮助目录为chm文件

来源:互联网 发布:老凤祥黄金换购的算法 编辑:程序博客网 时间:2024/05/20 21:44

发行的软件许多都带有一组html帮助文件。直接在浏览器查看帮助的时候就会发现,最大的问题就是没有全文搜索功能。也就是说,除非你一开始就知道你想看 内容在哪个网页上,否则你很难找到对应的内容。

 

CHM(Compressed HTML Help)是Microsoft从1998年推出的帮助文件规范,由于后继的开发被中断,可用版本只到1.3,不过主要的打包、压缩、内容目录、索引树、全文搜索功能都已经有了。

 

CHM(Compressed HTML Help)的两进制结构、配置文件内容说明可以参考:

http://www.nongnu.org/chmspec/latest/index.html

由html生成chm文件至少需要 三个配置文件(.hhp、.hhc、.hhk),然后使用 HTML Help Workshop 编译。

 

网上找了几个导出html帮助目录到chm文件的工具,对最后显示的标题不太满意。而且生成的索引是html文件名,基本没用,所以有了自己做一个工具的念头。

 

个人习惯做小工具首先Perl,不喜欢Perl的人 可以看下实现思路,自己也写一把代码。

 

运行系统

Windows。不过其它平台也有chm查看工具。

 

运行环境

Perl Windows下可以安装ActivePerl或Strawberry Perl,都是免费软件。

HTML Help Workshop 一般来说,安装了某个版本的Visual Studio时也会同时在“C:/Program Files”下安装 HTML Help Workshop,如果你发现你的机器没有安装这个软件,google一下,有直接安装的版本。

 

1. 封装为bat文件

因为预期是在windows下使用,封装为bat文件方便右键菜单中调用,非Windows用户可以跳过这部分。

@rem 在bat中解释为隐蔽后面命令与注释命令,在Perl中解释为一个列表赋值(1~4行)。注意不要在第一行前面插入其它Perl代码,如 #!、use struct 的,不然会报错。

第二行调用perl.exe执行真正的操作,“%0 %*”表示脚本文件名与传给脚本的参数。

第三行跑到文件尾。由于bat只在执行时检查语法,这一行到:end所在行之间的内容可以使用不同于bat 的语法(这里是Perl)。

最后的pause是为了能看一下命令行输出,不需要为话可以在前面加rem屏蔽。

 

2. 使用html标题做chm标题树节点的名称

通过HTML::TreeBuilder与HTML::Element提取html文件的title标签内容:

 

第二行说明如果解析文件不是html文件,它返给该子过程的默认标题。

第五行取出title标签文件内容并清除前后缀的空格。

 

3. 关联目录与索引页

html帮助系统的入口一般都是index.html。另外 一些特殊的帮助系统中一些目录与同名的html文件相关联。我们使用这些关联html文件替换目录显示在chm标题树上。

这段代码按照与目录同名的同级目录下的html文件、本目录下的的iindex.html文件查找关联的html文件。

不使用glob与File::Find的原因主要是帮助系统中可以有大量目录与文件,而频繁调用这些查找函数有时产生莫名奇妙的错误。

 

4. 把anchor标签内容加入索引

一个对象或一个小函数包很可能 输出在一个html文件,所以筛选出html的anchor(以"#anchor-name"格式定义)的内容写入索引,可以直接以方法名索引到对应说明。

 

利用HTML::Element的look_down方法可以的过滤出html文件中的anchor。

chm的索引是自动排序的,你不会喜欢看到连在一起一堆标题类似甚至相同的anchor索引,所以我对anchor进行了过滤。

注意这里插入了两次anchor到索引中,这是因为chm索引实际是树结构(常见当作列表使用),一次插入到顶层索引,支持按方法直接查找;一次插入到原始文件的子索引,实现逐级查找。

 

 5. chm标题树不区分目录与节点、忽略大小写、按字母顺序排序。

 这是针对一个帮助系统目录、文件众多的情况设定的。虽然看上去可能有点难看,不过程序做不到自动识别各个目录与网页的逻辑关系,那么按字母顺序就是最容易查找到内容的方案。

 

 6. 自定义chm主窗体

如果需要激活全部的工具栏按钮与导航面板,就需要使用自定义Window了。

在hhp文件[OPTIONS]中插入

在[WINDOWS]区插入:

其中各个参数的意义可以参照: http://www.nongnu.org/chmspec/latest/INI.html#HHP

 

完整源代码如下:

 

 

原创粉丝点击