当你引用一个不存在的属性(例如,{does-not-exist}),AsciiDoc处理器会留下属性引用。如果你在包含其他文本的同一行里取消定义属性(例如,{set:attribute-no-more!}),处理器会删除整行。你可以通过使用`attribute-missing`和`attribute-undefined`属性来定制这些行为。你需要考虑你希望处理器如何处理这些情况,并相应地配置处理器。

缺少属性

attribute-missing`属性控制着丢失引用的处理方式。默认情况下,丢失的引用会被保留,这样可以保持文档的完整性并且使作者更容易追踪。

这个属性有四个可能的值:

跳过

将引用保留在原位(默认设置)

删除

去掉引用,但不要删除这一行

drop-line

删除出现引用的那行(与AsciiDoc.py的行为匹配)

警告

打印关于缺失属性的警告

您可能会对`warn`设置最感兴趣,当处理器遇到无法解析的属性引用时,它会发出警告,但在其他情况下不会改动该行。

考虑下面这一行:

你好,{name}!

在每种情况下,假设`name`属性没有定义,这里是如何处理这一行的:

`attribute-missing`的值 结果

skip

你好,{name}!

drop

你好,!

drop-line

{空}

warn

asciidoctor: 警告:跳过对缺失属性的引用:XYZ

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
我们建议将取消定义属性的任何语句单独放在一行中。