Antora扩展

Antora提供了一个基于事件的扩展功能,您可以利用它来增强或影响生成器的功能。这个扩展功能旨在为所有经验水平的用户提供服务。本页提供了扩展功能如何工作的高级摘要,并向您介绍了创建或使用扩展所需了解的概念和术语。后续页面将引导您逐步创建您的第一个扩展。

生成器事件

如《Antora工作原理》中所述,Antora的站点生成器是一系列离散的功能步骤,逐步工作以生成静态站点。这些步骤的流水线从读取playbook和收集源材料开始。它以将HTML文件和Web资产发布到输出目标结束。Antora的扩展功能由Antora的站点生成器实现,提供了一种将自定义代码挂接到生成器构建过程中的方法。

Antora的扩展功能是事件驱动的,意味着它通过发出事件来工作。事件被发出(也称为触发),以通知扩展代码(即事件监听器)在站点生成过程中发生的有趣转换(即Antora的执行)。具体来说,一旦生成器中的每个离散步骤完成,并且在其他关键转换点,Antora会发出一个命名事件(例如contentAggregated)。

事件由称为监听器的函数处理,这些函数必须向该事件注册。为了将您的代码挂接到Antora的操作中,您注册监听器以监听其中一个或多个这些事件。这些监听器在扩展的register函数中定义。

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

简而言之,Antora扩展注册监听器以响应站点生成时发出的转换事件。后续页面将详细介绍如何设置监听器,这些监听器可以观察哪些事件以及如何访问上下文变量。

生成器上下文

Antora中的扩展功能基于Node.js中的EventEmitter。Antora使用一个称为GeneratorContext的事件系统抽象,它为这种用例调整了EventEmitter。

当生成器启动时,它会创建一个GeneratorContext的实例,称为生成器上下文。然后将此对象绑定到每个扩展及其事件监听器。生成器上下文负责跟踪事件监听器,存储生成器函数,管理随生成器流动的上下文变量,通知事件的监听器,并提供帮助器以使编写扩展更容易。它实际上是生成器执行的上下文。

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

什么是事件监听器?

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

监听器可以修改生成器中的作用域变量的状态,添加新变量或替换现有变量。大多数情况下,监听器会向一个或多个目录添加额外的文件以进行处理或发布。

同一事件的监听器按顺序调用,以防止它们相互干扰。

什么是生成器函数?

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

什么是上下文变量?

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

上下文变量提供对流经生成器的作用域对象的访问。这些变量存储在生成器上下文中,因此称为上下文变量。

监听器可以从生成器上下文中选择任何这些变量并与它们一起工作。事实上,监听器可以读取生成器本身可以读取的相同变量。只要这些变量没有被锁定,监听器还可以将新变量或替换变量推送到上下文中。

扩展能做什么?

为了让您了解您可以编写的扩展类型和可能性,这里简要介绍了扩展可以做的影响生成器操作的事项:

  • 修改配置(即playbook)

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

  • 将新变量推送到上下文中

  • 替换或代理上下文变量

  • 替换或代理生成器函数

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

  • 引发自定义事件

  • 记录消息

  • 需要用户代码

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

  • 发布新文件

  • 取消发布文件

  • 停止处理

总的来说,扩展会连接到生成器并调整其行为,而不是完全替换它。这种方法存在一些限制,但这是为了提供一种广泛可访问的东西。

扩展不能做什么?

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

扩展最激烈的操作是提前停止处理。如果扩展的工作完成且不需要进行其他处理,则此操作非常有用。例如,扩展可能只需要报告站点中的内容,这样它就可以在发布步骤之前停止生成器。