我正在mediawiki中创建一个模板,仅当该信息可用时才可选择包含该信息。该信息是使用作为模板参数传递的文章中的语义mediawiki注释获得的。问题是将多个查询与and和or组合在一个{{#if: ...}}
中非常麻烦且容易出错。我现在做的是这样的
{{#ifexist: {{{1}}} | {{#if: {{#if: {{#show: {{{1}}} | ?prop1 }} |
{{#if: {{#show: {{{1}}} | ?prop2 }} | {{#show {{{1}}} | ?prop3 }} }}
{{#if: ... }} ... | ... }}
所以第二个和第三个#if
s基本上是编码一个and,而第二个和第四个是编码一个OR,也就是说,它类似于if ((prop1 in {{{1}}}) and (prop2 in {{{1}}}) and (prop3 in {{{1}}})) or ...
。#ifexist
是必要的,因为#show
返回一个错误(这不是一个空字符串),当{{{1}}}
不存在作为一篇文章在wiki。我有6个or和18个hand,所以你可以想象它有多长,多难读。我想知道是否有一种更直接的方式来表达这些连接词,特别是AND,它需要使用嵌套的#if
s进行这种丑陋的编码。
如果你想知道我在哪里需要这么长的If,我正在处理的实际模板在这里:https://psychonautwiki.org/wiki/Template:Summary
MediaWiki模板不是编程语言;如果这对你来说是个问题,你可能做错了。试试一门真正的编程语言吧。
如果压力很大,我会使用{{#ifexpr}}
:
{{#ifexpr:
{{#ifexist: {{{1}}} | 1 | 0 }}
and (
{{#show: {{{1}}} | ?prop1 | 1 | 0 }}
and {{#show: {{{1}}} | ?prop2 | 1 | 0 }}
or
{{#show: {{{1}}} | ?prop3 | 1 | 0 }}
...
)
|...}}
如果您需要根据条件在多个输出之间进行选择,{{#switch}}
和旧的switch(true)
技巧也可以很方便:
{{#switch:1
| {{#show: {{{1}}} | ?prop1 | 1 | 0 }} = option 1
| {{#show: {{{1}}} | ?prop2 | 1 | 0 }} = option 2
...
}}