「内容何以为王」系列之:那些无法上网的文档

标签: News | 发表时间:2011-06-11 17:40 | 作者:Lawrence Li Leo
出处:http://apple4.us

两年前乔·克拉克(Joe Clark)发表在 A List Apart 的文章。原文在此。──编者

关于万维网(web)的起源有着流传甚广但不符合事实的说法。人们说添姆·伯纳斯李发明 HTML 是为了发表物理论文。真是这样吗?这无所谓,反正这个传说至今还起着作用。你尽可以开发一个又一个的线上软件(web app),但万维网主要还是一个用来发表文档的地方。

网上一直有各种各样的「数字化」计划,把各种各样的古旧内容数字化:专利申请文件、书、相片、所有一切。除了相片大概可以以 JPEG 或 TIFF 格式很好地存活下去(残障人士能否访问的问题暂且不提),以上古旧内容大都需要进行「语义标注」才能让电脑读懂。作家面对一张白纸时有着彻底的作为作者的自由,但这种自由在面对 HTML 悲剧的语义能力时很可能会尸骨无存。将文档数字化的迷狂──真的是一种迷狂──迎头撞上了 HTML 的语义标签。

某些文档是无法用 HTML 发表的。在很多情况下,我们应该直接放弃这种尝试。还有一些情况则需要彻底改变文档的样式与结构。理想的状态是大家从现在开始使用定制的 XML 文档类型,或许 XML 最终能成为一种可行的格式。

剧本的问题

把打印出来的文档转移到网上是个难题。电影剧本就是个好例子,这在某些圈子里已经成为传奇了。

想写剧本的人很多,大部分人的下场是一样的:找不到人帮她们把剧本拍成电影,更没人发行。而她们无一例外都要学习那种流传了几个世代的剧本写作「风格」。

《虎胆龙威 2》剧本的一页

《虎胆龙威 2》剧本的一页

剧本的格式源于打字机时代,它的设计是为了让一页纸(在美国被称为「美国信纸尺寸」)的长度刚好约等于一分钟的电影。大部分商业电影是两个小时,所以一份典型的好莱坞剧本的长度会在 118 到 122 页。

