有一个chm文件导致cs2w报告错误,我用python-chm包重新做了一个python版的cs2w.py小程序,

72 views
Skip to first unread message

rae l

unread,
Apr 20, 2007, 10:18:41 AM4/20/07
to sz...@googlegroups.com
On 4/13/07, Ji YongGang <jung...@gmail.com> wrote:
> 我写了一个小程序 chmsee2web,见附件。
> Makefile 要根据自己的系统改改才能编译。然后执行命令:
>
> $ cs2w -T template -C web_dir sample.chm
>
> 解压后的文件都放在指定的 web_dir 里面,用浏览器打开 web_dir/cs2w_index.html 就可以看到。
>
> 有兴趣的试试,好不好用告诉我一声 :D
>
> -- jungle

有一个chm文件导致cs2w报告错误,这个文件在firefox的CHMreader插件上浏览和在windows用都很正常,所以说明cs2w还存在问题,

__DEBUG__模式编译的cs2w报告如下错误:
$ ./cs2w -T template/ -C plone2 plonebook-zh-0_5-1.chm
Extracting chm done.
system value = 3
system value = 10
system value = 9
system value = 4
lcid = 2052
system value = 2
system value = 3
system value = 6
hhc =
system value = 0
hhc = plone-docs.hhc
system value = 12
system value = 13
system value = 15
Parse encoding = gb2312

I/O error : Is a directory
Parsing chm hhc ... SAX.startDocument()
SAX.endDocument()
I/O error : Is a directory
finished.

Convert plonebook-zh-0_5-1.chm to web finished.
You can browse "plone2/cs2w_index.html" to visit.

~

具体我看了一下代码,可能是在parser.c文件中对hhc文件的解析有问题,这一个chm文件的hhc文件与一般的有些不同。

我用python-chm包重新做了一个python版的cs2w.py小程序,为此,先分析一下cs2w小程序的结构:
1. 程序有三个主要文件: chm2web.c parser.c parser.h
主函数中运行时先getopt解析参数,extract_chm将chm中的内容释放出来,
parse_hhc_file是解析hhc文件时在目标目录生成一个tree_items.js文件,
最后是将template里面的内容复制到目标目录。

请jungle看一下是不是这样的?

然后我的程序就是按照这个结构进行设计的,
1. 先是同样的getopt解析参数,extract_chm解压缩文件,
shutil复制template的文件,
还有一个专门的hhc文件解析器,
51 class TopicsParser(SGMLParser):
这个TopicsParser继承自SGMLParser,利用了SGMLParser的很多优点,只用了50行代码就写完了,能够解析一般的chm文件和这个特殊的chm文件。

: python-chm包中居然没有一个解压缩的函数,
这里的extract_chm是调用系统的extract_chmLib命令,
在debian系统下这个命令属于libchm-bin包。

最终的结果就是附件中的cs2w.py文件,全部代码包含注释一共是228行,用法与原始的cs2w相同。

这个原始的chm文件因为超过了group的1M限制,只单独发给jungle测试,在这里只把这个不同的hhc文件发上来。

>
>


--
程任全

cs2w.py
plone-docs.hhc

Ji YongGang

unread,
Apr 20, 2007, 11:28:31 PM4/20/07
to sz...@googlegroups.com
在 07-4-20,rae l<crq...@gmail.com> 写道:

>
> 有一个chm文件导致cs2w报告错误,这个文件在firefox的CHMreader插件上浏览和在windows用都很正常,所以说明cs2w还存在问题,
>
> __DEBUG__模式编译的cs2w报告如下错误:
> $ ./cs2w -T template/ -C plone2 plonebook-zh-0_5-1.chm
>
> ...
>
> 具体我看了一下代码,可能是在parser.c文件中对hhc文件的解析有问题,这一个chm文件的hhc文件与一般的有些不同。

问题是出在去 hhc 信息的地方,原来的代码只考虑到了,但实际上没有去取 ;P

--- chm2web.c.orig 2007-04-21 10:48:45.000000000 +0800
+++ chm2web.c 2007-04-21 10:49:00.000000000 +0800
@@ -274,6 +274,7 @@
cursor = buffer + index;

