Соединительные элементы в MediaWiki {{#if: ... }}
Я создаю шаблон в MediaWiki, который может включать часть информации, только если эта информация доступна. Информация получена с использованием семантической аннотации mediawiki в статье, переданной в качестве параметра шаблона. Проблема в том, что объединение нескольких запросов в одном {{#if: ...}}
с ANDs и ORs довольно громоздки и подвержены ошибкам. То, как я сейчас это делаю, выглядит так
{{#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}}}
не существует как статья в вики. У меня есть около 6 OR и 18 AND, так что вы можете себе представить, как долго и сложно это читать. Мне было интересно, есть ли более прямой способ выразить эти связки, особенно AND, который требует этой уродливой кодировки с вложенным #if
s.
Если вам интересно, где мне нужен такой длинный if, фактический шаблон, над которым я работаю, находится здесь: https://psychonautwiki.org/wiki/Template:Summary
1 ответ
Шаблоны 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
...
}}