博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
生成chm文档的方法
阅读量:6813 次
发布时间:2019-06-26

本文共 7614 字,大约阅读时间需要 25 分钟。

一个类和hhc.exe还有hha.dll
用于生成包含html目录的chm项目文件 ,然后通过hhp项目文件和内容文件生成 .chm手册。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
<?php
    
/* 函数 listDirTree( $dirName = null )
    
** 功能 列出目录下所有文件及子目录
    
** 参数 $dirName 目录名称
    
** 返回 目录结构数组 false为失败
    
*/
    
function 
listDir(
$dirName 
= null) {
        
if 
(
empty
(
$dirName
))
            
exit
(
"IBFileSystem: directory is empty."
);
        
if 
(
is_dir
(
$dirName
)) {
            
if 
(
$dh 
= opendir(
$dirName
)) {
                
$tree 
array
();
                
while 
(( 
$file 
= readdir(
$dh
) ) !== false) {
                    
if 
(
$file 
!= 
"." 
&& 
$file 
!= 
".."
) {
                        
$filePath 
$dirName 
. DIRECTORY_SEPARATOR . 
$file
;
                        
if 
(
is_dir
(
$filePath
)) { 
//为目录,递归
                            
$tree2 
=listDir(
$filePath
);
                            
$tree 
$tree2
array_merge
(
$tree
,
$tree2
):
$tree
;
                        
else 
//为文件,添加到当前数组
                            
$tree
[] = 
$filePath
;
                        
}
                    
}
                
}
                
closedir
(
$dh
);
            
else 
{
                
exit
(
"IBFileSystem: can not open directory $dirName."
);
            
}
            
//返回当前的$tree
            
$tree 
array_unique
(
$tree
);
            
natsort(
$tree
);
            
return 
$tree
;
        
else 
{
            
exit
(
"IBFileSystem: $dirName is not a directory."
);
        
}
    
}
    
function 
listDirTree(
$dirName 
= null,
$remove
) {
        
if 
(
empty
(
$dirName
))
            
exit
(
"IBFileSystem: directory is empty."
);
        
if 
(
is_dir
(
$dirName
)) {
            
if 
(
$dh 
= opendir(
$dirName
)) {
                
$tree 
array
();
                
while 
(( 
$file 
= readdir(
$dh
) ) !== false) {
                    
if 
(
$file 
!= 
"." 
&& 
$file 
!= 
".." 
&& 
stripos
(
$remove
$file
) === false) {
                        
$filePath 
$dirName 
. DIRECTORY_SEPARATOR . 
$file
;
                        
if 
(
is_dir
(
$filePath
)) { 
//为目录,递归
                            
$arr 
= listDirTree(
$filePath
,
$remove
);
                            
natsort(
$arr
);
                            
$tree
[
$file
] = 
$arr
;
                        
else 
//为文件,添加到当前数组
                            
$tree
[] = 
$filePath
;
                        
}
                    
}
                
}
                
closedir
(
$dh
);
            
else 
{
                
exit
(
"IBFileSystem: can not open directory $dirName."
);
            
}
                      
            
//返回当前的$tree
            
return 
$tree
;
        
else 
{
            
exit
(
"IBFileSystem: $dirName is not a directory."
);
        
}
    
}
    
function 
cmp(
$a
,
$b
){
        
$a 
= (int)
$a
;
        
$b 
= (int)
$b
;
        
if
(
$a 
== 
$b
)    
return 
0;
        
return 
(
$a
>
$b
)? 1:-1;
    
}
    
class 
chmBuilder{
        
// const version = 0.1;
        
public 
$chm_name
;
        
public 
$chm_path
;
        
public 
$chm_hhp
;
        
public 
$chm_hhc
;
        
public 
$chm_hhk
;
        
public 
$chm_uninclude_dirs
;
        
public 
$chm_uninclude_files
;
        
public 
$chm_image_type
;
        
public 
$chm_first_open
;
        
public 
$chm_title
;
        
public 
function 
__construct(
$chm_name
=
'your_chm'
,
$chm_path
=
''
,
$chm_uninclude_dirs
,
$chm_uninclude_files
){
            
$this
->chm_name = 
$chm_name
;
            
$this
->chm_path = 
$chm_path
;
            
$this
->chm_uninclude_dirs = 
$chm_uninclude_dirs
;
            
$this
->chm_uninclude_files = 
$chm_uninclude_files
;
            
$this
->chm_image_type = 
'Folder'
;
        
}
        
public 
function 
build(){
            
$this
->buildHhp();
            
$this
->buildHhc();
            
$this
->buildHhk();
        
}
        
public 
function 
buildHhp(){
            
$manual_files 
= listDir(
$this
->chm_path);
            
$files 
= implode(PHP_EOL, 
$manual_files
);
            
$this
->chm_first_open = iconv(
'UTF-8'
'GB2312'
$this
->chm_first_open);
            
$this
->chm_title = iconv(
'UTF-8'
'GB2312'
$this
->chm_title);
            
$tpl 
= <<<eof
[OPTIONS]
Compatibility=1.1 
or 
later
Compiled file={
$this
->chm_path}/{
$this
->chm_name}.chm
Contents file={
$this
->chm_hhc}.hhc
COPYRIGHT=www.thinkphp.cn
Display compile progress=No
Default topic={
$this
->chm_first_open}
Error log file=chm_builder.Log
Full-text search=Yes
Index file={
$this
->chm_hhk}.hhk
ImageType={
$this
->chm_image_type}
Language=0x804
Title={
$this
->chm_title}
[FILES]
{
$files
}
eof;
            
file_put_contents
(
"{$this->chm_path}/{$this->chm_hhp}.hhp"
$tpl
);
        
}
        
public 
function 
buildHhc(){
            
$list 
array
();
            
$file_tree 
= listDirTree(
$this
->chm_path,
"{$this->chm_hhp} {$this->chm_uninclude_dirs}{$this->chm_uninclude_files}"
);
            
uksort(
$file_tree
'cmp'
);
            
foreach 
(
$file_tree 
as 
$key 
=> 
$value
) {
                
if
(
is_string
(
$value
)){
                    
$title 
explode
(DIRECTORY_SEPARATOR, 
$value
);
                    
$title 
array_pop
(
$title
);
                    
$title 
= rtrim(
$title
,
'.html'
);
                    
$list
[] = <<<eof
    
<LI><OBJECT type=
"text/sitemap"
>
        
<param name=
"Name" 
value=
"{$title}"
>
        
<param name=
"Local" 
value=
"{$value}"
>
        
</OBJECT>
eof;
                
}
else
{
                    
$child 
array
();
                    
foreach 
(
$value 
as 
$k 
=> 
$val
) {
                        
$title 
explode
(DIRECTORY_SEPARATOR, 
$val
);
                        
$title 
array_pop
(
$title
);
                        
$title 
= rtrim(
$title
,
'.html'
);
                        
$child
[] = <<<eof
        
<LI><OBJECT type=
"text/sitemap"
>
            
<param name=
"Name" 
value=
"{$title}"
>
            
<param name=
"Local" 
value=
"{$val}"
>
            
<param name=
"ImageNumber" 
value=
"9"
>
            
</OBJECT>
eof;
                    
}
                    
$child 
= implode(PHP_EOL, 
$child
);
                    
$list
[] = <<<eof
    
<LI> <OBJECT type=
"text/sitemap"
>
        
<param name=
"Name" 
value=
"{$key}"
>
        
<param name=
"ImageNumber" 
value=
"1"
>
        
</OBJECT>
    
<UL>   
{
$child
}
    
</UL>   
eof;
                
}
            
}
            
$list 
= implode(PHP_EOL, 
$list
);
            
$tpl 
= <<<eof
<!DOCTYPE HTML PUBLIC 
"-//IETF//DTD HTML//EN"
>
<HTML>
<HEAD>
<meta name=
"GENERATOR" 
content=
"yangweijie code-tech.diandian.com"
>
<!-- Sitemap 1.0 -->
</HEAD><BODY>
<OBJECT type=
"text/site properties"
>
    
<param name=
"ExWindow Styles" 
value=
"0x200"
>
    
<param name=
"Window Styles" 
value=
"0x800025"
>
    
<param name=
"Font" 
value=
"MS Sans Serif,10,0"
>
</OBJECT>
<UL>
{
$list
}
</UL>
</BODY></HTML>
eof;
            
file_put_contents
(
"{$this->chm_path}/{$this->chm_hhc}.hhc"
$tpl
);
        
}
        
public 
function 
buildHhk(){
            
$list 
array
();
            
$file_tree 
= listDir(
$this
->chm_path);
            
foreach 
(
$file_tree 
as 
$key 
=> 
$value
) {
                
if
(
is_string
(
$value
)){
                    
if
(
stripos
(
$value
'.html'
)){
                        
$title 
explode
(DIRECTORY_SEPARATOR, 
$value
);
                        
$title 
array_pop
(
$title
);
                        
$title 
= rtrim(
$title
,
'.html'
);
                        
$list
[] = <<<eof
    
<LI><OBJECT type=
"text/sitemap"
>
        
<param name=
"Name" 
value=
"{$title}"
>
        
<param name=
"Local" 
value=
"{$value}"
>
        
</OBJECT>
eof;
                    
}
                
}
            
}
            
$list 
= implode(PHP_EOL, 
$list
);
            
$tpl 
= <<<eof
<!DOCTYPE HTML PUBLIC 
"-//IETF//DTD HTML//EN"
>
<HTML>
<HEAD>
<meta name=
"GENERATOR" 
content=
"yangweijie code-tech.diandian.com"
>
<!-- Sitemap 1.0 -->
</HEAD><BODY>
<UL>
{
$list
}
</UL>
</BODY></HTML>
eof;
            
file_put_contents
(
"{$this->chm_path}/{$this->chm_hhk}.hhk"
$tpl
);
        
}
        
public 
function 
makeChm(){
            
if
(!
is_file
(
"{$this->chm_path}/{$this->chm_hhp}.hhp"
))   
                
return 
"build error:can't generate *.hhp file!"
;
            
$command 
"hhc {$this->chm_path}/{$this->chm_hhp}.hhp"
;
            
system(
$command
);
            
if
(
file_exists
(
"{$this->chm_path}/{$this->chm_name}.chm"
))
                
return 
true;
            
else
                
return 
'generate chm failed!'
;
        
}
    
}
?>

使用方法,放到要生成目录的外面 定义好路径,手册名,不包含目录,不包含文件 字符串(空格分割),设置好一些属性后, 将hhc.exe的位置加入环境变量path中,cmd 里调用 执行的index.php 可以看到生成的信息,或者错误
index.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
    
header(
'Content-type:text/plain;charset=utf-8'
);
    
error_reporting
(E_ERROR);
    
ini_set
(
'memory_limit'
'30M'
);
    
include 
'chm_builder.php'
;
    
$chm 
new 
chmBuilder(
'ThinkPHP manual'
,__DIR__.DIRECTORY_SEPARATOR.
'manual'
,
'public '
,
'.DS_Store Thumbs.db book.tpl'
);
    
$chm
->chm_hhp = 
'index'
;
    
$chm
->chm_hhc = 
'index'
;
    
$chm
->chm_first_open = 
$chm
->chm_path.DIRECTORY_SEPARATOR.
'序言.html'
;
    
$chm
->chm_hhk = 
'index'
;
    
$chm
->chm_title = 
'ThinkPHP 3.1.2官方手册'
;
    
$chm
->build();
    
//$chm->makeChm();
?>

这个可以配合ThinkPHP Sublime 插件来生成手册,目前排序方面有点问题,故没集成到插件里去。目前只支持二级分类,多级的大家递归时tab缩进好个是就行了,用手册里第一层目录和单文件名作为章节,里面的文件作为子章节

本文转自 3147972 51CTO博客,原文链接:http://blog.51cto.com/a3147972/1225251,如需转载请自行联系原作者
你可能感兴趣的文章
HDU1247 Hat’s Words 【trie树】
查看>>
iOS开发--动画篇之layout动画深入
查看>>
WorldWind源码剖析系列:视景体类Frustum
查看>>
(转)完整java开发中JDBC连接数据库代码和步骤
查看>>
Redis Lua脚本原理
查看>>
有时间测试dism
查看>>
/Users/alamps/AndroidStudioProjects/Demo10ScrollView
查看>>
【Swift】iOS UICollectionView 计算 Cell 大小的陷阱
查看>>
为什么我刚发表的文章变成了“待审核”,csdn有没有官方解释啊
查看>>
Android多线程源码详解一:handler、looper、message、messageQueue
查看>>
SaaS加速器II 能力中心:互利互补 共享商业红利
查看>>
病毒木马防御与分析实战
查看>>
分布式工作流任务调度系统Easy Scheduler正式开源
查看>>
Flutter实战(一)写一个天气查询的APP
查看>>
Python零基础学习笔记(十二)—— 字符串及其常用方法
查看>>
Webpack 和 Gulp 构建伪命令行项目
查看>>
在线面试, 前端, 提纲, 草稿
查看>>
hive_异常_01_ Terminal initialization failed; falling back to unsupported
查看>>
分布式事务键值数据库 TiKV 加入 CNCF 沙箱孵化器
查看>>
Vue - day1
查看>>