剧本的字体排印很糟;旧式打字机上老掉牙的字体被映射为今天我们看到的扁长的 Courier。但从工程师的角度看,电影剧本作为文档是非常出色的。

  • 剧本的文字缩进可以形成一门学科了。在剧本里,文字极少「居中」(好像从来没有过?);所有缩进都是以 tab 为单位──这是一个被 CSS 彻底铲除了的集体记忆。(在 CSS3 里可以用 ch 这一单位来设置左边界,但没人这么幹。)
  • 这些细致的缩进设置让人们能够轻松地速读一页剧本。全大写的单词有其语义上的意义,可以帮助我们扫视内容。CSS 为其赋予了「text-transform」这种机械化的名称,显然不合适。而现在人们又想将这种格式完整地转移到网页上。这是行不通的。
  • 网「页」只是一种比喻,它和上面说过的「跟电影时间对应的一页纸」这个单位没有关系。(这已经意味着剧本上的许多页眉和页脚必须消失了,因为网页其实只有一「页」。)
  • 没人会指望线上版的剧本能具备纸版的功能:发给人去读,被买下,最终拍成电影。这些都发生在纸的世界里,而不是 Firefox 里。
  • HTML 本质上是不可扩展的。虽然后来有了「可扩展的 HTML」(XHTML),但其实它也一直没有被扩展。于是以下众所周知的事实还是没法改变:HTML 的标签种类不足以应付剧本的语义需求。在剧本里,几乎所有东西都需要单独的标签。
    • 对话似乎问题不大,但对话中往往穿插着屏幕说明和对演员的指示。在 HTML 里,两者都会被标为段落(p),尽管它们的功能以及应该呈现的样式都很不同。
    • 各种各样的标题怎么办?对话人的名字、时间、语气(这些通常叫 slug 或 slugline)。HTML 里的标题标签「很多了」──一共有六个──但它们是按层级而非功能排列的。用类(class)来区分真的够了吗?「h2 class="slugline"」、「h2 class="charactername"」这样就可以了?不,不可以。剧本的标题和 HTML 的标题是两种东西。
  • 电影圈里的人本来就不需要 HTML,她们有可用的剧本格式。
    1. 其中之一是专有格式 Final Draft,它在剧本界的地位等同于 Word 在办公室中的地位。开源狂热分子会觉得这是个抨击专有格式的良机,但编剧可没空关心开源问题。不管怎么说,Final Draft 8 的默认文档格式已经是 XML 了。
    2. 另外一个选择是 PDF。电影圈不用关心文档能否让残障人士方便地访问的问题,因为就算没有增加这方面的功能的 PDF 作为剧本格式也足够了。你也不需要加了标签的 PDF,它的语义能力还是不足以应付剧本。(理论上你可以自己写 PDF 标签,反正那只是 XML 而已。)

    将剧本搬上网的壮举让我们想起其它的「类型错误」(Martin Amis 语)。我们逐渐发现电子商务并不是说要在网上建一个「商场」,让人们可以虚拟地「漫步其中」。「杂志」和「产品目录」并不是一页一页的供人们翻阅(而且还加了音效)、折角。「网站」的样子跟杂志排版并不相同,它没有多栏文字和加了箭头的图片说明文字。

    这一壮举让人想起早年的电视。传统智慧告诉我们,早期的电视节目看上去更像是用摄像机录制的舞台剧。把剧本搬到网上这件事的成果还远不如录下来的舞台剧。

    我们从中应该能学到点什么。

    必须承认,有人尝试过将网页做到跟打印版的剧本一模一样。这方面的明星是编剧+资深博客约翰·奥古司特(John August)。奥古司特写了一个叫 Scrippets 的插件,可以用在 WordPress、Blogger 等系统上,它已经最大限度地做到了「点石成金」。奥古司特设想了几种用例,其中之一是如何让读者通过 RSS 阅读器能看到完美的剧本格式。要做到这点,唯一的办法是使用包含样式的 HTML 和 inline 样式。自然,这些做法在前端开发里早已过时。

    奥古司特是这样描述 Scrippets 的:「Scrippets 可以让你在博客中以文字区块的形式加入『具有漂亮格式的剧本』。」这句话其实是对问题本身的描述,而不是解决方案。他试图继续依赖「页」这一比喻,试图复制打字机的字体效果,试图重现「一分钟一页」的版式,这些尝试都失败了。剧本格式对于纸张来说是「漂亮」的,对于网页则是错误的,哪怕只是「一小块一小块」的剧本内容。

    更糟的是,Scrippets 忽略了 HTML 语义对标记剧本的贡献(无论这贡献有多小)。所有元素都被标为段落,但它们并不都是段落。这比为 h2 标签加上一堆类名称更要不得。如此种种,都是试图在网页上标记剧本语义格式这一惨烈斗争中的例子。

    剧本的解决方案

    要把剧本搬上网,需要在样式上动手术。这不是没有先例的:由剧本改编的书已经拥有了一个健康的市场。事实上,「拍摄用剧本」在美国是一个商标(由 Newmarket Press 拥有),用来指根据电影剧本改编的一系列书籍。

    • 某些书只是把打字机打出来的剧本的幅面缩小了。你在读这种书的时候可能感觉自己很专业,但事实上你被欺骗了:你花了钱,但读到的只是作家在打字机上打出来的手稿。扁长的 Courier 字体缩小了之后更难看。
    • 另外一些书则是完全重新设计了打字机打出来的剧本,让它成为图书出版领域的「原生」(native)格式。通常的做法是把对话人的名字和她们说的话写在同一行,文字两边加上书籍里常见的边距,并大幅缩减垂直的白空间。打字机打出的剧本在它自己的语境里阅读是很舒服的,而剧本书在它自己的语境里阅读同样很舒服。(重新排过版的剧本有时也用来当作语言教学的辅助材料。)

    因此,如果我们要把剧本搬上网,你必须放弃「复制剧本格式」这一想法。你必须做出一套属于网页的设计。你要考虑到上面说过的几点:HTML 的语义标签不够丰富,网页并不是真正的「页」,或者说,一共只有一页。

    • 你可以用 HTML 的定义列表(dl)来标注对话。这在 W3C 的 HTML 里是明确允许的,但在 Ian Hickson 的 HTML5 里是明确禁止的。(那么在 HTML5 里就用 dialog 好了,虽然其实 dialog 的子标签 dtdd 同样也是 dl 的子标签。)
    • 你可以用 pre 标签去实现假的缩进和换行(但没法假装把整本剧本切分成页面)。
    • 你也可以无视缩进,乾脆直接用居中。
    • 你可以在一定程度上用表格来排剧本。
    • 你也可以不去想太多语义方面的事情。角色名字和对话加粗写在同一行,HTML 标题标签能用就用。

    其他搬上网时需要转换的印刷格式

    • 版权栏。这是指列明杂志和报纸里谁负责什么工作的那一栏。它的语义其实挺复杂的,因为每人的职位或是所在部门似乎都要用一个标题标签来标记。但如果你用 HTML 的 h1h6 来标记版权栏,就会「污染」到周围的内容。
    • 图示和边栏。这些结构对于杂志、报纸和非虚构类的书是常见的,但每当你想把它们纳入一个有效的文档树结构时就会出现严重问题。(你希望读者在整个标签流的什么位置开始读图示和边栏?)
    • 脚注。HTML 里没有包含脚注这一结构(带标签的 PDF 里有)。工程师们用了各种各样的歪招,包括用 JavaScript 来实现显示 / 隐藏的小挂件,以及各种乱七八糟的链接和反向链接。对于文学爱好者而言,HTML 没有脚注令到已故的大卫·福斯特·沃雷斯(David Foster Wallace)的作品基本无法在网上阅读(尤其是他的脚注中的脚注)。
    • 含有大量注释的图片(Charticle)。通常人们认为这起源于《Spy》杂志,它跟 Flickr 上那些充满注释的照片在功能上一样。但 HTML 也没有针对这种情况的标签。
    • 数学和科学内容。没错,又是老问题。别提 MathML,网上几乎没人实际在用它,因为写起来太难。物理学家雅克·迪斯勒(Jacques Distler)是极少数在网页上用 MathML 的人之一。

    怎么办?

    了解了上述情况之后,我们接下来会怎么做?我的预测是:什么都不会做。大家还会继续试图复制剧本格式,并用奥古司特那种水平的代码(在 HTML 里直接写样式)。但我们还是有些别的法子。

    剧本的例子不是独立的,用 XML 来标记文学作品一直很难,剧本只是其中一个变种。多年来人们一直在尝试,但目前为止几乎没有哪个 DTD 获得了认可。大家只想继续用 HTML 来标记所有东西。搞不清状况的作家更是把所有东西标记为段落,或 div

    有人说 HTML 是万维网上的通用语,大家可能太把这话当真了。HTML 源自 SGML,XHTML 是把 XML 这种旧酒装进了新瓶子。这里就已经有四种标记语言了,但人人都表现得好像只有 HTML 一种似的。(大部分情况下浏览器会把 XHTML 当成末尾加了斜杠的 HTML 对待。)连电子书都是用 HTML 标记的──EPUB 格式其实只是被包裹在容器里的 XHTML 1.1──但这让 EPUB 变得既是 HTML 又是 XML。既然这样可以接受,那么其他 XML 的变种也可以咯?

    浏览器无法显示格式正确的 XML 的时代早已过去。今天的浏览器们完全可以做到这点。各种各样的文学文档和文献在网上实现已经有了技术上的可行性。但由于它们沉寂了太久,如今似乎没人愿意去理会它们。毕竟不都说 HTML5 才是未来吗?就像过去我们都认为 XHTML2 是未来一样。

    结论

    万维网无疑是伟大的,但它的语言无法表达很多东西,包括一些人类已经在别处顺利表达的东西。我们应该接受这点:某些文档在搬上网时,格式必须重新设计──至少,如果你的目标是用 HTML 标记它们的话,就一定要重新设计。如果你想为网页文档赋予打印文档的语义丰富度,在今时今日,XML 已是可行的方案。

    (Translated with the permission of A List Apart Magazine and the author.)

    相关 [系列 上网 文档] 推荐:

    「内容何以为王」系列之:那些无法上网的文档

    - Leo - apple4us
    两年前乔·克拉克(Joe Clark)发表在 A List Apart 的文章. 关于万维网(web)的起源有着流传甚广但不符合事实的说法. 人们说添姆·伯纳斯李发明 HTML 是为了发表物理论文. 这无所谓,反正这个传说至今还起着作用. 你尽可以开发一个又一个的线上软件(web app),但万维网主要还是一个用来发表文档的地方.

    HTML5 & CSS3 研究文档

    - Kings - 幸福收藏夹
    已经说了好久,一直没把这个文件夹分享出来. 这是我去年第四季度里做的,里面有 11 一个文档. 包括 HTML5 中最主要的 JS API 文档,还有 CSS3 中两个比较难的属性. 主要还停留在纯 API 层面上的研究,没有深入到应用中去. 不过,当做工具来使用,和入门文档,还是不错的. 特别是其中的 HTML5 JS API 文档.

    Twitter API中文文档

    - Jacob - 月光博客
      目前的国内的微博客很多,不少微博客都提供Open API,然而,很多微博提供的API和Twitter的API有一些或多或少的差别,调用格式上并不完全相同.   我建议所有提供API的微博客系统,都将各自的API统一为Twitter的API调用格式,例如目前较有影响的开源微博系统StatusNet(Laconica)的API格式就完全兼容Twitter,这种统一API对于开发者和用户都有很大的好处.

    Underscore.js Version (1.2.3) 中文文档

    - - WEB前端开发
    Underscore 一个非常实用的JavaScript库,提供许多编程功能的支持,就像你期望 Prototype.js (或者 Ruby), 有这些功能且不扩展任何JavaScript的原生对象. 有函数式编程的风格,还支持链式调用. 主要涉及对Collection、Object、Array、Function的操作,还有一些实用方法.

    Redis集群明细文档

    - - CSDN博客架构设计推荐文章
      Redis目前版本是没有提供集群功能的,如果要实现多台Redis同时提供服务只能通过客户端自身去实现(Memchached也是客户端实现分布式). 目前根据文档已经看到Redis正在开发集群功能,其中一部分已经开发完成,但是具体什么时候可以用上,还不得而知. 文档来源: http://redis.io/topics/cluster-spec.

    Azkaban2官方配置文档

    - - CSDN博客云计算推荐文章
    最近工作实在是太忙了,我把之前翻译的官方的文档先放上来吧,希望对大家有所帮助~. 3、更容易设置job的依赖关系. 6、Kill和restart工作流. 8、日志和设计工作流和job. Azkaban2是相当容易搭建的,尽管它比azkaban要进行更多的插件组装. 在Azkaban2中有两个server和一个数据库需要搭建:.

    elasticsearch文档-字段的mapping

    - - 开源软件 - ITeye博客
    elasticsearch文档-字段的mapping. Mapping是指定义如何将document映射到搜索引擎的过程,比如一个字段是否可以查询以及如何分词等,一个索引可以存储含有不同"mapping types"的documents,ES允许每个mapping type关联多个mapping定义.

    elasticsearch 文档 - 轩脉刃

    - - 博客园_首页
    elasticsearch 文档. 索引中最基本的单元叫做文档 document. "content": "汽车常见故障的解决办法有哪些. } 文档中下划线开头的是es自带的字段. _id 代表文档id,如果插入文档的时候没有设置id的话,那么es会自动生成一个唯一id. _score 这个不是文档自带的,而是进行搜索的时候返回的,代表这个文档和搜索的相关匹配分值.

    [原]Lucene系列-facet

    - - 文武天下
    facet:面、切面、方面. 个人理解就是维度,在满足query的前提下,观察结果在各维度上的分布(一个维度下各子类的数目). 如jd上搜“手机”,得到4009个商品. 其中品牌、网络、价格就是商品的维度(facet),点击某个品牌或者网络,获取更细分的结果. 点击品牌小米,获得小米手机的结果,显示27个.

    [原]Lucene系列-FieldCache

    - - 文武天下
    域缓存,加载所有文档中某个特定域的值到内存,便于随机存取该域值. 当用户需要访问各文档中某个域的值时,IndexSearcher.doc(docId)获得Document的所有域值,但访问速度比较慢,而且只能获得Stored域的值. FieldCache能获得域值数组,根据docId random access域值.