Соединительные элементы в MediaWiki {{#if: ... }}

Я создаю шаблон в MediaWiki, который может включать часть информации, только если эта информация доступна. Информация получена с использованием семантической аннотации mediawiki в статье, переданной в качестве параметра шаблона. Проблема в том, что объединение нескольких запросов в одном {{#if: ...}} с ANDs и ORs довольно громоздки и подвержены ошибкам. То, как я сейчас это делаю, выглядит так

{{#ifexist: {{{1}}} | {{#if: {{#if: {{#show: {{{1}}} | ?prop1 }} |
  {{#if: {{#show: {{{1}}} | ?prop2 }} | {{#show {{{1}}} | ?prop3 }} }}
  {{#if: ... }} ... | ... }}

Итак, второй и третий #ifs в основном кодируют AND, а второй и четвертый - OR, то есть это что-то вроде if ((prop1 in {{{1}}}) and (prop2 in {{{1}}}) and (prop3 in {{{1}}})) or ..., #ifexist необходимо, потому что #show возвращает ошибку (которая не является пустой строкой), когда {{{1}}} не существует как статья в вики. У меня есть около 6 OR и 18 AND, так что вы можете себе представить, как долго и сложно это читать. Мне было интересно, есть ли более прямой способ выразить эти связки, особенно AND, который требует этой уродливой кодировки с вложенным #ifs.

Если вам интересно, где мне нужен такой длинный 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
...
}}
Другие вопросы по тегам