使用 webgen 构建网站
在我关于 Geek Ranch 网站 的文章中,我推荐了三个用于构建该网站的工具:Drupal、Joomla 和 Karrigell。 好吧,像往常一样,我只需要说“我将在 X、Y 和 Z 之间选择”,好的旧选项 W 就会出现。 这次,它的名字是 webgen。
在写完上一篇文章后,我开始绘制网站所需页面的地图。 它们将分为几组:例如,所有关于餐厅的页面。 动态的部分不会超出天气信息和首页的网络摄像头图像。
因此,真正重要的是
- 有一种方法可以包含在其他地方生成的内容。
- 单个模板(或可能带有一些变体)可以定义网站的外观,并且与内容足够独立,可以替换它而无需重新创建内容。
- 有一种简单的方法可以输入内容,这大致意味着不必教多人什么是网站可接受的 HTML。 或者,更好的是,根本不必知道 HTML。
- 随着新页面的添加,更新菜单很容易。
- 有一种很好的方法来支持多语言内容。
旧的 UNIX 哲学,即使用最轻便的工具来完成工作,在这里发挥了作用。 过去在 Usenet 的各种 UNIX 新闻组中经常发生“如何做”的争论,有人会问如何做某事。 答案往往从“编写 C 程序”等重型工具到“使用 awk”再到“这是一个 3 行 shell 脚本”。
使用 Drupal 或 Joomla 等 CMS 可以满足所有要求。 例如,由于内容存储在数据库中,因此保证与演示文稿分离。 但是,CMS 的设计目的是做更多的事情,其中最重要的是动态信息的呈现。 当然,由于动态站点意味着更多的服务器负载,因此添加缓存系统以提高效率。 等等。
我考虑 Karrigell 的主要原因之一是它非常轻量级,并且能够直接提供静态页面。 因此,对于主要由静态站点组成的站点,服务器负载最小。 可以在需要时添加一些 Python 代码来完成花哨的事情。 显然,它是可以很好地完成工作的更轻量级的工具。
进入 webgen
当我在寻找开源模板开始使用时,我有点倒退地偶然发现了 webgen。 关于它的简短介绍可以是“webgen 是一个用 Ruby 编写的程序,它从一些定义构建静态网站”。 它由奥地利的 Thomas Leitner 编写。
虽然这最初听起来不像我需要的,但我“了解一切”的需求让我开始阅读。 事实证明,我刚才说的只是一个非常简单的定义。 实际上,它似乎非常适合我想做的事情。 让我解释一下原因。
首先,从关于页面开始,这是对 webgen 功能的更长但更好的定义。
当 webgen 运行时,它将模板与每个页面文件结合起来并生成 HTML 输出文件。 在此过程中,特殊标签会被替换,例如,生成菜单。 实际上,这个网站是用 webgen 生成的,例如,您可以看到的菜单是动态创建的。
实际上,这意味着您将一堆文件放在一个目录中,这些文件定义了您的网站,输入webgen然后神奇地生成您的整个站点。 唯一涉及的技巧是定义文件需要位于名为 src 的子目录中,而网站(HTML 等)出现在名为 output 的子目录中。 您可以将浏览器指向输出目录,看看您有什么。
真的这么简单吗? 是的,完全具备一些默认情况下创建菜单等的神奇功能。 此外,您不必从头开始。 使用带有适当选项的 webgen 命令,您可以创建默认模板文件、一些默认页面定义文件,甚至可以从各种页面外观中进行选择。
这听起来可能有点太神奇了。 也就是说,您将在五分钟内生成一个基本站点,并认为您的工作已完成。 好吧,您确实生成了一个站点,但您现在需要学习一些东西才能充分利用 webgen。 没什么困难的,但是在五分钟内获得了这么多之后,您可能会对需要做更多的事情才能达到下一个级别感到失望。
在我深入探讨您接下来必须处理的具体部分之前,让我说一下,一旦您有了基本站点——也就是说,页面设计和至少一些页面完成——添加或修改页面、移动页面甚至更改通用外观将非常容易。 虽然许多人会寻找基于 GUI 的工具来生成他们的站点,但如果您对使用文本编辑器感到满意,我认为您会发现 webgen 是启动和运行一个美观的静态站点的最简单方法。
详细信息
起初,唯一使它有点复杂的是 webgen 为您做了一些您需要或最终会手动完成的事情。 因此,复杂的部分只是理解它是如何施展魔法的。
从最少的魔法开始,让我们看一下模板文件。 它看起来就像普通的 HTML,其中包含一些特殊标签。 例如,要在生成的页面中包含标题名称(您在每个页面文件中指定),您可以引用{title:}在模板中。 要包含页面垂直菜单,您可以包含{menu: vertical}.
除此之外,模板看起来像普通的 HTML,但还有更多的魔法。 来自您的页面内容文件的内容块被插入到模板中,其中{block: }出现。 可以按名称标识多个块——例如,标签{block: extras}将被标记为 extras 名称的块的内容替换。 您可以使用 erb 行控制选择性包含。 例如,以下是如何有选择地包含名为 extras 的块的内容。
<% if node.node_info[:pagedata].blocks.has_key?( 'extras' ) %> {block: extras} <% end %>
页面内容在文本文件中指定。 它有一个可选部分用于元数据(标题是一条元数据,另一条是页面是否应包含在自动菜单生成中),后跟一个或多个内容部分以进入生成的页面。
您不必用 HTML 编写这些文件的内容部分,您可以选择 markdown 或 textile。 两者都旨在让您摆脱 HTML 繁重的工作。 内容会自动转换为 HTML。
除了块包含之外,webgen 还提供其他标签,这些标签修改了从模板和页面描述文件创建静态页面的过程。 它们包括能够构建菜单、面包屑导航、插入当前时间戳、执行命令、包含文件、添加语言选择栏、包含资源(插入其路径或其包含的内容)以及更多内容,包括站点地图。 这些标签在构建时解释——换句话说,当您运行 webgen 从模板创建静态文件时。
处理多种语言是标签强大功能的一个很好的例子。 有一个名为langbar的标签。 它有三个参数。 您可以指定 HTML 显示中语言选择的分隔符、当前语言是否应包含在列表中,以及即使当前语言是唯一可用的语言,是否应显示该栏。
使用它很简单。 您只需放置{langbar:}(如果您不想要默认选项,即分隔符为|和两个布尔值为 true)在模板文件中。 然后,该栏将在每个生成的 HTML 文件中显示当前页面的选项。
选项从哪里来? 文件名。 例如,如果您有 index.page、index.fr.page 和 index.es.page 作为三个页面模板,webgen 将它们视为索引页面的三个版本:第一个使用您的默认语言(开始时为英语,但您可以设置它),另外两个使用法语和西班牙语。 当您运行 webgen 创建 HTML 页面时,将创建三个索引页面:index.html、index.fr.html 和 index.es.html。 它们基于三个 index.*.page 文件,但模板中的 langbar: 标签会导致正确的栏放置在每个文件中。 默认情况下,它们是相同的,只是当前语言以不同于可用其他选项的颜色显示。 此外,如果链接以相同的语言提供,它们将指向相同语言的其他页面。
这是标签魔力的最佳示例之一。 如果您的站点是真正的静态站点,webgen 可以准确地完成没有它您会做的繁重工作。 请注意,标签由所谓的插件处理。 因此,您可以定义新标签,然后将插件添加到 webgen 以处理它们。 基础知识已经存在,但这使得在您有需要完成的特殊事情时很容易扩展 webgen。
也许您的网站需要图像。 好吧,webgen 还包括图像库。 就像其他功能一样,您只需将图像放在那里,设置模板文件并运行 webgen。 它生成画廊,包括自动生成缩略图。
有缺点吗? 我发现的唯一缺点是错误消息不太具有描述性。 例如,当我在使用图像库时,我收到来自 webgen 的消息,只是说“无法解析 plants.gallery”。 该文件在我看来还可以。 我写信给作者,他指出了一个缺失的冒号。 更重要的是,他认识到无用的错误消息并计划更改它。 例如,仅添加问题发生的行号就会非常有效。
Ruby 怎么样? 我并不特别害怕 Ruby,如果不是因为在 Python 中投入了大量时间,我可能会选择 Ruby 作为我最喜欢的语言。 也就是说,系统是用 Ruby 编写的事实并不重要。 您只是 webgen 程序的User。 除了一种情况外,它所做的事情是语言无关的。 唯一的例外是您有两种创建动态内容的方法。 有一个 webgen 特有的标签功能,或者您可以用 erb(嵌入式 Ruby)编写代码。 无论您使用什么工具,您都需要以某种语言处理动态内容,这里唯一的真正区别是您有两种选择,其中一种看起来像 Ruby。
结论
Geek Ranch 站点尚未完成,但我现在确信我已经找到了合适的工具。 webgen 完成了站点所需的一切,并且很容易完成。 一些表单需要编写,但简而言之,webgen 不会妨碍。 表单只不过是要放在页面上的内容。 网络摄像头和天气信息来自异步源。 它可以只使用 webgen 资源标记包含在内。
就创建内容而言,textile 或 markdown 的选择意味着几乎没有魔法。 例如,可以使用菜单模板页面(只是普通文本)创建新的餐厅菜单。 虽然可以实时编辑站点,但我将实现这一点,以便修改本地副本。 这意味着可以在将站点推送到 Web 服务器之前对其进行检查。
webgen 静态方法的另一个相关优点是站点是独立的。 例如,您可以使用 webgen 编写说明或培训手册,并将输出子目录的内容简单地复制到记忆棒或 CD。 在那里,您将拥有一个独立的副本,只需要一个 Web 浏览器即可访问。
webgen 适合您的站点吗? 如果您正在创建一个内容来自受控来源的站点——例如来自您组织内部的一个或多个人——那么值得您花时间看看。 演示文稿与内容的分离已经存在,您不需要数据库甚至 Web 服务器来试用它,并且可以很快变得高效。