在AsciiDoc中,一个限定块是一个内容区域,它被一对内容相同的行界定符所包围。限定块被用来包含其他块(例如,多个段落)或设置内容模型(例如,逐字记录)。限定块是AsciiDoc所有块类型中的一个子集。

概述

"分隔块是使用结构容器来定义的,这些容器是AsciiDoc语法中固定的一套可识别的块封闭结构。下面是文字块的结构容器:"

....
This text will be treated as verbatim content.
....

一个结构性容器有一个起始界定符和一个结束界定符。起始界定符跟随在区块元数据后面,如果有的话。结构性容器中的首尾空行并不被认为有意义,会被自动移除。剩余的行定义了一个区块的内容。

这些封闭不仅界定了区块内容的边界,而且也意味着一种内容模型(例如,逐字内容或子树)。在某些情况下,它们提供了嵌套区块的机制。然而,限定的区块不能交错在一起。

一个定界块具有独特的能力,可以通过AsciiDoc语法的内置映射和扩展定义的自定义块映射来重新定位。要理解定界块是如何工作的,重要的是要理解结构容器、它们的逐行分隔符、它们的默认上下文以及它们的预期内容模型,以及块嵌套和伪装。

行分隔符

一个定界的块由一对相同的行级定界符特征定义。开头和结尾的定界符必须完全相同,无论是长度还是字符序列。这些定界符,有时被称为围栏,包围内容并明确标示其边界。在定界块的边界内,你可以输入任何内容或空行。块不会结束,直到找到结束定界符。块元数据(块属性和锚点行)位于开头定界符的上方(因此在定界区域之外)。

这是一个限定示例块的例子:

====
这是一个示例块的例子。
那太元了。
====

通常,分隔符使用最小允许长度(4个字符)编写,开放区块的分隔符除外,目前它有一个固定长度的2个字符。分隔符行的长度可以变化,以适应嵌套的区块。

用于定义界定块的有效分隔符集合,以及它们所具有的含义,是由接下来将介绍的可用结构容器所定义的。

结构容器

结构容器是AsciiDoc语言定义的一组固定的已识别的块封闭结构(限定区域)。这些封闭结构在AsciiDoc语法中提供了一个可重用的构建块。通过评估结构容器和块元数据,处理器将确定制作哪种类型的块。

每个结构容器都有一个预期的内容模型。对于内置的块,它的上下文决定了内容模型,尽管大多数内置块都遵循预期的内容模型。自定义块有能力指定内容模型。即便在这些情况下,选择内容模型也应该尊重结构容器的语义。

一些结构容器被用于不同的用途,比如用于引用块的结构容器被用于诗歌块。

结构容器概要

下表列出了结构容器,记录了每个容器的名称、默认上下文和分隔线。

Table 1. AsciiDoc中的结构容器
类型 默认上下文 内容模型(预期的) 最小分隔符

注释

不适用

不适用

////

例子

:例

复合物

====

listing

:listing

verbatim

----

literal

:literal

verbatim

....

打开

:打开

复合

——

sidebar

:sidebar

compound

****

table

:table

table

|=== ,=== :=== !===

pass

:pass

raw

++++

引用

:引用

复合

____

你可能会注意到缺少源代码块。这是因为源代码不是一种容器类型。实际上,它是由块风格指定的列表(或字面)容器的特殊化。诗歌和警告块也明显缺失。那是因为它们分别重新利用了引用和示例块的结构容器。

当没有明确的块样式存在时,默认上下文被假定。

目前,表格是一种特殊的结构容器,不能作为自定义块进行列举。

与其他结构容器不同,注释块在解析的文档中不会被保留,因此没有上下文或内容模型。

Tip
在创建自定义块时,选择提供正确内容模型的结构容器非常重要。这可以让文本编辑器理解如何解析这个块,并在扩展未加载时提供合理的后备选项。

结构容器用于定义有界限的区块。结构容器提供了默认的上下文和预期的内容模型,但实际的上下文和内容模型则是在考虑了区块上的元数据(特别是声明的区块内容)之后确定的。

嵌套块

使用分隔块,您可以将一个块嵌套在另一个块内部。(块也可以嵌套在章节、列表项和表格单元格内,这是一个单独的话题)。

首先,父块必须具有复合内容模型。复合内容模型意味着块的内容是由零个或多个块组成的序列。

当嵌套一个使用与父容器不同的结构容器的块时,只需确保子块完全位于父块内部。界定的块不能交错放置。

====
这里是一个示例AsciiDoc文档:
====

----
= 文件标题
作者姓名

内容在这里。 ----

文档头部是有用的,但不是必需的。 ====

当嵌套使用相同结构容器的分隔块时,有必要改变分隔线的长度(即,使子块的分隔线长度与父块的分隔线长度不同)。改变分隔线的长度可以让解析器区分不同的块。

这里是你的选项:

.Red Pill
[%collapsible]
======
Escape into the real world.
======

.Blue Pill
[%collapsible]
======
生活在模拟的现实中,没有渴望或恐惧。
======
====

嵌套的结构性容器的分隔符长度可以比父容器短也可以长。这是个人风格的选择。