复合块处理器示例

目的

注册一个名为 collapsible 的自定义块,它将一个列表块转换为一个复合块,该复合块由以下部分组成:

  • 一个已启用 collapsible 选项的示例块

  • 原始列表块

  • 如果使用第二个位置属性指定了语言,则列表块将被提升为源块。

示例 1. sample-with-collapsible-block.adoc
.Show JSON
[collapsible,json]
----
{
   "foo": "bar"
}
----
示例 2. collapsible-block.rb
class CollapsibleBlock < Asciidoctor::Extensions::BlockProcessor
  enable_dsl
  on_context :listing
  positional_attributes 'language'

  def process parent, reader, attrs
    lang = attrs.delete 'language'
    attrs['title'] ||= 'Show Listing'
    example = create_example_block parent, [], attrs, content_model: :compound
    example.set_option 'collapsible'
    listing = create_listing_block example, reader.readlines, nil
    if lang
      listing.style = 'source'
      listing.set_attr 'language', lang
      listing.commit_subs
    end
    example << listing
    example
  end
end

Asciidoctor::Extensions.register do
  block CollapsibleBlock, :collapsible
end
用法
$ asciidoctor -r ./collapsible-block.rb sample-with-collapsible-block.adoc
此扩展程序模仿了示例块上内置的 collapsible 选项,但将其合并到一个块中。此扩展程序的目的是展示如何在扩展程序中组装复合块。