每个块上下文都与一组默认的替换关联,这些替换最适合内容模型。然而,在某些情况下,您可能需要应用一组不同的替换。例如,您可能希望AsciiDoc处理器在列表块中替换属性引用。因此,AsciiDoc语言提供了一种机制,用于更改块上的替换。

The subs attribute

应用于块(以及某些内联元素)的替换可以使用`subs`元素属性来更改或修改。这个属性接受用逗号分隔的替换步骤或组的列表。

那些取代步骤和组的名称如下:

替换组,用于禁用所有替换。

正常

执行除了呼叫外所有替换类型的替换组。

verbatim

替换特殊字符和处理标注的替代组。

specialchars

替换步骤将 <>& 替换为对应的实体。对于源代码块,这个替换步骤还能启用语法高亮。

标记

替换步骤用于处理文字、列表和源代码块中的呼叫标记。

quotes

应用内联文本格式化的替代步骤。

属性

替换属性引用的替代步骤。

替换

替换步骤,用于将十六进制的Unicode码点和实体、HTML和XML字符引用替换为字符的十进制Unicode码点。`replacements`的输出可能取决于之前是否应用了`specialcharacters`替换。

处理内联和块宏的替代步骤。

post_replacements

替换步骤处理换行字符(+)。

如果在步骤中加上了`+-`修饰符,则相应地修改现有的替换内容(参见incremental subs)。否则,现有的替换内容将被替换。该值还指定了替换应用的顺序。

Note
subs` 元素属性不会继承到嵌套块中。它只能应用于叶子块,叶子块是指不能有子块的任何块(例如,一个段落或一个列表块)。

在块元素上设置subs属性

Caution
你应该始终倾向于使用渐进式替代,并且只有在你需要额外控制时才回退到精确替代。

让我们看一个例子,在这个例子中你想要在源代码块中处理内联格式化标记。默认情况下,源代码块(以及其他逐字块)仅受到逐字替换组(特殊字符和呼叫标记)的影响。你可以通过在块的属性列表中设置`subs`属性来改变这种行为。

Unresolved directive in apply-subs-to-blocks.adoc - include::example$subs.adoc[tag=subs-in]
  1. subs`属性在属性列表中设置,并且被赋予`verbatim`和`quotes`值。重要的是要恢复`verbatim`替换步骤以确保特殊字符被编码(对于源代码块,这也使得语法高亮成为可能)。

  2. 这行中的格式化标记将在`quotes`替换步骤运行时被替换。

这里是结果。

Unresolved directive in apply-subs-to-blocks.adoc - include::example$subs.adoc[tag=subs-out]

  1. "The verbatim value enables any special characters and callouts to be processed." 的中文翻译是:"`verbatim` 值允许处理任何特殊字符和标注。"

  2. quotes` 值启用加粗文本格式的处理。

如果在整个块上启用引号替换步骤会导致问题,你可以改为启用宏替换步骤,然后使用 pass 宏在本地启用引号替换步骤。

[source,java,subs="verbatim,macros"]
----
System.out.println("No bold *here*");
pass:c,q[System.out.println("Hello *<name>*");] (1)
----
  1. "The pass macro with the c,q target applies the specialchars and quotes substitution steps to the enclosed text." 翻译成中文是:“带有`c,q`目标的pass宏将specialchars和quotes替换步骤应用于封闭文本。”

您可能想知道为什么在前面的例子中默认情况下使用 verbatim 应用于字面量块。其原因是当你指定替换时没有使用修饰符,它将替换所有现有的替换。因此,开始使用 verbatim 是必要的,以便恢复默认的替换。你可以通过使用增量替换来避免这样做,这将在下一节中介绍。

添加和移除默认替换组中的替换类型

当你在一个块上设置 subs 属性时,你会自动*移除*所有它的默认替换。例如,如果你在一个字面块上设置 subs ,并给它赋值为 attributes,只有属性引用会被替换。verbatim 替换组不会被应用。为了解决这个问题,AsciiDoc 提供了一种语法来追加或移除替换,而不是直接替换它们。

您可以使用加号(+)和减号(-)修饰符从默认替换组中添加或移除一个替换类型。这些被称作[.term]增量替换

<substitution>+

将替换内容添加到默认列表的前面。

+<substitution>

将替换添加到默认列表中。

-<substitution>

从默认列表中移除替换项。

例如,您可以通过在`attributes`值的末尾放置加号(+)修饰符,将`attributes`替换项添加到列表块的默认替换组的开头。

将属性替换添加到默认替换组
Unresolved directive in apply-subs-to-blocks.adoc - include::example$subs.adoc[tag=subs-add]

同样,您可以通过在`callouts`值前面加上减号(-)修饰符,从块的默认替换组中移除`callouts`替换。

从默认替换组中移除标注替换。
Unresolved directive in apply-subs-to-blocks.adoc - include::example$subs.adoc[tag=subs-sub]

您还可以指定替换类型是否添加到替换组的末尾。如果``出现在替换名称之前,则它会被添加到现有列表的末尾;而如果``出现在名称之后,则它会被添加到列表的开头。

Unresolved directive in apply-subs-to-blocks.adoc - include::example$subs.adoc[tag=subs-multi]

在上述示例中,attributes 替换步骤被添加到默认替换组的开头,replacements 步骤被添加到组的末尾,而 callouts 步骤则从组中移除。

Tip

如果你在多个块中应用相同的替换集,你应该考虑将它们作为属性条目以确保一致性。

Unresolved directive in apply-subs-to-blocks.adoc - include::example$subs.adoc[tag=subs-attr]

确保一致性并保持文档清洁简单的另一种方法是使用树处理器扩展