说说 Prince

Prince 的运行

其实在 ALAPrinting a Book with CSS: Boom! 这篇文章出现的时候就想写篇文章说说这个东西了,拖到现在实在有点不好意思。

简单的说,Prince (可能这个网站在国内被封禁了) 是这么个工具,你可以在用简单的 (X)HTML 和 CSS 来描述自己的文档之后,把它转换成适合打印的 PDF。

乍看起来,Prince 是一个近乎完美的工具,优秀的 CSS 支持——它甚至已经 Pass 了 Acid 2,支持透明 PNG,能够自动探测并支持 HTML 和 XML 格式,对 CSS 3 Page Media 的创新性实现,Prince 对非营利的学术使用是免费的……等等。CSS 的创始者,Bert Bos 和 Håkon Wium Lie 已经用这种方式完成了一本书。

那是不是它就没有缺陷了呢?正相反,缺陷也同样明显——对基本的印刷排版的支持还是太少,毕竟 CSS 相比书面排版,已经是一个简化而又简化的模型了,最大的问题是缺乏自动断字 (hyphening),如果不能断字,左右对齐 (justify) 的文本中每个单词之间就会有过大的间隙,这是印刷排版中最致命的地方。(顺便说说,TeX 中最有趣的一个算法就是创新的断行算法,当时为了看这个算法专门复印了 70 来页的论文,555..)

此外还有边界出血、色彩使用等许多问题,导致 ALA 上这篇文章的评论中纷纷表示“Not the right tool”。但作者的看法也有其道理:你可以创建这样的书,在支持绝大多数浏览器阅读的情况下,还有能力转换成 PDF 供纸上阅读,不是很方便的吗?对于不愿意深入了解 LaTeX 或其他专业排版工具的 CSS 专家们来说,这也是很趁手的工具,就像大家喜欢使用 S5 这样的幻灯片制作工具而宁愿放弃 PowerPoint 这样的专门工具一样。

总结起来,Prince 是两位 CSS 创始人作的非常有趣的尝试,它在易用性上已经远远超过 DocBook – XSL-FO – FOP 这种传统的由 XML 生成 PDF 的过程,虽然现在还不能和 TeX 的效果相比,假以时日,排版的效果必会更加出色。

Why WP dot COM?

wordpress.com 的邀请一度被炒得很热,因为当时只有几个开发者拥有帐号和邀请权,物以稀为贵,这东西居然也能在 ebay 上拍卖了。自从 9 月 11 号以后,wp.com 开始自动发送邀请信,尽管仍然限制了邀请的人数,但使用者也渐渐多了起来,用的人多了,就会有意见,所以现在有捧的,也有骂的

我也试着用了一会儿,觉得现在还没到值得向朋友推荐的地步,主要是因为以下的原因:

1. 现在用的是 WordPress 1.6 的 preview 版本,bug 还很多,其实现在有限的邀请,主要就是请你帮忙找 bug 的。我只用了大概 15 分钟,就发现了四五个 bug,都是不能忍级别的。(这从侧面说明 1.6 的发布恐怕还要等很长时间)
2. 已经有国人在上面发表一些危险的言论 (这些言论是否合理合法不是我要讨论的话题) 了,难保不会被 Great Firewall 封掉。
3. 相比纯中文的环境,wp.com 没有一个群体 blog 的合适氛围,对中国人来说,反正我觉得很不习惯。
4. WP 本身不采用模版系统,theme 都是直接用 PHP 写的,这么做造成的直接原因是这种多用户的版本绝对不会允许你自己编辑 theme,只能用官方指定的几个。
5. plugin 当然也不见了,没有了 Markdown,要忍受 bug 多多的 WYSIWYG 编辑器真是痛苦啊。

总结起来就是,wp.com 尚未成形,真的希望在上面写 blog 的朋友不妨再等等,想拿个 invitation 炫耀的家伙最好也给人家报告报告 bug,说实话,blog 要恁多作甚?有一个踏踏实实写的就好了。

Wrong Encoding? Whose Fault

早在 2004 年,Tim Bray, Nick BradburyMark Pilgrim 这几位大牛就有过一场著名的口水战,围绕着客户端是否应该接受不 valid 的 XML (XHTML) 而展开,这场口水战以 Mark Pilgrim 的一篇堪称经典的 Thought Experiment 而告结束。Mark 举的一个例子就是页面本来是完全 valid 的,但别人发来了一个 trackback,其中包含了非法的字符,导致整个页面都无法通过校验。

时至今日,一年半过去了,乱码的 trackback 仍然随处可见,我们的 blog 工具版本号一升再升,难道就是解决不了这个问题?

