每个块上下文都与一组默认的替换关联,这些替换最适合内容模型。然而,在某些情况下,您可能需要应用一组不同的替换。例如,您可能希望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]
-
subs`属性在属性列表中设置,并且被赋予`verbatim`和`quotes`值。重要的是要恢复`verbatim`替换步骤以确保特殊字符被编码(对于源代码块,这也使得语法高亮成为可能)。
-
这行中的格式化标记将在`quotes`替换步骤运行时被替换。
这里是结果。
Unresolved directive in apply-subs-to-blocks.adoc - include::example$subs.adoc[tag=subs-out]
-
"The
verbatim
value enables any special characters and callouts to be processed." 的中文翻译是:"`verbatim` 值允许处理任何特殊字符和标注。" -
quotes` 值启用加粗文本格式的处理。
如果在整个块上启用引号替换步骤会导致问题,你可以改为启用宏替换步骤,然后使用 pass 宏在本地启用引号替换步骤。
[source,java,subs="verbatim,macros"]
----
System.out.println("No bold *here*");
pass:c,q[System.out.println("Hello *<name>*");] (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
|
如果你在多个块中应用相同的替换集,你应该考虑将它们作为属性条目以确保一致性。
确保一致性并保持文档清洁简单的另一种方法是使用树处理器扩展。 |