更换生成器函数

Antora 的生成器是一系列步骤,其中每一步都由一个函数执行。这些函数被称为生成器函数。生成器函数还包括生成器函数可能执行的关键子步骤的函数,如 loadAsciiDoc。生成器从生成器上下文中获取这些函数。因此,这些生成器函数被设计为可替换的,为扩展 Antora 提供了更强大的方式。具体来说,扩展程序可以检索和替换这些函数。

替换扩展中的函数确实会增加代码在不同主要 Antora 版本之间被破坏的风险。

获取函数

与上下文变量一样,生成器上下文中也有生成器函数。可以通过调用 getFunctions 方法获取生成器函数。该方法会返回一个键值对对象,其中键是函数名称,值是函数对象。内置的生成器函数在 contentStarted 事件发生前不可用。

下面的示例展示了如何在扩展中检索 aggregateContent 函数,假设该函数与生成器内容绑定。

const { aggregateContent } = this.getFunctions()

您可能想要检索一个函数,以便对其进行包装。无论如何,有趣的部分会在替换函数时发生。

替换函数

可以通过向 replaceFunctions 方法传递函数来替换生成器函数。该方法接受与 getFunctions 方法相同的对象签名,其中键是函数名,值是函数对象。

您只需指定要替换的函数。对于未被扩展名替换的函数,生成器将返回到使用其自身的函数。

下面的示例展示了如何替换扩展中的 publishFiles 函数:

module.exports.register = function () {
  this.replaceFunctions({
    async publishFiles () {
      console.log('Not publishing today')
      return []
    }
  })
}

何时替换函数很重要。如果直接在 register 方法中替换函数,Antora 将无法要求和注册相应的内置函数。如果在 contextStarted 监听器函数中替换函数,该函数将替换已注册的相应内置函数。该事件为您提供了委托(即封装)内置函数的机会,如图所示:

module.exports.register = function () {
  this.on('contextStarted', () => {
    const delegate = this.getFunctions().publishFiles
    this.replaceFunctions({
      async publishFiles (playbook, catalogs) {
        console.log('It\'s publish time!')
        return delegate.call(this, playbook, catalogs)
      }
    })
  })
}

替换函数时,必须遵守函数的签名。与注册函数和事件监听器函数一样,生成器函数会自动绑定到生成器上下文。

函数参考

可以用扩展名替换的函数列表及其签名如下:

  • aggregateContent(playbook): Promise<Object>

  • buildNavigation(contentCatalog, siteAsciiDocConfig): NavigationCatalog

  • classifyContent(playbook, contentAggregate, siteAsciiDocConfig): ContentCatalog

  • convertDocument(file, contentCatalog, siteAsciiDocConfig): File

  • convertDocuments(contentCatalog, siteAsciiDocConfig): void

  • createPageComposer(playbook, contentCatalog, uiCatalog, env): Function

  • extractAsciiDocMetadata(doc): Object

  • loadAsciiDoc(file, contentCatalog, config): Document

  • loadUi(uiCatalog): Promise<UiCatalog>

  • mapSite(playbook, publishablePages): File[]

  • produceRedirects(playbook, contentCatalog): File[]

  • publishFiles(playbook, catalogs): Promise<Object[]>

  • resolveAsciiDocConfig(playbook): Object

要了解有关这些功能的更多信息,请查阅 Antora 源代码