当你引用一个不存在的属性(例如,{does-not-exist}
),AsciiDoc处理器会留下属性引用。如果你在包含其他文本的同一行里取消定义属性(例如,{set:attribute-no-more!}
),处理器会删除整行。你可以通过使用`attribute-missing`和`attribute-undefined`属性来定制这些行为。你需要考虑你希望处理器如何处理这些情况,并相应地配置处理器。
缺少属性
attribute-missing`属性控制着丢失引用的处理方式。默认情况下,丢失的引用会被保留,这样可以保持文档的完整性并且使作者更容易追踪。
这个属性有四个可能的值:
- 跳过
-
将引用保留在原位(默认设置)
- 删除
-
去掉引用,但不要删除这一行
- drop-line
-
删除出现引用的那行(与AsciiDoc.py的行为匹配)
- 警告
-
打印关于缺失属性的警告
您可能会对`warn`设置最感兴趣,当处理器遇到无法解析的属性引用时,它会发出警告,但在其他情况下不会改动该行。
考虑下面这一行:
你好,{name}!
在每种情况下,假设`name`属性没有定义,这里是如何处理这一行的:
`attribute-missing`的值 | 结果 |
---|---|
|
你好,{name}! |
|
你好,! |
|
{空} |
|
|
Note
|
历史
AsciiDoc.py 总是会丢弃包含对丢失属性引用的那一行(实质上是 attribute-missing=drop-line )。这个 “feature” 是处理器实现方式的一个副作用,并不是为了编写者设计的。对于编写者来说,这种行为非常令人沮丧,因为它很难被检测到,在何处发生,并且可能导致重要内容的丢失。这就是为什么 Asciidoctor 使用一个不同的默认行为,并且,进一步的,允许这种行为被自定义。
|
有几种情况下,`attribute-missing`属性并不是严格遵守的。其中一个例子是include指令。如果在include指令的目标中发现了缺失属性,处理器将发出关于缺失属性的警告,并在转换后的文档中留下相同的警告信息。
另一个案例是`ifeval`指令。在`ifeval`指令的子句中可以安全使用缺失的属性引用,而不会产生任何副作用(即`drop`),因为该语句的目的是确定一个属性是否解析为一个值。
强制失败
如果您希望当文档中包含缺失属性时处理器失败,请将`attribute-missing`属性设置为`warn`并将`--failure-level=WARN`选项传递给CLI。
$ asciidoctor -a attribute-missing=warn --failure-level=WARN doc.adoc
处理器将转换整个文档,但应用程序将以非零退出状态完成。
当使用API时,您可以查阅记录器以了解报告的所有消息中的最大严重性等级,或在堆栈中查找特定消息。应用程序代码需要决定如何以及何时终止应用程序。
未定义属性
attribute-undefined` 属性控制了如何处理取消定义属性的表达式(例如,{set:name!}
)。默认情况下,由于该表达式旨在作为一条指令而不是内容引用,包含该表达式的行将被丢弃。
这个属性有两个可能的值:
- 删除
-
在处理后用一个空字符串替换表达式。
- drop-line
-
删除包含此表达式的那一行(默认设置;与AsciiDoc.py的行为匹配)
选项 skip
在这里没有意义,因为该语句并非旨在产生内容。
考虑以下声明:
{set:name!}
根据`attribute-undefined`是`drop`还是`drop-line`,将会丢弃包含该语句的语句或行。在这种情况下,坚持符合标准的行为,即`drop-line`,是合理的。
Tip
|
我们建议将取消定义属性的任何语句单独放在一行中。 |