d(printf("hhc = %s\n", buffer + index + 2));
+ sprintf(hhc_file, "/%s", buffer + index + 2);

break;
case 4:
@@ -291,7 +292,7 @@
cursor = buffer + index;

if(!strlen(hhc_file)) {
- snprintf(hhc_file, sizeof(hhc_file),
"/%s.hhc", buffer + index + 2);
+ sprintf(hhc_file, "/%s.hhc", buffer +
index + 2);

if (chm_resolve_object(cf, hhc_file,
&ui) != CHM_RESOLVE_SUCCESS)
hhc_file[0] = '\0';


>
> 我用python-chm包重新做了一个python版的cs2w.py小程序,为此,先分析一下cs2w小程序的结构:
> 1. 程序有三个主要文件: chm2web.c parser.c parser.h
> 主函数中运行时先getopt解析参数,extract_chm将chm中的内容释放出来,
> parse_hhc_file是解析hhc文件时在目标目录生成一个tree_items.js文件,
> 最后是将template里面的内容复制到目标目录。
>
> 请jungle看一下是不是这样的?
>

没错,是这样的。

> 然后我的程序就是按照这个结构进行设计的,
> 1. 先是同样的getopt解析参数,extract_chm解压缩文件,
> shutil复制template的文件,
> 还有一个专门的hhc文件解析器,
> 51 class TopicsParser(SGMLParser):
> 这个TopicsParser继承自SGMLParser,利用了SGMLParser的很多优点,只用了50行代码就写完了,能够解析一般的chm文件和这个特殊的chm文件。
>
> : python-chm包中居然没有一个解压缩的函数,
> 这里的extract_chm是调用系统的extract_chmLib命令,
> 在debian系统下这个命令属于libchm-bin包。
>
> 最终的结果就是附件中的cs2w.py文件,全部代码包含注释一共是228行,用法与原始的cs2w相同。
>

在 Debian 下需要哪些包?我执行后遇到下面的提示:

$ ./cs2w.py -T template/ -C test plonebook-zh-0_5-1.chm
Extracting chm ... done.
Parsing chm hhc ...
Traceback (most recent call last):
File "./cs2w.py", line 228, in ?
main()
File "./cs2w.py", line 220, in main
gen_book_tree(target, nodeTree)
File "./cs2w.py", line 155, in gen_book_tree
_printTree(nodeTree)
File "./cs2w.py", line 145, in _printTree
print >> book_tree_file, templ % (
UnicodeEncodeError: 'ascii' codec can't encode characters in position
3-6: ordinal not in range(128)

我的 Debian 系统是 etch,有下面这些 python 相关的包:

$ dpkg -l|grep python
ii pychecker 0.8.17-3 Finds common
bugs in python source code
ii python 2.4.4-2 An interactive
high-level object-oriented language (default vers
ii python-cairo 1.2.0-1 Python bindings
for the Cairo vector graphics library
ii python-central 0.5.12 register and
build utility for Python packages
ii python-chm 0.8.4-0.1 Python binding for CHMLIB
ii python-dev 2.4.4-2 Header files and
a static library for Python (default)
ii python-doc 2.4.4-1 Documentation
for the high-level object-oriented language Python
ii python-examples 2.4.4-2 Examples for the
Python language (default version)
ii python-gdbm 2.4.4-1 GNU dbm database
support for Python
ii python-glade2 2.8.6-8 GTK+ bindings:
Glade support
ii python-gtk2 2.8.6-8 Python bindings
for the GTK+ widget set
ii python-libxml2 2.6.27.dfsg-1 Python bindings
for the GNOME XML library
ii python-minimal 2.4.4-2 A minimal subset
of the Python language (default version)
ii python-numeric 24.2-7 Numerical
(matrix-oriented) Mathematics for Python
ii python-subversion 1.4.2dfsg1-2 Python bindings
for Subversion
ii python-support 0.5.6 automated
rebuilding support for python modules
ii python-xml 0.8.4-6 XML tools for Python
ii python2.4 2.4.4-3 An interactive
high-level object-oriented language (version 2.4)
ii python2.4-dev 2.4.4-3 Header files and
a static library for Python (v2.4)
ii python2.4-doc 2.4.4-2 Documentation
for the high-level object-oriented language Python
ii python2.4-examples 2.4.4-3 Examples for the
Python language (v2.4)
ii python2.4-minimal 2.4.4-3 A minimal subset
of the Python language (version 2.4)

还要安装哪个包?

-- jungle

rankle_

unread,
Apr 22, 2007, 9:25:29 PM4/22/07
to 深圳 Linux Unix 用户组
On 4月21日, 上午11时28分, "Ji YongGang" <jungl...@gmail.com> wrote:
> 还要安装哪个包?
没有ImportError就说明不缺少任何一个python包。

在print阶段出现UnicodeEncodeError说明系统缺省编码可能是ascii的,于是打印不出来;


> print >> book_tree_file, templ % (
> UnicodeEncodeError: 'ascii' codec can't encode characters in position

可以这样测试一下是不是utf-8的:
$ python
Python 2.4.3 (#2, Oct 6 2006, 07:52:30)
[GCC 4.0.3 (Ubuntu 4.0.3-1ubuntu5)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'

>
> -- jungle

Ji YongGang

unread,
Apr 22, 2007, 10:01:41 PM4/22/07
to sz...@googlegroups.com
在 07-4-23,rankle_<crq...@gmail.com> 写道:

是这个问题,现在改成 utf-8 之后就好了 ;)

-- jungle

rankle_

unread,
Apr 22, 2007, 10:15:20 PM4/22/07
to 深圳 Linux Unix 用户组
查到原因了,
/etc/python2.4/site.py是Python的启动文件,在它里面有一个开关变量,把它打开可以让Python根据系统环境变量
LANG或LC_*之类去自动设置sys.defaultencoding,我这里为了简单我把所有机器上的python的这个开关变量都打开了。

以致于没有测出到这个BUG。

在各人的机器上可以根据选择打开这个开关或者在程序里面单独设置defaultencoding:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

Zhang Le

unread,
Apr 24, 2007, 10:09:06 AM4/24/07
to sz...@googlegroups.com
On 4/23/07, rankle_ <crq...@gmail.com> wrote:
> 查到原因了,
> /etc/python2.4/site.py是Python的启动文件
我的系统好像没有这个文件,奇怪

--
Zhang Le, Robert
http://zhllg.blogspot.com
http://zh.gentoo-wiki.com
http://savannah.nongnu.org/projects/pgubook
http://groups.google.com/group/gentoo-china
http://groups.google.com/group/szlug

rae l

unread,
Apr 24, 2007, 9:13:57 PM4/24/07
to sz...@googlegroups.com
On 4/24/07, Zhang Le <robert....@gmail.com> wrote:
> On 4/23/07, rankle_ <crq...@gmail.com> wrote:
> > 查到原因了,
> > /etc/python2.4/site.py是Python的启动文件
> 我的系统好像没有这个文件,奇怪
这个文件本来应该在python的标准库目录中,可是debian下把它当成了配置文件转移到了/etc里面,原始位置的那一个反而变成了它的符号链接:
$ ls -l /usr/lib/python2.4/site.py
lrwxrwxrwx 1 root root 22 2006-11-23 19:00 /usr/lib/python2.4/site.py
-> /etc/python2.4/site.py

rankle_

unread,
Apr 24, 2007, 9:22:44 PM4/24/07
to 深圳 Linux Unix 用户组
On Apr 24, 10:09 pm, "Zhang Le" <robert.zhan...@gmail.com> wrote:
> On 4/23/07, rankle_ <crq...@gmail.com> wrote:> 查到原因了,
> > /etc/python2.4/site.py是Python的启动文件
>
> 我的系统好像没有这个文件,奇怪
可以打印出sys.path看看,site.py是python的启动初始化文件,它一定存在于sys.path的某一个路径上:

$ python2.4 -c 'import sys, pprint; pprint.pprint(sys.path)'
['',
'/usr/lib/python24.zip',
'/usr/lib/python2.4',
'/usr/lib/python2.4/plat-linux2',
'/usr/lib/python2.4/lib-tk',
'/usr/lib/python2.4/lib-dynload',
'/usr/local/lib/python2.4/site-packages',
'/usr/lib/python2.4/site-packages',
'/usr/lib/python2.4/site-packages/HTMLgen',
'/usr/lib/python2.4/site-packages/Numeric',
'/usr/lib/python2.4/site-packages/PIL',
'/usr/lib/python2.4/site-packages/cairo',
'/usr/lib/python2.4/site-packages/gst-0.10',
'/usr/lib/python2.4/site-packages/gtk-2.0',
'/usr/lib/site-python']

Zhang Le

unread,
Apr 25, 2007, 12:28:18 AM4/25/07
to sz...@googlegroups.com
On 4/25/07, rae l <crq...@gmail.com> wrote:
> On 4/24/07, Zhang Le <robert....@gmail.com> wrote:
> > On 4/23/07, rankle_ <crq...@gmail.com> wrote:
> > > 查到原因了,
> > > /etc/python2.4/site.py是Python的启动文件
> > 我的系统好像没有这个文件,奇怪
> 这个文件本来应该在python的标准库目录中,可是debian下把它当成了配置文件转移到了/etc里面,原始位置的那一个反而变成了它的符号链接:
> $ ls -l /usr/lib/python2.4/site.py
我有这个文件,不过不是符号连接
看看和你的一样么?在附件里
site.py

rae l

unread,
Apr 25, 2007, 12:42:09 AM4/25/07
to sz...@googlegroups.com
On 4/25/07, Zhang Le <robert....@gmail.com> wrote:
> 我有这个文件,不过不是符号连接
> 看看和你的一样么?在附件里
就是这个文件,在它里面会调用一个setencoding函数:
def setencoding():
"""Set the string encoding used by the Unicode implementation. The
default is 'ascii', but if you're willing to experiment, you can
change this."""
encoding = "ascii" # Default value set by _PyUnicode_Init()
if 0:
# Enable to support locale aware default string encodings.
import locale
loc = locale.getdefaultlocale()
if loc[1]:
encoding = loc[1]

这里的if 0就是开关变量,把它改成1就可以根据locale来自动设置defaultencoding,如设置之后就会发现defaultcoding根据环境变量会变化:

$ python2.4 -c 'import sys; print sys.getdefaultencoding()'
utf-8
$ LANG=C python2.4 -c 'import sys; print sys.getdefaultencoding()'
ascii
$ LANG=en_US python2.4 -c 'import sys; print sys.getdefaultencoding()'
ISO8859-1
$ LANG=zh python2.4 -c 'import sys; print sys.getdefaultencoding()'
eucCN
$ LANG=zh_CN python2.4 -c 'import sys; print sys.getdefaultencoding()'
gb2312
$ LANG=zh_CN.UTF-8 python2.4 -c 'import sys; print sys.getdefaultencoding()'
utf-8


更好地找到site.py是使用-S选项调用python,以使它不加载site.py,这样打印出的sys.path就是在加载site.py之前的路径,site.py文件肯定在这些路径之一,这样搜索范围就小很多:
$ python2.4 -S -c 'import sys, pprint; pprint.pprint(sys.path)'
['',
'/usr/lib/python24.zip',
'/usr/lib/python2.4/',
'/usr/lib/python2.4/plat-linux2',
'/usr/lib/python2.4/lib-tk',
'/usr/lib/python2.4/lib-dynload']

--
程任全

Zhang Le

unread,
Apr 25, 2007, 1:00:11 AM4/25/07
to sz...@googlegroups.com
On 4/25/07, rae l <crq...@gmail.com> wrote:
> On 4/25/07, Zhang Le <robert....@gmail.com> wrote:
> > 我有这个文件,不过不是符号连接
> > 看看和你的一样么?在附件里
> 就是这个文件,在它里面会调用一个setencoding函数:
> def setencoding():
> """Set the string encoding used by the Unicode implementation. The
> default is 'ascii', but if you're willing to experiment, you can
> change this."""
> encoding = "ascii" # Default value set by _PyUnicode_Init()
> if 0:
> # Enable to support locale aware default string encodings.
> import locale
> loc = locale.getdefaultlocale()
> if loc[1]:
> encoding = loc[1]
>
> 这里的if 0就是开关变量,把它改成1就可以根据locale来自动设置defaultencoding,如设置之后就会发现defaultcoding根据环境变量会变化:
原来如此,感谢!

Ji YongGang

unread,
Apr 25, 2007, 1:31:47 AM4/25/07
to 深圳 LinuxUnix 用户组
在 07-4-25,rae l<crq...@gmail.com> 写道:

> On 4/21/07, Ji YongGang <jung...@gmail.com> wrote:
> >
> > 问题是出在去 hhc 信息的地方,原来的代码只考虑到了,但实际上没有去取 ;P
> >
> 请问jungle测试过吗?怎么我加上这个补丁再编译再运行有这个错误,
>

上面的补丁我是按照最初上传来的文件改的。主要就是在 case 0: 里面加一行赋值语句。

> $ ./cs2w -T template/ -C plone ~/Desktop/plonebook-zh-0_5-1.chm
> Extracting chm .......................................................................................................................................................................................................
> done.
> encoding error : input conversion failed due to input error, bytes
> 0xD1 0x62 0x50 0x6C
> encoding error : input conversion failed due to input error, bytes
> 0xD1 0x62 0x50 0x6C
> I/O error : encoder error
> Parsing chm hhc ... finished.
>

你加上 __DEBUG__ 再看看上面的错误信息出现在什么位置。

> 运行的过程中打开cs2w_index.html看到少了一些章节,
> 不知是我做补丁的方式不对还是怎么样,我把我用cs2w.py生成的tree_items.js发附件给你再看一下。
>

我对比了一下,除了空行和个别括号位置之外没什么区别,diff 见附件。

> 另外,在cs2w_header.html中我建议增加一个"Close This
> Frame"的链接,因为上面那个100像素高的frame一直显示的话不太好,应该给用户一个很方便地关闭它的途径,也在附件里面。
>

我考虑的是 template 目录下面的文件只作为简单的示例,如果是在公司局域网内用,可以参照这个例子替换自己的 logo,改成自己的风格。

-- jungle

tree_item.diff

Ji YongGang

unread,
Apr 25, 2007, 1:37:33 AM4/25/07
to 深圳 LinuxUnix 用户组
在 07-4-25,Ji YongGang<jung...@gmail.com> 写道:

> > $ ./cs2w -T template/ -C plone ~/Desktop/plonebook-zh-0_5-1.chm
> > Extracting chm .......................................................................................................................................................................................................
> > done.
> > encoding error : input conversion failed due to input error, bytes
> > 0xD1 0x62 0x50 0x6C
> > encoding error : input conversion failed due to input error, bytes
> > 0xD1 0x62 0x50 0x6C
> > I/O error : encoder error
> > Parsing chm hhc ... finished.
> >
>
> 你加上 __DEBUG__ 再看看上面的错误信息出现在什么位置。
>

我估计是跟 encoding 处理有关。在 parser.c 代码里面你可以看到,encoding
作为参数传入了,但没有使用,因为在我这里测试的时候发现,系统自动转换成 utf-8 了。

-- jungle

rae l

unread,
Apr 25, 2007, 2:34:29 AM4/25/07
to sz...@googlegroups.com
On 4/25/07, Ji YongGang <jung...@gmail.com> wrote:
> 你加上 __DEBUG__ 再看看上面的错误信息出现在什么位置。
这回生成的输出比较长:

$ ./cs2w -T template/ -C plone ~/Desktop/plonebook-zh-0_5-1.chm
Extracting chm done.
system value = 3
system value = 10
system value = 9
system value = 4
lcid = 2052
system value = 2
system value = 3
system value = 6
hhc = /plone-docs.hhc

system value = 0
hhc = plone-docs.hhc
system value = 12
system value = 13
system value = 15
Parse encoding = gb2312

encoding error : input conversion failed due to input error, bytes
0xD1 0x62 0x50 0x6C


Parsing chm hhc ... SAX.startDocument()

SAX.startElement(html)
SAX.startElement(head)
SAX.startElement(meta)
SAX.endElement(meta)
SAX.endElement(head)
SAX.startElement(body)
SAX.startElement(object)
type = text/site properties
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = -1
depth = 0
title = 关于本书 local = trunk/000-about.html
SAX.endElement(li)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 0
depth = 0
title = 第1章:介绍Plone local = trunk/010-plone-overview.html
SAX.endElement(li)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 0
depth = 1
title = 什么是内容管理系统? local = trunk/010-plone-overview.html#id2
SAX.endElement(li)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 1
depth = 1
title = 你是否需要一个内容管理系统? local = trunk/010-plone-overview.html#id3
SAX.endElement(li)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 1
depth = 1
title = 介绍Plone的特性 local = trunk/010-plone-overview.html#id4
SAX.endElement(li)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 1
depth = 2
title = 打包 local = trunk/010-plone-overview.html#id5
SAX.endElement(li)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 2
depth = 2
title = 国际化 local = trunk/010-plone-overview.html#id6
SAX.endElement(li)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 2
depth = 2
title = 可用性(Usability) local = trunk/010-plone-overview.html#usability
SAX.endElement(li)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 2
depth = 2
title = 支持皮肤(Skin) local = trunk/010-plone-overview.html#skin
SAX.endElement(li)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 2
depth = 2
title = 注册和个性化 local = trunk/010-plone-overview.html#id7
SAX.endElement(li)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 2
depth = 2
title = 工作流和安全管理 local = trunk/010-plone-overview.html#id8
SAX.endElement(li)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 2
depth = 2
title = 可扩展性 local = trunk/010-plone-overview.html#id9
SAX.endElement(li)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 2
depth = 2
title = 内容定制 local = trunk/010-plone-overview.html#id10
SAX.endElement(li)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 2
depth = 2
title = 文档 local = trunk/010-plone-overview.html#id11
SAX.endElement(li)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 2
depth = 2
title = 社区 local = trunk/010-plone-overview.html#id12
SAX.endElement(li)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 2
depth = 3
title = 中文技术社区 local = trunk/010-plone-overview.html#id13
SAX.endElement(li)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 3
depth = 3
title = Plone.org资源 local = trunk/010-plone-overview.html#plone-org
SAX.endElement(li)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 3
depth = 3
title = Plone网站示例 local = trunk/010-plone-overview.html#id14
SAX.endElement(li)
SAX.endElement(ul)
SAX.endElement(ul)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap


encoding error : input conversion failed due to input error, bytes
0xD1 0x62 0x50 0x6C
I/O error : encoder error

SAX.startElement(param)
SAX.endElement(param)
SAX.startElement(param)
SAX.endElement(param)
SAX.endElement(object)
prev_depth = 3
depth = 1
title = 进入Plone的开发 local = trunk/010-plone-overview.html#id15
SAX.endElement(li)
SAX.endElement(ul)
SAX.endElement(ul)
SAX.startElement(ul)
SAX.startElement(li)
SAX.startElement(object)
type = text/sitemap
SAX.startElement(param)
SAX.endElement(object)
prev_depth = 1
depth = 0
title = 第2章 安 local = trunk/010-plone-overview.html#id15
SAX.endElement(li)
SAX.endElement(ul)
SAX.endElement(body)
SAX.endElement(html)
SAX.endDocument()
finished.

Convert /home/rae/Desktop/plonebook-zh-0_5-1.chm to web finished.
You can browse "plone/cs2w_index.html" to visit.


>
> > 运行的过程中打开cs2w_index.html看到少了一些章节,
> > 不知是我做补丁的方式不对还是怎么样,我把我用cs2w.py生成的tree_items.js发附件给你再看一下。
要么请你把制作好的cs2w整个源代码再打个包发上来吧。

> >
>
> 我对比了一下,除了空行和个别括号位置之外没什么区别,diff 见附件。
我原来制作解析器的时候就想把它生成的tree_item.js输出达到与cs2w的输出一致,不知怎么还有这些空格的不同。要么可以使用diff -b比较一下。

>

需要开发效率的时候我使用python来做,需要运行效率的场合我会使用C来做一个;因此我不仅需要知道在python里怎么解析一个XML,还需要知道在C里面怎么解析XML。

tree_items.js

Ji YongGang

unread,
Apr 25, 2007, 4:16:08 AM4/25/07
to sz...@googlegroups.com
在 07-4-25,rae l<crq...@gmail.com> 写道:
> On 4/25/07, Ji YongGang <jung...@gmail.com> wrote:
> > 你加上 __DEBUG__ 再看看上面的错误信息出现在什么位置。
> 这回生成的输出比较长:
> $ ./cs2w -T template/ -C plone ~/Desktop/plonebook-zh-0_5-1.chm
> Extracting chm done.
> system value = 3
> system value = 10
> system value = 9
> system value = 4
> lcid = 2052
> system value = 2
> system value = 3
> system value = 6
> hhc = /plone-docs.hhc
> system value = 0
> hhc = plone-docs.hhc
> system value = 12
> system value = 13
> system value = 15
> Parse encoding = gb2312
>
> encoding error : input conversion failed due to input error, bytes
> 0xD1 0x62 0x50 0x6C
> Parsing chm hhc ... SAX.startDocument()

比较奇怪,出现错误信息的地方只有创建 tree_item.js 文件的函数调用。

...
...

只有这么多输出,还是有其他的没有贴上来?

> >
> > > 运行的过程中打开cs2w_index.html看到少了一些章节,
> > > 不知是我做补丁的方式不对还是怎么样,我把我用cs2w.py生成的tree_items.js发附件给你再看一下。
> 要么请你把制作好的cs2w整个源代码再打个包发上来吧。

见附件。

> >
> > 我对比了一下,除了空行和个别括号位置之外没什么区别,diff 见附件。
> 我原来制作解析器的时候就想把它生成的tree_item.js输出达到与cs2w的输出一致,不知怎么还有这些空格的不同。要么可以使用diff -b比较一下。
>

其实你的程序输出更工整一些 :)

我把 cs2w 的输出也发上来。

>
> 需要开发效率的时候我使用python来做,需要运行效率的场合我会使用C来做一个;因此我不仅需要知道在python里怎么解析一个XML,还需要知道在C里面怎么解析XML。
>

这两种实现方法的效率差别不大,最费时的部分都是在调用 libchm 的 C 库。

-- jungle

cs2w_20070425.tar.gz
tree_items.js

Ji YongGang

unread,
Apr 25, 2007, 11:17:29 PM4/25/07
to 深圳 LinuxUnix 用户组

我在 Debian 下测试,找到原因了。
这份 plone 的 chm 文件实际使用了 gbk 编码,但制作的时候却写成 gb2312。

测试方法是在 parse.c 的 parse_hhc_file 函数里面,在传入 encoding 前,将值改成 gbk 或 gb18030 都可以正确解析。

doc = htmlSAXParseFile(hhc_file,
encoding,
hhSAXHandler,
file);

NetBSD 因为不支持 gbk 编码,可能忽略了特殊的字符,倒可以继续进行解析。

-- jungle

rae l

unread,
Apr 25, 2007, 11:25:42 PM4/25/07
to sz...@googlegroups.com

没有截断,是只有这么多输出。

但是我知道问题所在了。

仔细看为什么解析器到这里就忽然停下来了?


> > title = 第2章 安 local = trunk/010-plone-overview.html#id15

上面的tree_item.diff中还有这样一个不同:
- ['第2章 安裝Plone', 'trunk/020-install-plone.html',
+ ['第2章 安砚Plone', 'trunk/020-install-plone.html',

这个"裝"居然被换成了"砚"字。

这个"裝"实际上是个繁体字,在python下可以很轻松地发现:
>>> u = u'安裝Plone'
>>> print u
安裝Plone
>>> u.encode('GB2312')


Traceback (most recent call last):

File "<stdin>", line 1, in ?
UnicodeEncodeError: 'gb2312' codec can't encode character u'\u88dd' in
position 1: illegal multibyte sequence
>>> u.encode('GBK')
'\xb0\xb2\xd1bPlone'
>>> u.encode('cp936')
'\xb0\xb2\xd1bPlone'
>>> u.encode('GB18030')
'\xb0\xb2\xd1bPlone'

这个"裝"是在GBK也就是cp936里面才有的字符,

对比LCID的解析结果,应该是这里有问题,cs2w的解析结果是gb2312,而python-chm的解析结果是cp936。

我再给chm2web.c文件作这样一个小的修改于是cs2w就能处理好这个文件了,生成的tree_item.js是正确的,但不知会不会引起其它的问题?
=== modified file 'chm2web.c'
--- chm2web.c
+++ chm2web.c
@@ -225,7 +225,7 @@
break;
case 0x804:
case 0x1004:
- strcpy(encoding, "gb2312");
+ strcpy(encoding, "cp936");
break;
}
}

在这个文件里有一份较全的查找表:/usr/lib/python2.4/site-packages/chm/chm.py

61 locale_table = {
...
87 0x0404 : ('cp950', "Chinese_Taiwan", "Traditional Chinese"),
88 0x0804 : ('cp936', "Chinese_PRC", "Simplified Chinese"),
89 0x0c04 : ('cp950', "Chinese_Hong_Kong", "Traditional Chinese"),
90 0x1004 : ('cp936', "Chinese_Singapore", "Simplified Chinese"),
91 0x1404 : ('cp950', "Chinese_Macau", "Traditional Chinese"),
...

--
程任全

Ji YongGang

unread,
Apr 26, 2007, 12:18:39 AM4/26/07
to sz...@googlegroups.com
在 07-4-26,rae l<crq...@gmail.com> 写道:

>
> 我再给chm2web.c文件作这样一个小的修改于是cs2w就能处理好这个文件了,生成的tree_item.js是正确的,但不知会不会引起其它的问题?
> === modified file 'chm2web.c'
> --- chm2web.c
> +++ chm2web.c
> @@ -225,7 +225,7 @@
> break;
> case 0x804:
> case 0x1004:
> - strcpy(encoding, "gb2312");
> + strcpy(encoding, "cp936");
> break;
> }
> }
>

你的改法是对的,不应该用 gb2312。

> 在这个文件里有一份较全的查找表:/usr/lib/python2.4/site-packages/chm/chm.py
>
> 61 locale_table = {
> ...
> 87 0x0404 : ('cp950', "Chinese_Taiwan", "Traditional Chinese"),
> 88 0x0804 : ('cp936', "Chinese_PRC", "Simplified Chinese"),
> 89 0x0c04 : ('cp950', "Chinese_Hong_Kong", "Traditional Chinese"),
> 90 0x1004 : ('cp936', "Chinese_Singapore", "Simplified Chinese"),
> 91 0x1404 : ('cp950', "Chinese_Macau", "Traditional Chinese"),
> ...

多谢!

-- jungle

rae l

unread,
May 6, 2007, 1:15:21 PM5/6/07
to sz...@googlegroups.com
On 4/20/07, rae l <crq...@gmail.com> wrote:
> : python-chm包中居然没有一个解压缩的函数,
> 这里的extract_chm是调用系统的extract_chmLib命令,
> 在debian系统下这个命令属于libchm-bin包。
python-chm包的源头在gnochm里面的pychm子项目:
http://gnochm.sourceforge.net/pychm.html
可是这个python-chm仅仅是C的libchm-dev的一个简单包裹,只提供了很少附加的功能;
如这个python-chm里面也有chm_enumerate和chm_enumerate_dir函数,
是C库的相应函数的python包裹,C库的这两个函数要求传入一个CHM_ENUMERATOR函数,
在纯的python代码里面不可能写出一个C的函数来传过去;传了一个python的函数过去又会出内存错。
这个包裹是以SWIG的方式做成的,
http://gnochm.cvs.sourceforge.net/gnochm/pychm/chm/swig_chm.i?view=markup

>

--
程任全

Reply all
Reply to author
Forward
0 new messages