PHPEye开源社区 » Zend Framework中文团队 » 如何正确的编译 Zend Framework 手册的 chm 版本
《Programming PHP》第二版上市
2007-7-17 18:28 mikespook
如何正确的编译 Zend Framework 手册的 chm 版本

原文地址:[url=http://blog.xxiyy.com/?p=24]http://blog.xxiyy.com/?p=24[/url]


或许早就应该写一下这个方法了,只是一直没有什么心情。这会休息,就随手敲打敲打吧。
由于我的环境是 windows,所以需要额外安装一些辅助软件。windows 下编译 docbook 的方法有许多种。我以前使用 java 写的一个工具,不过后来发现 cygwin 比较方便。
详细的 cygwin 以及 docbook 编译必须的包请看 hohappy 编写的指南:[url=http://www.phpeye.com/article/view/id/55]http://www.phpeye.com/article/view/id/55[/url]
废话不说了,现在看看如何编译chm。首先需要编译 chm 对应的 xsl。我使用[url=http://sf.net/]sf.net[/url] 下载的 docbook-xsl-1.72.0。其中包含 /htmlhelp/htmlhelp.xsl。

进入 Zend Framework 中文手册根目录,执行下面的命令:
[table=369][tr][td]$ autoconf  [/td][/tr][tr][td]$ ./configure  [/td][/tr][tr][td]$ export DOCBOOK_XSL=~/docbook-xsl-1.72.0/htmlhelp/htmlhelp.xsl[/td][/tr][tr][td]$ make -e
[/td][/tr][/table]make -e 是用环境变量覆盖 Makefile 中的变量。
这样,就会在 zh/html/ 目录下生成所有需要的文件,以及 htmlhelp.hhp 和 toc.hhc 文件。可以用微软出品的 HTML Help Workshop 直接编译 htmlhelp.hhp 文件,生成 chm 帮助。
OK,到此已经生成了 chm 帮助,但是如果是英文手册没有问题。中文手册由于 dtd 和 xsl 的规则问题,直接使用 htmlhelp.hhp 文件编译出来的手册目录是乱码。所以还缺少关键的转码一步。我是使用自己写的一个脚本完成了这个工作:
[color=#000000] #!/cygdrive/e/AppServ/php5/php.exe
[color=#00bb00]<?php
[/color][color=#077000]function [/color][color=#00bb00]toUtf8[/color][color=#077000]([/color][color=#00bb00]$ar[/color][color=#077000])
{
    foreach([/color][color=#00bb00]$ar [/color][color=#077000]as [/color][color=#00bb00]$val[/color][color=#077000])
    {
        [/color][color=#00bb00]$val [/color][color=#077000]= [/color][color=#00bb00]intval[/color][color=#077000]([/color][color=#00bb00]substr[/color][color=#077000]([/color][color=#00bb00]$val[/color][color=#077000],[/color][color=#00bb00]2[/color][color=#077000]),[/color][color=#00bb00]16[/color][color=#077000]);
        if([/color][color=#00bb00]$val [/color][color=#077000]< [/color][color=#00bb00]0×7F[/color][color=#077000])
        {        [/color][color=#ff8000]// 0000-007F
            [/color][color=#00bb00]$c [/color][color=#077000].= [/color][color=#00bb00]chr[/color][color=#077000]([/color][color=#00bb00]$val[/color][color=#077000]);
        }
        elseif([/color][color=#00bb00]$val [/color][color=#077000]< [/color][color=#00bb00]0×800[/color][color=#077000])
        { [/color][color=#ff8000]// 0080-0800
            [/color][color=#00bb00]$c [/color][color=#077000].= [/color][color=#00bb00]chr[/color][color=#077000]([/color][color=#00bb00]0xC0 [/color][color=#077000]| ([/color][color=#00bb00]$val [/color][color=#077000]/ [/color][color=#00bb00]64[/color][color=#077000]));
            [/color][color=#00bb00]$c [/color][color=#077000].= [/color][color=#00bb00]chr[/color][color=#077000]([/color][color=#00bb00]0×80 [/color][color=#077000]| ([/color][color=#00bb00]$val [/color][color=#077000]% [/color][color=#00bb00]64[/color][color=#077000]));
        }
        else
        {                [/color][color=#ff8000]// 0800-FFFF
            [/color][color=#00bb00]$c [/color][color=#077000].= [/color][color=#00bb00]chr[/color][color=#077000]([/color][color=#00bb00]0xE0 [/color][color=#077000]| (([/color][color=#00bb00]$val [/color][color=#077000]/ [/color][color=#00bb00]64[/color][color=#077000]) / [/color][color=#00bb00]64[/color][color=#077000]));
            [/color][color=#00bb00]$c [/color][color=#077000].= [/color][color=#00bb00]chr[/color][color=#077000]([/color][color=#00bb00]0×80 [/color][color=#077000]| (([/color][color=#00bb00]$val [/color][color=#077000]/ [/color][color=#00bb00]64[/color][color=#077000]) % [/color][color=#00bb00]64[/color][color=#077000]));
            [/color][color=#00bb00]$c [/color][color=#077000].= [/color][color=#00bb00]chr[/color][color=#077000]([/color][color=#00bb00]0×80 [/color][color=#077000]| ([/color][color=#00bb00]$val [/color][color=#077000]% [/color][color=#00bb00]64[/color][color=#077000]));
        }
    }
    return [/color][color=#00bb00]$c[/color][color=#077000];
}
function [/color][color=#00bb00]uniDecode[/color][color=#077000]([/color][color=#00bb00]$str[/color][color=#077000], [/color][color=#00bb00]$charcode[/color][color=#077000]=[/color][color=#dd0000]"UTF-8"[/color][color=#077000])
{
    [/color][color=#00bb00]$text [/color][color=#077000]= [/color][color=#00bb00]preg_replace_callback[/color][color=#077000]([/color][color=#dd0000]"/%u[0-9A-Za-z]{4}/"[/color][color=#077000], [/color][color=#00bb00]toUtf8[/color][color=#077000], [/color][color=#00bb00]$str[/color][color=#077000]);
    return [/color][color=#00bb00]mb_convert_encoding[/color][color=#077000]([/color][color=#00bb00]$text[/color][color=#077000], [/color][color=#00bb00]$charcode[/color][color=#077000], [/color][color=#dd0000]‘utf-8′[/color][color=#077000]);
}[/color][/color]
function [color=#00bb00]cp[/color][color=#077000]([/color][color=#00bb00]$m[/color][color=#077000])
{
    return [/color][color=#00bb00]iconv[/color][color=#077000]([/color][color=#dd0000]‘UTF-8′[/color][color=#077000], [/color][color=#dd0000]‘GBK’[/color][color=#077000], [/color][color=#00bb00]uniDecode[/color][color=#077000]([/color][color=#dd0000]‘%u’ [/color][color=#077000]. [/color][color=#00bb00]dechex[/color][color=#077000]([/color][color=#00bb00]$m[/color][color=#077000][[/color][color=#00bb00]1[/color][color=#077000]])));        
}[/color]
function [color=#00bb00]c[/color][color=#077000]([/color][color=#00bb00]$str[/color][color=#077000])
{
    return [/color][color=#00bb00]preg_replace_callback[/color][color=#077000]([/color][color=#dd0000]‘/&#([0-9]+);/’[/color][color=#077000], [/color][color=#dd0000]‘cp’[/color][color=#077000], [/color][color=#00bb00]$str[/color][color=#077000]);
}[/color]
if (isset([color=#00bb00]$_GET[/color][color=#077000][[/color][color=#dd0000]‘fileName’[/color][color=#077000]]))
{
    [/color][color=#00bb00]$fileName [/color][color=#077000]= [/color][color=#00bb00]$_GET[/color][color=#077000][[/color][color=#dd0000]‘fileName’[/color][color=#077000]];
}
else if(isset([/color][color=#00bb00]$argv[/color][color=#077000][[/color][color=#00bb00]1[/color][color=#077000]]))
{
    [/color][color=#00bb00]$fileName [/color][color=#077000]= [/color][color=#00bb00]$argv[/color][color=#077000][[/color][color=#00bb00]1[/color][color=#077000]];
}
else
{
    echo [/color][color=#dd0000]"Usage: In the command line: php scriptName fileName or on the web http://foobar/scriptName.php?fileName=foobar"[/color][color=#077000];
}[/color]
if (isset([color=#00bb00]$_GET[/color][color=#077000][[/color][color=#dd0000]‘output’[/color][color=#077000]]))
{
    [/color][color=#00bb00]$output [/color][color=#077000]= [/color][color=#00bb00]$_GET[/color][color=#077000][[/color][color=#dd0000]‘output’[/color][color=#077000]];
}
elseif(isset([/color][color=#00bb00]$argv[/color][color=#077000][[/color][color=#00bb00]2[/color][color=#077000]]))
{
    [/color][color=#00bb00]$output [/color][color=#077000]= [/color][color=#00bb00]$argv[/color][color=#077000][[/color][color=#00bb00]2[/color][color=#077000]];
}
else
{
    [/color][color=#00bb00]$p [/color][color=#077000]= [/color][color=#00bb00]pathinfo[/color][color=#077000]([/color][color=#00bb00]$fileName[/color][color=#077000]);
    [/color][color=#00bb00]$output [/color][color=#077000]= [/color][color=#00bb00]$p[/color][color=#077000][[/color][color=#dd0000]‘basename’[/color][color=#077000]];
}[/color]
[color=#00bb00]$file [/color][color=#077000]= [/color][color=#00bb00]file_get_contents[/color][color=#077000]([/color][color=#00bb00]$fileName[/color][color=#077000]);
[/color][color=#00bb00]$file [/color][color=#077000]= [/color][color=#00bb00]c[/color][color=#077000]([/color][color=#00bb00]$file[/color][color=#077000]);
[/color][color=#00bb00]file_put_contents[/color][color=#077000]([/color][color=#00bb00]$output[/color][color=#077000], [/color][color=#00bb00]$file[/color][color=#077000]);[/color]

这个脚本可以工作在 web 和 cli 两种模式下。大家直接看一下代码了解一下使用方法吧。比较简单的。
用处理过的 hhp 和 hhc 文件重新编译,则可以得到编码正确的中文 chm 帮助。

2007-7-17 18:55 Haohappy
Good!:lol

页: [1]


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.