На этой странице описывается, как использовать различные функции синтаксического анализатора для отображения различных результатов на основе обнаруженных условий на странице или в шаблоне .
Вот краткий обзор этих функций с точки зрения того, как они обрабатывают входные данные (имена функций связаны с более подробными их описаниями, которые можно найти ниже на этой странице):
#if
проверяет истинность значения строки#ifeq
проверяет, равны ли две строки или числа#switch
сравнивает строку с набором возможных значений#expr
оценивает математическое выражение#ifexpr
оценивает математическое выражение и действует на основе истинности результата#iferror
проверяет, вызывает ли строка (часто выражение внутри #expr
) ошибку синтаксического анализатора#ifexist
проверяет, существует ли страница с указанным заголовком на вики (включая файлы изображений/медиа)Информацию об использовании этих функций в таблицах см. в разделе Справка:Условные таблицы .
Базовый синтаксис (и использование) каждой функции следующий:
{{#if: test string | value if true | value if false }}
{{#ifeq: string 1 | string 2 | value if equal | value if unequal }}
{{#switch: test string | case1 = value for case 1 | ... | default }}
#ifeq
тестов, но гораздо эффективнее){{#expr: expression }}
{{#ifexpr: expression | value if true | value if false }}
{{#iferror: test string | value if error | value if no error }}
{{#ifexist: page title | value if exists | value if doesn't exist }}
Обратите внимание, что «истина» интерпретируется строковой #if
функцией и численно-ориентированными функциями #expr
и совершенно по-разному #ifexpr
. Строка считается истинной, если она содержит хотя бы один непробельный символ (например, функция #if
интерпретирует строки «0» и «ЛОЖЬ» как истинные значения, а не ложные). Любая строка, содержащая только пробелы или вообще не содержащая символов, будет рассматриваться как ложная (то есть #if
интерпретирует « « и «», а также неопределенные параметры как ложные значения). С другой стороны, в выражениях, вычисляемых #expr
и #ifexpr
, булевы операторы, такие как and
, or
, и not
интерпретируют числовое значение 0 как ложное, а любое другое число как истинное. С точки зрения вывода булевы операции возвращают 1 для истинного значения и 0 для ложного (и числовые операторы рассматривают их как обычные числа). Нечисловые строки (включая большинство случаев использования пустых строк и неопределенных параметров) приведут к тому, что #expr
и #ifexpr
выдадут ошибку.
Также обратите внимание, что все начальные и конечные пробелы в каждой из частей вызова функции парсера удаляются, что позволяет форматировать вызовы с дополнительными пробелами для лучшей читаемости. Например:
{{ #if : {{{ xx |}}} | значение параметра xx истинно | значение параметра xx ложно }}
Здесь значимыми являются только пробелы в строках "parameter xx value is true" и "parameter xx value is false". Все остальные пробелы игнорируются. Таким образом, конструкция выше эквивалентна следующему вызову:
{{ #if :{{{ xx |}}}| значение параметра xx истинно | значение параметра xx ложно }}
В любой части вызова функции синтаксического анализатора, где ожидается строка, можно использовать литеральную строку, вызов шаблона, вызов функции синтаксического анализатора или какое-либо другое магическое слово .
{{if}}
Функция #if
выбирает одну из двух альтернатив на основе истинности значения тестовой строки.
{{#if: test string | value if true | value if false }}
Как объяснялось выше, строка считается истинной, если она содержит хотя бы один непробельный символ. Любая строка, содержащая только пробелы или вообще не содержащая символов, будет считаться ложной.
Неопределенные значения параметров сложны: если первый позиционный параметр не был определен в вызове шаблона, то {{{1}}}
результатом будет строка-литерал "{{{1}}}" (т. е. 7-символьная строка, содержащая три пары фигурных скобок вокруг числа 1), что является истинным значением. (Эта проблема существует как для именованных, так и для позиционных параметров.) Но {{{1|}}}
результатом будет пустая строка ( ложное значение), поскольку вертикальная черта или символ вертикальной черты, "|"
, следующий сразу за именем параметра, указывает значение по умолчанию (в данном случае пустая строка, поскольку между вертикальной чертой и первой закрывающей фигурной скобкой ничего нет) в качестве "резервного" значения, которое будет использоваться, если параметр не определен.
Эту функцию можно использовать для проверки того, был ли параметр передан шаблону с истинным значением.
Примеры:
{{ #if : {{{ 1 |}}} | первый позиционный параметр имеет истинное значение | первый позиционный параметр имеет ложное значение (или не имеет значения) }}{{ #if : {{{ xx |}}} | именованный параметр xx имеет истинное значение | именованный параметр xx имеет ложное значение (или не имеет значения) }}{{ #if : {{{ xx |}}}{{{ yy |}}} | либо xx, либо yy имеет истинное значение, либо оба истинны | и xx, и yy имеют ложное значение (или не имеют значения) }}
Проверка того, являются ли оба параметра истинными, требует немного больше усилий. Например:
{{ #if : {{{ xx |}}} | {{ #if : {{{ yy |}}} | оба значения xx и yy имеют истинные значения | xx является истинным, но не yy }} | оба значения xx и yy являются ложными }}
Обратите внимание, что вложенные #if
функции, подобные этой, очень быстро становятся очень ресурсоемкими. В некоторых вики даже семь уровней вложенности могут превысить ограничения по ресурсам.
См. обсуждение того, #ifeq
как определить, определен ли параметр, независимо от того, является ли его значение истинным или ложным.
{{ifeq}}
Функция #ifeq
выбирает одну из двух альтернатив в зависимости от того, равны ли две тестовые строки друг другу.
{{#ifeq: string 1 | string 2 | value if equal | value if not equal }}
Если обе строки являются допустимыми числовыми значениями, они сравниваются как числа, а не как буквенные строки:
{{#ifeq: 01 | 1 | equal | not equal }}
→ равный{{#ifeq: x01 | x1 | equal | not equal }}
→ не равно{{#ifeq: 2.000 | 002 | equal | not equal }}
→ равный{{#ifeq: 2.5 | 2+.5 | equal | not equal }}
→ не равно (арифметика!){{#ifeq: 2*10^3 | 2000 | equal | not equal }}
→ не равно (арифметика!){{#ifeq: 2E3 | 2000 | equal | not equal }}
→ равныйКак видно из 4-го и 5-го примеров, математические выражения не оцениваются. Они обрабатываются как обычные строки. Но #expr
могут использоваться для оценки таких выражений.
{{#ifeq: {{#expr:2*10^3}} | 2000 | equal | not equal }}
→ равныйСравнение строк чувствительно к регистру :
{{#ifeq: King | king | equal | not equal }}
→ не равноДля проверки без учета регистра используйте функцию {{lc:}}
or {{uc:}}
, чтобы принудительно перевести все строки в нижний или верхний регистр. Это особенно полезно при работе со значениями параметров:
{{#ifeq: {{lc:King}} | king | equal | not equal }}
→ равный{{#ifeq: {{lc: {{{position}}} }} | top | code if true | code if false }}
Во втором примере значения «top», «Top» и «TOP» приведут к успешным совпадениям.
Эту функцию парсера можно использовать для определения того, определен ли параметр шаблона, даже если ему присвоено ложное значение. Например, чтобы проверить, был ли передан первый позиционный параметр в шаблон (обратите внимание, что строки " +
" и " -
" могут быть любыми двумя разными непробельными строками):
{{#ifeq: {{{1|+}}} | {{{1|-}}} | 1 is defined | 1 is undefined }}
Если говорить конкретно, вот что генерирует этот код при вызове следующими способами:
{{template-name}}
→ 1 не определено{{template-name|}}
→ 1 определено{{template-name|1=}}
→ 1 определено{{template-name|1=foo}}
→ 1 определеноБолее подробную информацию, включая возможные нелогичные результаты, связанные со способом реализации этой функции, см. в mw:Help:Extension:ParserFunctions##ifeq.
Функция #switch
выбирает между несколькими альтернативами на основе входной строки.
{{#switch: test string | case1 = value for case 1 | ... | default value }}
Эквивалент оператора switch, встречающегося в некоторых языках программирования, это удобный способ работы с несколькими случаями без необходимости связывать множество #if
функций вместе. Однако следует отметить, что производительность страдает, когда альтернатив больше 100. Размещение общих значений в начале списка случаев может привести к тому, что функция будет выполняться значительно быстрее.
Для каждого случая любая сторона знака равенства " =
" может быть простой строкой, вызовом функции синтаксического анализатора (включая #expr
вычисление выражений) или вызовом шаблона. Если какие-либо случаи не связаны со значением (т. е. знак равенства не используется), будет использовано следующее указанное значение. Это позволяет нескольким случаям совместно использовать одно и то же значение без необходимости указывать это значение повторно (как показано в примере ниже).
Если соответствующий регистр не найден, то используется значение по умолчанию. Обычно оно указывается последним без связанного значения " case ", как показано в сводке синтаксиса выше, но его также можно указать в любой точке после тестовой строки, если используется конструкция (см. второй пример ниже). Если значение по умолчанию не указано ни одним из способов, то будет возвращена пустая строка, если ни один из регистров не соответствует входной строке.| #default = value
Эта функция особенно выигрывает, если ее настроить в многострочном формате.
{{ #switch : {{{ x |}}} | 1 = один | 2 = два | 3 = три | 4 = четыре | 5 | 6 | 7 = в диапазоне от 5 до 7 | другой }}
Здесь, если значение параметра шаблона x
— строка «1», то выводом будет строка «one»; если «2», то «two»; и так далее. Но для любого из значений «5», «6» или «7» выводом будет строка «in the range 5 to 7». Для любого другого значения или нулевого значения будет возвращена строка «other».
Следующий пример эквивалентен предыдущему:
{{ #switch : {{{ x |}}} | #default = другой | 1 = один | 2 = два | 3 = три | 4 = четыре | 5 | 6 | 7 = в диапазоне от 5 до 7 }}
Полное описание и дополнительные примеры см . в разделе Справка: Переключение функции парсера .
Функция #expr
оценивает математические (включая булевы) выражения. Хотя сама по себе она не является условной функцией, она часто используется внутри этих функций, поэтому кратко описана здесь. Подробнее см. m:Help:Calculation.
{{#expr: expression }}
В отличие от #if
функции, все значения в expression
вычисляемом по #expr
предполагаются числовыми. Он не работает с произвольными строками. Для целей его булевых операций (например, and
, or
, и not
) false представляется как 0, а true как 1; эти значения обрабатываются числовыми операторами как обычные числа. В качестве входных данных булевы операторы обрабатывают 0 как false, а все остальные числа как true. Если используются какие-либо нечисловые строки, возникнет ошибка.
Примеры:
{{#expr: ( {{{1}}}+{{{xshift}}} - 6 ) * 18.4 }}
{{#expr: ln(7)^3 - abs(-0.344) + floor(5/3) round 3 }}
{{#expr: {{{n}}}>0 and {{{n}}}<1.0 }}
Обратите внимание, что эти примеры предполагают, что все упомянутые параметры определены и имеют числовые значения. Если это не так, возникнут ошибки. См #iferror
. один из способов обработки ошибок.
Функция #ifexpr
оценивает выражение точно так же #expr
(подробности см. в описании этой функции), но возвращает одно из двух возможных значений в зависимости от истинности результата.
{{#ifexpr: expression | value if true | value if false }}
Примеры:
{{#ifexpr: ( {{{1}}} + {{{2}}} ) * 2.63 > 45 | above 45 | not above 45 }}
{{#ifexpr: {{{1}}} > 0 and {{{1}}} < 1.0 or {{#ifeq:{{{decimal}}}|yes}} | is decimal | not decimal }}
Как объяснялось выше, для целей этой функции 0 является ложью, а любое другое числовое значение является истиной.
{{#ifexpr: 0 | yes | no }}
→ нет{{#ifexpr: 1 | yes | no }}
→ да{{#ifexpr: 2 | yes | no }}
→ даПустое входное выражение оценивается как ложное.
{{#ifexpr: | yes | no }}
→ нетОднако недопустимый ввод, включая ввод, содержащий нечисловые строки, приведет к отображению сообщения об ошибке.
{{#ifexpr: = | yes | no }}
→ Ошибка выражения: Неожиданный оператор ={{#ifexpr: A=B | yes | no }}
→ Ошибка выражения: Нераспознанное слово «а».При нормальных обстоятельствах функция #ifexpr
эквивалентна использованию следующей конструкции с #ifeq
и #expr
(обратите внимание на перестановку выходных значений «истина» и «ложь», поскольку мы сравниваем входной результат с «0»):
{{#ifeq: {{#expr: expression }} | 0 | value if false | value if true }}
Но любое сообщение об ошибке, сгенерированное , #expr
будет воспринято #ifeq
как обычная строка, не равная «0», и, таким образом, value if true
будет выведено.
{{#ifeq: {{#expr: = }} | 0 | yes | no }}
→ нетОдно или оба выходных значения могут быть опущены (или оставлены пустыми), в этом случае (при условии, что достигнута «отсутствующая» ветвь конструкции) выходные результаты не возвращаются.
{{#ifexpr: 1 > 0 | yes }}
→ да{{#ifexpr: 1 > 0 | | no }}
→Более подробную информацию, включая возможные нелогичные результаты, связанные со способом реализации этой функции, см. в mw:Help:Extension:ParserFunctions##ifexpr.
Функция #iferror
выбирает одну из двух альтернатив в зависимости от того, вызывает ли ее входная информация ошибку.
{{#iferror: test string | value if error | value if correct }}
Тестовая строка обычно представляет собой вызов #expr
какой-либо другой функции синтаксического анализатора, но может быть и обычным текстом или вызовом шаблона. В этом случае ошибка будет вызвана любым объектом HTML с class="error"
любой из различных ошибок шаблона, таких как циклы и рекурсии, или какой-либо другой ошибкой синтаксического анализатора «failsoft».
Одно или оба возвращаемых значения могут быть опущены. Если value if correct
опущено, возвращается тестовая строка, если она не является ошибочной. Если value if error
также опущено, при ошибке возвращается пустая строка:
{{#iferror: {{#expr: 1 + 2 }} | error | correct }}
→ правильно{{#iferror: {{#expr: 1 + X }} | error | correct }}
→ ошибка{{#iferror: {{#expr: 1 + 2 }} | error }}
→ 3{{#iferror: {{#expr: 1 + X }} | error }}
→ ошибка{{#iferror: {{#expr: 1 + 2 }} }}
→ 3{{#iferror: {{#expr: 1 + X }} }}
→{{#iferror: {{#expr: . }} | error | correct }}
→ правильно{{#iferror: <strong class="error">a</strong> | error | correct }}
→ ошибкаФункция #ifexist
выбирает один из двух вариантов в зависимости от того, существует ли страница с указанным заголовком.
{{#ifexist: page title | value if page exists | value if page doesn't exist }}
Страница может находиться в любом пространстве имен , поэтому это может быть статья или «страница контента», изображение или другой медиафайл, категория и т. д. Фактическое содержимое страницы не имеет значения, поэтому она может быть пустой или перенаправлением . Заголовки, которые привели бы к красным ссылкам, не существуют (и, как и в случае с красными ссылками, проверка существования несуществующей страницы приводит к появлению заголовка на Special:WantedPages ).
Проверка выполняется чрезвычайно быстро, но ограничена 500 экземплярами на страницу, поскольку считается «дорогостоящей функцией парсера». (Однако множественные проверки одного и того же заголовка на одной странице не считаются множественными экземплярами, поскольку результаты первой проверки кэшируются и повторно используются для последующих проверок.)
Распространенной идиомой, встречающейся в кодировании шаблонов, является «цепочка резервных значений», как показано в этом примере:
{{{1|{{{url|{{{URL|}}}}}}}}}
Здесь, если первый позиционный параметр определен, то будет использовано его значение. Если он не определен, то url
будет проверен именованный параметр, а если он определен, то будет использовано его значение. Если и первый позиционный параметр, и url
не определены, то будет проверен именованный параметр URL
: если он определен, то будет использовано его значение; если нет, то будет использована пустая строка.
Проблема в том, что эта конструкция часто интерпретируется как эквивалентная следующему:
{{#if: {{{1|}}} | {{{1}}} | {{#if: {{{url|}}} | {{{url}}} | {{#if: {{{URL|}}} | {{{URL}}} }} }} }}
и это не так . Разница в том, что первая конструкция, использующая значения по умолчанию, зависит от определённости параметров, тогда как вторая конструкция, использующая #if
функции, зависит от истинностного значения параметров. Это две совершенно разные вещи.
Если какой-либо из параметров в цепочке резервных значений (в первой конструкции) был установлен в пустое значение (или только пробел) в вызове шаблона, то это пустое значение будет использоваться вместо «возврата» к следующему параметру в цепочке. Так, например, если шаблон вызывается одним из этих двух способов:
{{template-name||url=https://example.com/}}
{{template-name|url=https://example.com/|}}
Первый позиционный параметр определен : его значение — пустая строка. Таким образом, значение url
не имеет значения. Шаблон никогда не «достигает» этого значения.
Аналогично, если шаблон вызывается следующим образом:
{{template-name|url=|URL=https://example.com/}}
url
Вместо значения будет использовано пустое значение URL
.
Эти примеры могут показаться немного надуманными, поскольку они полагаются на шаблон, вызываемый «неправильным образом». Но удивительно легко натолкнуться на случаи, когда эти проблемы возникают при совершенно разумных вызовах шаблонов (особенно если есть «иерархия» шаблонов, где один шаблон вызывает другой, передавая значения своих параметров параметрам шаблона «более низкого уровня» — в таких случаях часто будут получаться определенные, но пустые значения параметров).
Из-за таких проблем кодировщики шаблонов иногда сталкиваются с необходимостью различать различные комбинации трех состояний: определенное-и-непустое, определенное-и-пустое и неопределенное. Это можно сделать следующими способами (здесь используется первый позиционный параметр, но именованные параметры работают так же).
{{#if: {{{1|}}} | 1 is defined and contains non-whitespace | 1 is undefined, empty, or contains only whitespace }}
{{#ifeq: {{{1|+}}} | {{{1|-}}} | 1 is defined (and possibly empty or only-whitespace) | 1 is undefined }}
{{#ifeq: {{{1|/}}}{{{1|}}} | / | 1 is undefined | 1 is defined (and possibly empty or only-whitespace) }}
{{#if: {{#if: {{{1|/}}} | {{{1|}}} | / }} | 1 is defined (and possibly empty or only-whitespace) | 1 is undefined }}
Обратите внимание, что символы +
и -
могут быть любыми двумя разными непробельными символами. Кроме того, если вы просто хотите использовать значение параметра, когда он определен, и какое-то другое значение, когда он не определен, вы можете использовать более простую конструкцию "fallback":
{{{1|some other value}}}
{{#ifeq: {{{1|+}}} | {{{1|-}}} | 1 is defined {{#if: {{{1|}}} | and non-blank | and blank }} | 1 undefined }}
{{#if: {{{1|/}}} | {{#if:{{{1|}}} | 1 is defined and non-blank | 1 is undefined }} | 1 is defined and blank }}
Если вас не волнует случай undefined, вы можете удалить « |1 undefined
» в обоих примерах.
Синтаксис Wikitext изначально не позволяет создавать действительно вариативные шаблоны , а только псевдовариативные, которые проверяют входящие параметры по одному до определенного фиксированного количества. Однако это ограничение можно обойти, используя специальные модули. Для простых случаев {{ #invoke:separated entrys |main}} позволяет вслепую расширять все последовательные параметры и имеет возможность устанавливать пользовательские разделители. Для более сложных случаев {{ #invoke:params }} позволяет подсчитывать, перечислять, сопоставлять, фильтровать и распространять все входящие параметры, не зная заранее их количество.