-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchmfox.html
197 lines (195 loc) · 13.9 KB
/
chmfox.html
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
<!DOCTYPE html>
<!--[if IE 8]> <html class="no-js lt-ie9" lang="zh-cn"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="zh-cn"> <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>道可叨 | ChmFox </title>
<meta name="viewport" content="width=device-width">
<meta name="author" content="Qiang">
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
<link href="http://localhost:8000/feeds/atom.xml" type="application/atom+xml" rel="alternate" title="道可叨 Atom Feed" />
<link rel="stylesheet" href="https://zhuoqiang.github.io/theme/css/app.css">
<script src="https://zhuoqiang.github.io/theme/js/vendor/custom.modernizr.js"></script>
</head>
<body>
<header>
<hgroup>
<a href="https://zhuoqiang.github.io">
<h1 i18n>道可叨</h1>
<h2>Free Will</h2>
</a>
</hgroup>
</header>
<section>
<article>
<header>
<h1><a href="https://zhuoqiang.github.io/chmfox.html">ChmFox</a></h1>
</header> <div>
<section>
<p>新版本 2.2 已发布,升级和新功能请看 <a class="reference external" href="https://zhuoqiang.github.io/chmfox2.html">ChmFox2</a></p>
<p>最近有很多朋友问 ChmFox 的问题,这里大致介绍一下,也做个推荐。</p>
<p>ChmFox 是一款 Firefox 扩展。它可以将 Firefox 变成阅读 CHM 文件的利器。如果和 Firefox 上众多提升阅读体验的扩展配合使用,你就拥有了最好的 CHM 阅读软件。更棒的是,它和 Firefox 一样是跨平台的,你可以在 Windows,Linux,Mac 等平台上获得一致的 CHM 阅读体验。</p>
<img alt="ChmFox Logo" src="https://zhuoqiang.github.io/images/chmfox.png" />
<div class="contents local topic" id="id1">
<ul class="simple">
<li><a class="reference internal" href="#id2" id="id11">安装</a></li>
<li><a class="reference internal" href="#id4" id="id12">使用</a></li>
<li><a class="reference internal" href="#id5" id="id13">高级使用</a></li>
<li><a class="reference internal" href="#id6" id="id14">编译方法</a></li>
<li><a class="reference internal" href="#id8" id="id15">内幕</a></li>
<li><a class="reference internal" href="#id10" id="id16">未来</a></li>
</ul>
</div>
<div class="section" id="id2">
<h2><a class="toc-backref" href="#id11">安装</a></h2>
<p>ChmFox 从 1.1 版开始就通过了 Mozilla 的官方认证,现在你可以直接在 Firefox 的菜单 附加组件 <tt class="docutils literal"><span class="pre">--></span></tt> 获取附加组件 中搜索并安装它。当然,你也可以去 ChmFox 在 Mozilla 官网上的 <a class="reference external" href="https://addons.mozilla.org/firefox/addon/chmfox/">主页</a> 去下载安装。安装完后需要重启 Firefox 才能生效。安装过程中会提醒给作者捐款以支持开发,这里就悉听尊便了。当然,不捐款是完全不影响使用的。</p>
<p>目前 ChmFox 1.1 支持以下操作系统:</p>
<ul class="simple">
<li>Windows</li>
<li>Linux x86_64</li>
<li>Linux i686</li>
<li>Mac i386</li>
</ul>
<p>如果 ChmFox 暂时不支持你的操作系统,你又比较 geek 的话,请看后面的编译章节自行编译。</p>
</div>
<div class="section" id="id4">
<h2><a class="toc-backref" href="#id12">使用</a></h2>
<p>在重启完 Firefox 后,就可以开始使用 ChmFox 了。你可以使用下面众多方式打开 CHM 文件:</p>
<ul class="simple">
<li>使用菜单中的 打开文件 选择要打开的 CHM 文件</li>
<li>用鼠标将 CHM 文件拖入 Firefox 窗口中</li>
<li>使用命令行直接打开,例如: <tt class="docutils literal">firefox.exe <span class="pre">c:\\hello.chm</span></tt></li>
</ul>
<p>最后一种方式也是操作系统所熟知的打开方式。这意谓着,你可以直接将 CHM 文件类型关联到 Firefox 上。以后直接双击 CHM 文件,操作系统就会用 Firefox 去打开它。</p>
<p>一般 CHM 文件都会有目录,有些还会有索引。ChmFox 提供了专门的侧栏来显示它们。你可以通过菜单 <tt class="docutils literal">查看 <span class="pre">--></span> 侧栏 <span class="pre">--></span> ChmFox</tt> 来打开和关闭。方便起见,ChmFox 同时提供了打开侧栏的快捷键 <span class="kbd">alt shift m</span> 侧栏的使用也很直观,直接点击侧栏上的某个条目就可以转到相关页面。</p>
<p>在阅读时,你也可以将页面直接加入收藏夹。下次可以直接通过收藏夹中的链接打开相应的文件的页面。</p>
<p>ChmFox 对 CHM 使用了自定义的 URI schema, 形如:</p>
<div class="highlight"><pre><span></span>chm:///c:/path/to/file.chm!/page_url.html
</pre></div>
<p>在命令行中,也可以使用 Firefox 直接打开这种 CHM 的 URI:</p>
<div class="highlight"><pre><span></span>firefox.exe chm:///c:/hello.chm!/home.html
</pre></div>
<p>如果觉得字的大小不合适,还可以使用 Firefox 提供的页面缩放功能进行调整。</p>
</div>
<div class="section" id="id5">
<h2><a class="toc-backref" href="#id13">高级使用</a></h2>
<p>ChmFox 可以和众多优秀的 Firefox 扩展配合使用,提升 CHM 阅读体验。例如:</p>
<ul class="simple">
<li>使用 Firefox 的 NoSquint 扩展,自动调整页面和文字大小</li>
<li>使用 Delicious Extension 将阅读页面收藏到 Delicious 上。这样就可以在不同机器间同步阅读进度。不过,这要求不同机器上的 CHM 文件路径要相同。</li>
<li>使用 ScrapBook 对关键页面加入评注并收藏,做成读书笔记</li>
</ul>
<p>这个列表还能继续下去。大家都有自己最爱的 Firefox 扩展,在使用 ChmFox 时你完全可以发挥想象力,通过组合不同的优秀扩展,提升自己的阅读体验。</p>
<p>这也正是 Firefox 的魅力所在。</p>
</div>
<div class="section" id="id6">
<h2><a class="toc-backref" href="#id14">编译方法</a></h2>
<p>虽然 ChmFox 已经支持了很多平台,但因为精力有限,还是有漏网之鱼(例如问的比较多的 Mac x86_64 平台)。好在,ChmFox 是使用跨平台的 C/C++ 和 Javascript 开发的开源项目。如果有兴趣,你可以自行编译对特殊平台的支持,下面是简略的编译方式:</p>
<ul>
<li><p class="first">安装 <a class="reference external" href="http://python.org">Python</a> 用来运行 SCons</p>
</li>
<li><p class="first">安装 <a class="reference external" href="http://www.scons.org">SCons</a> 用来运行 ChmFox 的编译脚本</p>
</li>
<li><p class="first">下载最新的 <a class="reference external" href="https://developer.mozilla.org/en/Gecko_SDK#Downloading">Gecko SDK</a> 选择合适你平台的 SDK (新版 ChmFox 已经不需要了)</p>
</li>
<li><p class="first">下载最新的 <a class="reference external" href="https://bitbucket.org/zhuoqiang/chmfox">ChmFox 源代码</a></p>
</li>
<li><p class="first">修改 ChmFox 源码中的 <tt class="docutils literal">chrome.manifest</tt> ,增加平台说明,例如</p>
<div class="highlight"><pre><span></span>binary-component platform/Darwin_x86_64-gcc3/components/libchm.dylib ABI=Darwin_x86_64-gcc3
</pre></div>
</li>
<li><p class="first">将 Gecko SDK 解压到某个目录,打开命令行,进入 ChmFox 源代码根目录,执行:</p>
<div class="highlight"><pre><span></span>GECKO_SDK=/full/path/to/gecko_sdk scons xpi
</pre></div>
</li>
</ul>
<p>如果顺利,在 ChmFox 源代码根目录会新生成一个 xpi 文件,将它拖到 Firefox 中就可以安装了。</p>
<p>也欢迎大家将编译的结果寄给我,我会将您的劳动加入到下一个发行包中,让更多的人受益。</p>
</div>
<div class="section" id="id8">
<h2><a class="toc-backref" href="#id15">内幕</a></h2>
<p>上面大致讲了 ChmFox 的使用,如果你对 ChmFox 本身感兴趣的话,下面是关于它的一些内幕。</p>
<p>ChmFox 是本博的作品。内举不避亲,我也希望 ChmFox 能够帮到大家。每一个好软件的起因都是挠到了开发者本人的痒处,ChmFox 也不例外。几年前有一款 Firefox 扩展叫 CHM Reader,它正是 ChmFox 的前身。当时看到它确实眼前一亮,通过它,Firefox 就可以用来阅读 CHM,很多好的阅读体验也能用在 CHM 上了。而且它支持 Linux, 从此就再不用在 Linux 的众多虽勘用但都略有缺陷的 CHM 阅读软件中做选择了。连 Windows 上的 CHM 默认阅读器都可以退休了。这款扩展当时只有一个令我不爽的地方:它需要用自己单独的菜单栏打开 CHM 文件,不能直接命令行打开 CHM 文件。这样就不能进行文件关联。你需要通过变通的方式才能设置成双击 CHM 文件 Firefox 自动打开。但不管如何,这只是个小缺陷,还没有让我心痒难耐。直到 Firefox 4 发布后,似乎原作者没有要继续开发新版支持 Firefox 4 的意思,这才下决心自己挽起袖子做一款新的插件。首要的目标就是支持 Firefox 4,同时,也改进原版不能直接打开 CHM 文件的缺陷。</p>
<p>开发从今年 5.1 假期开始,到 ChmFox 1.1 版本被 Mozilla 审核通过,断断续续持续了两个月时间。其中真正开发的时间算下来只有3个周末。比我想象的要困难些。由于从没接触过 Firefox 扩展开发,一开始花了一周的时间用来学习 CHM Reader 等优秀扩展的代码。下面是一些流水账:</p>
<ul class="simple">
<li>Firefox 4 是个大版本升级,Gecko SDK 2.0 包含了很多不兼容的接口升级,原来的 CHM Reader 的接口代码都要改变。这里是 <a class="reference external" href="https://developer.mozilla.org/en/XPCOM/XPCOM_changes_in_Gecko_2.0">参考资料</a></li>
<li>增加一个自定义的 <tt class="docutils literal">uriContentListener</tt> ,通过它把 CHM 文件的 URI 转成上面自定义的 CHM URI,从而使 Firefox 能直接打开 CHM 文件</li>
<li>修正了一些 CHM Reader 上原有的 Bug</li>
<li>制作程序图标,准备提交 Mozilla 审阅的资料</li>
<li>进一步修改程序,以符合 Mozilla 审核的标准</li>
<li>增加对 Firefox 5 的支持</li>
</ul>
<p>在开发中最大的问题是 ChmFox 中使用的 binary component。它需要在每个平台上编译出各自的版本。Mozilla 又规定,Firefox 每次大版本升级,binary component 必须与最新的 Gecko SDK 一起重新编译。按现在 Firefox 一个多月出一个大版本的速度,程序编译的工作量无形增加了很多。以后 ChmFox 可能会把 binary component 干掉,用 <a class="reference external" href="https://developer.mozilla.org/en/javascript_code_modules/ctypes.jsm">ctypes.jsm</a> 直接操作普通的动态库减轻升级的工作量(最新版已经完成)。</p>
</div>
<div class="section" id="id10">
<h2><a class="toc-backref" href="#id16">未来</a></h2>
<p>虽然 ChmFox 功能简单,可细想想还是有很多可以改进的空间,下面是我的一些计划:</p>
<ul class="simple">
<li>持续加入对 Firefox 新版本的支持(这个要吐槽一下 Firefox 疯了似的大版本升级)</li>
<li>增加对新平台的支持,例如 Mac x86_64</li>
<li>增加 I18N/L10n 的支持,更加专业一些</li>
<li>可以自定义开关侧栏的快捷键,避免与其它扩展冲突</li>
<li>全文搜索</li>
<li>使用 <tt class="docutils literal">ctypes.jsm</tt> + dynamic library 取代 binary component</li>
</ul>
<p>欢迎大家在使用 ChmFox 时给它多提意见。一起帮它变的更好!</p>
</div>
</section>
</div>
<footer>
<p>
<time datetime="2011-07-12T00:30:00+08:00" pubdate>2011-07-12</time><a href="https://zhuoqiang.github.io/category/programming.html"><span class="category" i18n>programming</span></a>
</p>
<ul>
<li><a href="https://zhuoqiang.github.io/tag/chmfox.html"><span class="tag" i18n>chmfox</span></i></a>
<li><a href="https://zhuoqiang.github.io/tag/firefox.html"><span class="tag" i18n>firefox</span></i></a>
<li><a href="https://zhuoqiang.github.io/tag/opensource.html"><span class="tag" i18n>opensource</span></i></a>
</ul>
</footer><link rel="stylesheet" href="https://unpkg.com/gitalk/dist/gitalk.css">
<script src="https://unpkg.com/gitalk@latest/dist/gitalk.min.js"></script>
<div id="gitalk-container"></div>
<script type="text/javascript">
var gitalk = new Gitalk({
clientID: "2f60008869581fd61d19",
clientSecret: "6b303dcf58c04cd35782bae82540921663cbfda8",
repo: "zhuoqiang.github.com",
owner: "zhuoqiang",
admin: ["zhuoqiang"],
id: "chmfox",
title: "ChmFox",
perPage: 30,
distractionFreeMode: true,
pagerDirection: "last",
});
gitalk.render('gitalk-container');
</script></article>
</section>
<footer>
<p>@ <a href="mailto:[email protected]"><span i18n>Qiang</span></a> | <span class="heart"><a href="https://github.com/getpelican/pelican">Pelican</a> & <a href="https://bitbucket.org/zhuoqiang/jing">Jing</a></span></p>
</footer>
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.3.min.js"></script>
<script>window.jQuery || document.write('<script src="https://zhuoqiang.github.io/theme/js/vendor/jquery-1.8.3.min.js"><\/script>')</script>
<script src="https://zhuoqiang.github.io/theme/js/vendor/moment.min.js"></script>
<script src="https://zhuoqiang.github.io/theme/js/vendor/moment-lang.min.js"></script>
<script src="https://zhuoqiang.github.io/theme/js/vendor/i18next-1.6.0.min.js"></script>
<script src="https://zhuoqiang.github.io/theme/js/main.js"></script>
<script type="text/javascript">
var GoSquared = {};
GoSquared.acct = "GSN-743443-H";
(function(w){
function gs(){
w._gstc_lt = +new Date;
var d = document, g = d.createElement("script");
g.type = "text/javascript";
g.src = "//d1l6p2sc9645hc.cloudfront.net/tracker.js";
var s = d.getElementsByTagName("script")[0];
s.parentNode.insertBefore(g, s);
}
w.addEventListener ?
w.addEventListener("load", gs, false) :
w.attachEvent("onload", gs);
})(window);
</script>
</body>
</html>