Asciidoctor的HTML5转换器内置了一个用于生成HTML目录(TOC)的方法。这个TOC生成器也可以作为通用API使用。这个逻辑通过HTML5转换器上的`convert_outline`方法可用(这是`outline`节点的转换方法)。

使用方法

convert_outline` 方法接受一个 Document 对象以及一个可选的选项的散列表,它返回 HTML。可以使用以下代码片段以通用方法的形式解析和调用它:

document = Asciidoctor.load_file 'document-with-sections.adoc', safe: :safe
html_toc = (Asciidoctor::Converter.create 'html5').convert_outline document
puts html_toc

这是这个方法生成的一个例子:

<ul class="sectlevel1">
<li><a href="#_section_a">Section A</a></li>
<li><a href="#_section_b">Section B</a>
<ul class="sectlevel2">
<li><a href="#_subsection">Subsection</a></li>
</ul>
</li>
<li><a href="#_section_c">Section C</a></li>
</ul>

您也可以通过文档 API 的方式,访问转换器实例上的 convert_outline 方法。

document = Asciidoctor.load_file 'document-with-sections.adoc', safe: :safe
html_toc = document.converter.convert_outline document

如果你在使用一个复合转换器,你可以使用通用的 convert 方法来确保调用会经过转换器链。为此,调用 convert 方法,并传入 Document 对象和节点名 outline。这将依次在链中对此方法有响应的转换器上调用 convert_outline 方法。

document = Asciidoctor.load_file 'document-with-sections.adoc', safe: :safe
html_doc = document.converter.convert document, 'outline'

您也可以在任何转换器模板(例如,Slim、Haml或ERB)内使用这种方法来生成和嵌入目录:

= 转换器.转换 文档, '大纲'

选项

convert_outline` 方法接受以下选项:

段落数量级别

段落数量级的编号(默认为`sectnumlevels`属性的值)。

目录级别

TOC的深度(默认为`toclevels`属性的值)

这是一个如何为之前加载的文档生成深度限制为1的HTML目录的示例:

html_toc = document.converter.convert_outline document, toclevels: 1