重新链接多页 Web 文档

作者:Jim Weirich

编写一个基于 Web 的文档,有一种神奇的感觉,这是普通的线性文档所不具备的。将所有这些链接都设置正确并按正确的顺序排列,使 Web 文档变得生动起来。当然,将链接设置正确可能是一项艰巨的任务,尤其是在包含许多页面的文档中。当我着手编写我的第一个多页文档时,我发现了这一点。

我已经编写 HTML 几个月了,当时有机会在当地的互联网特殊兴趣小组(一个更大的 PC 用户小组的一部分)做一次演示。那时,我们中只有少数人“上网”,但许多人对互联网,更具体地说,对 Web 能为他们做什么感兴趣。我自愿就 HTML 的基础知识以及如何创建自己的网页发表演讲。

小组在当地大学的图书馆开会,我们有一个连接到房间里投影仪的实时互联网连接。我决定用 HTML 编写一个关于 HTML 的演示文稿会很棒。每个网页将是演示文稿中的一张幻灯片。页面之间的链接将使我能够在演讲进行时向前(和向后)移动。

所以我制作了大约 15 页幻灯片,并将它们链接起来,以便每个页面都有一个 next 链接到下一页,以及一个 prev 链接到上一页。我将这些链接放在每个页面的顶部和底部,因此每个页面上有四个链接(实际上,我也有指向目录的链接,但我们暂时忽略这些)。图 1 显示了连续页面的链接方式。

Relinking a Multi-Page Web Document

演讲进行得很顺利,但我看到了一些可以改进演讲的地方。当我开始向文档添加页面时,我做了一个非常重要的发现:插入页面非常麻烦。如果我想在现有页面 A 和 B 之间插入一个新页面,我必须更新页面 A 中的 NEXT 链接,更新页面 B 中的 PREV 链接,并更新新页面中的 NEXT 和 PREV 链接。而且因为我在页面的顶部和底部都有链接,所以需要更新的链接数量是原来的两倍。图 2 显示了修改后的链接。

Relinking a Multi-Page Web Document

自动化来救援

在手动更新页面中挣扎之后,我决定必须有一种更好的方法。relink Perl 脚本就是这种挫败感的产物。

使用 relink 很简单。首先,您需要一个文件(名为 links),其中包含要访问的页面顺序列表。在 links 文件中省略页面名称的“.html”部分,relink 假设文件以该扩展名结尾。

例如,考虑以下(非常简略的)我的原始 HTML 演示文稿版本。我从介绍 (intro.html) 开始,有一个关于锚点的页面 (anchor.html),最后以结论 (conclude.html) 结束。links 文件将包含

   # Pages for a simple presentation
   intro
   anchor
   conclude

每个 HTML 页面都包含一组指向其下一页和上一页的链接。例如,anchor.html 文件在页面的顶部和底部包含以下链接。

   <a href="conclude.html">
      <img src="icons/next.gif" alt="NEXT">
   </a>
   <a href="intro.html">
      <img src="icons/prev.gif" alt="PREV">
   </a>
在查看了我的简短文档后,我觉得我真的应该在深入研究锚点之前提及 URL 以及它们的工作原理。所以我写了一个名为 url.html 的新页面,并希望将其添加到我的文档中。我只需编辑 links 文件以包含
   # Pages for an updated, but still
   # simple presentation
   intro
   url
   anchor
   conclude
在使用新页面顺序运行 relink 后,锚点页面中的链接现在看起来像
   <a href="conclude.html">
      <img src="icons/next.gif" alt="NEXT">
   </a>
   <a href="url.html">
      <img src="icons/prev.gif" alt="PREV">
   </a>
请注意,上一个链接现在指向关于 URL 的页面,而不是介绍。其他页面中的链接以一致的方式更新,以支持新的页面顺序。只需编辑 links 文件并指定新的顺序,就可以添加、删除或简单地重新排列页面。
识别链接

relink 如何在网页中找到 HTML 链接?它通过查找包含超文本链接的行上的特定模式来实现。relink 将扫描 HTML 文件,查找模式 /href\s*=/i,该模式匹配字母 href,后跟零个或多个空格,后跟一个等号。模式末尾的 i 允许匹配时不考虑大小写。匹配此模式的行包含超文本链接,并且是更新的可能候选对象。

一旦找到包含链接的行,就会针对该行测试链接特定模式列表。如果找到匹配项,则使用从 links 文件获得的信息更新该超文本链接,并且扫描过程在文件的其余部分继续进行。为了使此过程有效,重要的是每个超文本链接都单独位于一行文本中。此外,必须选择链接特定模式,使其不会正常出现在文档正文中。如果链接特定模式意外地与文档正文中不相关的链接出现在同一行上,则 relink 将自动(且错误地)更新该不相关的链接。

我使用小的 GIF 文件作为下一个和上一个图标,因此链接特定模式 next.gifprev.gif 是我的页面的好选择(并且由于我编写了 relink,这些是默认值)。如果您的链接看起来明显不同,您可以在 links 中覆盖这些默认值。如果没有唯一模式来识别您的链接,您可以向链接行添加 HTML 注释,并将其用作模式。

LINKS 文件

我们在上面的讨论中已经看到了一些 links 文件的简单示例。除了页面顺序之外,您还可以使用以下行指定用户定义的链接模式

link: 链接名称 模式

链接名称 标识链接类型(next、prev、index 或您可以想到的任何内容)。模式 是一个字符字符串,必须出现在该类型的每个链接上。您可以覆盖 relink 通常使用的 nextprevtoc(目录)和 up 链接,并且您可以在此处定义自己的链接。

可以使用以下行标识目录文件

tocfile: 目录名称

使用 toc 链接模式标识的链接将生成指向此文件的链接。不幸的是,relink 不会使用新的页面顺序更新目录,因此您必须手动编辑目录以使其保持最新。也许未来版本的 relink 可以解决这个问题。

嵌套页面可以通过在单独一行上使用 { 来开始嵌套列表,并使用 } 来结束嵌套列表来指定。紧接在嵌套列表之前的页面称为父页面。嵌套列表的第一个和最后一个页面在其 prevnext 链接中指向父页面。此外,每个嵌套页面都将有一个指向父页面的 up 链接。父页面的 next 链接将跳过嵌套列表到下一页。(我们假设父页面有显式链接到嵌套列表。)

最后,可以通过使用短划线行来指定单独的 HTML 文件列表。next/prev 链接不会跨越短划线行。

总结

我发现 relink 是一个非常有用的脚本,用于处理 Web 文档,它可以非常轻松地更新长文档中的页面,而无需担心手动调整页面链接的细节。

Jim Weirich 是 Compuware 的软件顾问,专门从事 Unix 和 C++。当他不编写网页时,你可以发现他在弹吉他、陪孩子玩耍或玩 Linux。欢迎评论至 jweirich@one.net 或访问他的网站 http://w3.one.net/~jweirich/。

加载 Disqus 评论