注册扩展

目前可以使用以下扩展点:

预处理器(Pre processor)

在源代码行传递给解析器之前处理原始源码行。参见 预处理器示例

树处理器(Tree processor)

解析完成后处理 Asciidoctor.Document(AST)。参见 树处理器示例

后处理器(Post processor)

在文档转换后,但在写入磁盘之前处理输出。参见 后处理器示例

Docinfo Processor

向生成的文档的头部或底部区域添加额外内容。参见 Docinfo 处理器示例

块处理器(Block processor)

处理标记为自定义块样式的内容(即,[custom])。(类似于 AsciiDoc 过滤器)参见 块处理器示例

块宏处理器(Block macro processor)

注册一个自定义块宏并处理它(例如,gist::12345[])。参见 块宏处理器示例

内联宏处理器(Inline macro processor)

注册一个自定义内联宏并处理它(例如,[ Save ])。参见 内联宏处理器示例

包含处理器(Include processor)

处理 include::<filename>[] 指令。参见 包含处理器示例

注册一个或多个扩展

您可以按如下方式全局注册一个扩展:

const asciidoctor = require('asciidoctor')()
asciidoctor.Extensions.register(function () {
  this.block(function () {
    const self = this
    self.named('shout')
    self.onContext('paragraph')
    self.process(function (parent, reader) {
      const lines = reader.getLines().map(l => l.toUpperCase())
      return self.createBlock(parent, 'paragraph', lines)
    })
  })
})

const text = `[shout]\
\nSay it loud.\
\nSay it proud.`

const html = asciidoctor.convert(text)
console.log(html)

// <div class="paragraph">
// <p>SAY IT LOUD.
// SAY IT PROUD.</p>
// </div>

您可以注册每种类型的多个处理器,尽管每个自定义块或宏只能有一个处理器。每个已注册的类在创建 Asciidoctor.Document 时会被实例化。

目前没有用于处理内建块(如常规段落)的扩展点,预计这一功能会在未来的 Asciidoctor 版本中出现。

您还可以创建一个或多个注册表。这在您想要用不同的扩展启用转换同一文本时非常有用。

const asciidoctor = require('asciidoctor')()

const registryA = asciidoctor.Extensions.create()
const registryB = asciidoctor.Extensions.create()

registryA.block(function () {
  const self = this
  self.named('shout')
  self.onContext('paragraph')
  self.process(function (parent, reader) {
    // Transform text to uppercase
    const lines = reader.getLines().map(l => l.toUpperCase())
    return self.createBlock(parent, 'paragraph', lines)
  })
})

registryB.block(function () {
  const self = this
  self.named('shout')
  self.onContext('paragraph')
  self.process(function (parent, reader) {
    // Replace period at end of line with three three exclamation marks
    const lines = reader.getLines().map(l => l.replace(/\.$/g, ' !!!'))
    return self.createBlock(parent, 'paragraph', lines)
  })
})

const text = `[shout]\
\nSay it loud.\
\nSay it proud.`

console.log(asciidoctor.convert(text, { 'extension_registry': registryA }))
console.log('')
console.log(asciidoctor.convert(text, { 'extension_registry': registryB }))

// <div class="paragraph">
// <p>SAY IT LOUD.
// SAY IT PROUD.</p>
// </div>
//
// <div class="paragraph">
// <p>Say it loud !!!
// Say it proud !!!</p>
// </div>

在上述示例中,我们创建了两个注册表:

  • registryA

  • registryB

这两个注册表都注册了一个名为 [shout] 的块扩展,并提供了不同的实现。

第一个块扩展在 registryA 中注册,它会将文本转换为大写。另一个块扩展在 registryB 中注册,它会将 . 替换为 !!!