在`ifeval`指令内部闭合的行(也就是,在`ifeval`与`endif`指令之间)若`ifeval`指令方括号内的表达式评估为真,则这些行会被包含进来。
ifeval::[{sectnumlevels} == 3] If the `sectnumlevels` attribute has the value 3, this sentence is included. endif::[]
ifeval` 指令没有像 ifdef
和 ifndef
那样的单行形式或长格式变体。
与`ifdef`和`ifndef`不同,你不能用其补码终止特定的`ifeval`指令。例如,以下的`ifeval`块是无效的:
ifeval::[<condition>] conditional content endif::[<condition>]
你只能使用一个匿名的`endif::[]`指令来终止前面的`ifeval`指令,如下所示:
ifeval::[<condition>] conditional content endif::[]
如果你正在混合使用`ifeval`指令与`ifdef`或`ifndef`指令,你应该总是通过名称关闭多行的`ifdef`和`ifndef`指令(endif::name-of-attribute[]
),以防止`ifeval`指令过早结束。
解剖学
ifeval指令的表达式由左边的值和右边的值组成,中间有一个操作符。通常在操作符的两边各加一个空格。
ifeval::[2 > 1] ... endif::[] ifeval::["{backend}" == "html5"] ... endif::[] ifeval::[{sectnumlevels} == 3] ... endif::[] // the value of outfilesuffix includes a leading period (e.g., .html) ifeval::["{docname}{outfilesuffix}" == "main.html"] ... endif::[]
价值观
每个表达式值可以使用属性引用语法引用零个或多个AsciiDoc属性的名字(例如,{backend}
)。
属性引用首先会被解析(即,替换)。一旦属性引用被解析后,每个值都会被强制转换为一个被识别的类型。
当你期望属性引用解析为一个字符串时,即一系列字符时,请将表达式的那一侧用引号括起来。例如:
ifeval::["{backend}" == "html5"]
如果你期望属性解析为一个数字,那么你不需要用引号来包围表达式。在这种情况下,值将被作为数字进行比较。同样的规则适用于布尔值。
你不应该尝试在比较中混合使用不同的值类型。例如,以下表达式是无效的:
如果`"{sectnumlevels}" > 3
以下类型的值被识别:
- 数字
-
一个整数或浮点值。
- 引用字符串
-
被包裹在单引号(
'
)或双引号("
)内。 - 布尔值
-
字面值为
true
或false
。
值类型强制转换是如何工作的
如果一个值被引号包围,那么引号之间的字符将被使用,并且总是被强制转换为字符串。
如果一个值*不*被引号包围,它将遵循下列类型强制转换规则:
-
一个空值会变成nil(也就是null)(因此在比较中使用是安全的)。
-
一个值为`true`或`false`会变成布尔值。
-
只包含重复空白的值会变成一个单一空格字符串。
-
一个包含小数点的值会变成一个浮点数。
-
任何其他的值都会被强制转换成一个整数值。
操作符
每一边的值都使用运算符进行比较,以得出一个结果。
- ==
-
检查这两个值是否相等。
- !=
-
检查两个值是否不相等。
- <
-
检查左侧是否小于右侧。
- <=
-
检查左侧是否小于或等于右侧。
- >
-
检查左边的值是否大于右边的值。
- >=
-
检查左侧是否大于或等于右侧。
双方应具有相同的值类型。如果它们不同,则比较将失败。如果比较失败,条件将评估为假(即,指令内的内容将被跳过)。
这些运算符遵循与Ruby中的运算符相同的规则。