Antora 扩展

Antora 提供基于事件的扩展工具,您可以利用它来增强或影响生成器的功能。该扩展工具专为各种经验水平的用户设计。本页简要介绍了扩展工具的工作原理,并介绍了创建或使用扩展所需的概念和术语。随后的页面将引导您创建第一个扩展。

生成器事件

正如在 ROOT:how-antora-works.adoc 中所述,Antora 的网站生成器是一连串离散的功能性步骤,逐步生成静态网站。这一系列步骤从阅读 playbook 和收集源材料开始。最后将 HTML 文件和网络资产发布到输出目的地。Antora 的扩展工具由 Antora 网站生成器实现,它提供了一种将自定义代码连接到生成器构建过程的方法。

Antora 的扩展工具是事件驱动型的,这意味着它通过发出事件来工作。生成器中的每个离散步骤完成后,以及在其他关键转换点,Antora 会发出一个命名事件(如 contentAggregated)。事件由称为 "监听器" 的函数处理,监听器必须与事件一起注册。为了将您的代码与 Antora 的运行挂钩,您可以注册监听一个或多个事件的扩展。这些监听器在扩展的注册函数中定义。

事件的监听器可以是同步的,也可以是异步的,但都是按顺序同步调用的。事件监听器返回的任何值都将被忽略。事件的所有监听器运行完毕后,生成器将进入下一步。

简而言之,Antora 扩展注册监听器,以响应网站生成器引发的过渡事件。随后的页面将详细介绍如何设置侦听器、侦听器可以侦听哪些事件以及如何访问上下文变量。

生成器上下文

Antora 中的扩展设施松散地基于 Node.js 中的 EventEmitter。Antora 在此事件系统上使用了一个名为 GeneratorContext 的抽象概念,它针对此用例调整了 EventEmitter。

当生成器启动时,它会创建一个 GeneratorContext 的实例,称为 生成器上下文。然后,该对象会与每个扩展及其事件监听器绑定。生成器上下文负责跟踪事件侦听器、存储生成器函数、管理流经生成器的上下文变量、通知事件侦听器,并提供帮助程序,使编写扩展程序变得更容易。从字面上看,它就是生成器的执行上下文。

大多数情况下,你会与生成器上下文提供的 on 方法交互,将事件监听器绑定到事件上。您还可以使用生成器上下文提供自定义生成器函数。

什么是事件监听器?

事件监听器 是一个回调函数,在事件发生时被调用(即被通知)。这种回调机制提供了一种在生成器的任意两个离散步骤之间插入代码的方法。Antora 会等待事件监听器运行完成(即使是异步的)后再继续。

监听器可以修改生成器中范围内变量的状态、添加新变量或替换现有变量。更多的时候,监听器会向一个或多个目录中添加额外的文件,以供处理或发布。

同一事件的监听器会依次被调用,以防止相互干扰。

什么是生成器函数?

生成器函数是生成器执行的预定义离散步骤。虽然大多数扩展会监听生成器事件,但扩展也可以替换一个或多个生成器函数。当您想改变 Antora 的内置行为(例如导航的构建方式)时,就可以使用这种功能。与事件监听器一样,生成器函数也是在生成器上下文中配置的。要将自己的生成器函数与 Antora 的操作挂钩,您需要注册一个扩展,将这些函数分配给生成器上下文。

什么是上下文变量?

如果扩展无法访问生成器正在处理的任何配置、内容或其他数据,那么它就没有什么用处。这就是上下文变量的作用所在。

通过 上下文变量,可以访问在生成器中流动的范围内对象。这些变量存储在生成器上下文中,因此称为上下文变量。

监听器可以从生成器上下文中选取任何一个变量,并对其进行处理。事实上,监听器可以读取与生成器本身相同的变量。监听器还可以向上下文推送新变量或替换变量,只要这些变量没有被锁定。

扩展可以做什么?

为了让您了解可以编写的扩展类型以及可能的扩展,下面将向您介绍扩展可以做哪些事情来影响生成器的运行:

  • 修改配置(即,playbook)

  • 更改上下文变量的状态,例如向目录中添加新文件

  • 向上下文推送新变量

  • 替换或代理上下文变量

  • 替换或代理生成器函数

  • 引入新步骤(在监听器或自定义生成器函数中)

  • 引发自定义事件

  • 记录信息

  • require 用户代码

  • 后处理内容,如替换 HTML 文件中的字符串

  • 发布新文件

  • 取消发布文件

  • 停止处理

一般来说,扩展会利用生成器并调整其行为,而不是对其进行全面替换。这种方法有一定的局限性,但这也是提供可广泛访问的东西的一种权衡。

扩展不可以做什么?

扩展不能改变生成器执行步骤(即生成器函数)的顺序。扩展也不能使生成器跳过步骤。不过,扩展可以用空函数或自定义函数替换现有步骤。

扩展程序可以做的最激烈的事情就是提前停止处理。如果扩展的工作已完成并且不需要额外的处理,则此操作非常有用。例如,扩展程序可能只需要报告站点中的内容,在这种情况下,它可以在发布步骤之前停止生成器。