注册扩展
目前可以使用以下扩展点:
- 预处理器(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
中注册,它会将 .
替换为 !!!
。