### 为什么要解决这个问题?

有人会问,为什么要解决这种问题呢?人人都用 UTF-8 不就好了么?没错,在一个理想的世界里,UTF-8 解决了一切问题。问题在于,在一个理想的世界里,M$ 不是坏蛋,IE 还支持 CSS 3 呢!所以我们不能依靠这种白日梦。踏实一点来看,我们现在生活的世界情况是这样的:Apache 占据了大部分的市场,PHP 和 Perl 是两种主要的 Web 脚本语言——尤其对 Blog 而言,MySQL 是大部分开源 Web 程序使用的数据库,可是主机服务上还往往不如人意,大部分的用户不能自如的指定自己 Blog 使用的字符编码,转换 MySQL 存储数据的编码也不是天天没事就能转来转去玩儿的。

这个环境,说明我们应该对他人的页面使用的编码宽容一些。

### 这个问题理应如何解决

Trackback 不是一个标准,更没有标准化组织进行维护,它只是 MovableType 中发明的一种格式,最权威的说明,就是这篇 TrackBack Technical Specification。而这个规范中对编码唯一的说明是:

The client SHOULD include the character encoding of the content being sent (title, excerpt, and weblog name) in the charset attribute of the Content-Type header.

例如:

POST http://www.example.com/trackback/5
Content-Type: application/x-www-form-urlencoded; charset=utf-8

但接收这个 trackback 的那一方如何获取这个 charset 的值呢?如果在 PHP 中,唯一的方法是用 `getallheaders()` 函数,但这是在“PHP 作为 Apache 模块安装时才可使用”——事实上许多主机提供商是以 CGI 方式安装 PHP 的。

所以此路不通,我们应该对 Trackback 的协议进行扩展,在 POST 的数据中添加关于字符编码的一项,WordPress 就是以这种方式来实现的,让我们先打开 wp-trackback.php,这是接收 trackback 用的:

$charset = $_POST[‘charset’];

if ($charset)
$charset = strtoupper( trim($charset) );
else
$charset = ‘ASCII, UTF-8, ISO-8859-1, JIS, EUC-JP, SJIS’;

if ( function_exists(‘mb_convert_encoding’) ) {
$title = mb_convert_encoding($title,
get_settings(‘blog_charset’), $charset);

上面的代码说明,WP 会从 POST 数据的 `charset` 一列中取得 trackback 发送者使用的字符编码,如果找不到就使用一套预设的编码 (从这个预设的编码我们可以肯定,90% 的可能是有个日本人给 WordPress 官方报告了 trackback 错误的问题,所以它们头痛医头,只加上了三个日文编码),然后使用 mb_convert_encoding 函数把这个编码转换为 blog 当前使用的编码。

让我们注意三点:

1. 每个 PHP 安装不一定都启用了 mbstring 模块,也就是说,不一定能进行这个转换,例如,我自己的电脑上安装的 PHP 5,默认就没有打开这个模块。
2. 当给出一列来源编码时,转换函数以一种猜测的方式来尝试转换 (我在 Planet 的 patch 中描述了这种转换的原理),但这种猜测未必是对的,例如,Big-5 的编码和 GB2312 的编码有部分是重合的,此时无论把 Big-5 列在前还是 GB2312 列在前,都无法同时正确解码这两种编码的文档。
3. 我们有理由相信这是 WP 私自作出的扩展,MT 不知道这一点 (我手头没有 MT 的代码,使用 MT 的朋友若有兴趣,请帮忙查查)。

### WP 糟糕在哪里和我们如何改进

WP 的问题是,它使用 POST 数据中的 charset 一栏来分辨编码,但它自己发送的 trackback 中,不包含这一栏 (`trackback()` 函数在 `wp-includes/functions.php` 中),我必须承认我搞不懂这是为什么。

有了上面的解释,我们很容易提出下列的改进:

1. 提出更改 Trackback 的规范,增加 charset 这一项。
2. 建议 WP 和 MT 都在发送 Trackback 时,包含这一项。
3. 建议 WP 和 MT 在发送 Trackback 时,先转换成 UTF-8 再发送。

Recent Stuffs

下面是最近关注的东东:

* A List Apart 重构!原来的域名要等 DNS 生效以后才会启用,现在可以用 TextDrive 的地址访问
* Wikiwyg,wiki 上方便的所见即所得编辑器,看这个 demo
* Cairo 的 Win32 开发包,你可能需要一些 GTK+ Win32 的GnuWin32 提供的库才能编译。(用到的库包括: fontconfig, freetype, libpng, expat 等)。
* WordPress.COM 能做什么?这个只有一个 Invitation 的东西……