stringtranslate.com

Помощь:Условные выражения

На этой странице описывается, как использовать различные функции синтаксического анализатора для отображения различных результатов на основе обнаруженных условий на странице или в шаблоне .

Вот краткий обзор этих функций с точки зрения того, как они обрабатывают входные данные (имена функций связаны с более подробными их описаниями, которые можно найти ниже на этой странице):

Информацию об использовании этих функций в таблицах см. в разделе Справка:Условные таблицы .

Краткое содержание

Базовый синтаксис (и использование) каждой функции следующий:

Обратите внимание, что «истина» интерпретируется строковой #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выбирает одну из двух альтернатив на основе истинности значения тестовой строки.

{{#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выбирает одну из двух альтернатив в зависимости от того, равны ли две тестовые строки друг другу.

{{#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выбирает между несколькими альтернативами на основе входной строки.

{{#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

Функция #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

Функция #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выбирает одну из двух альтернатив в зависимости от того, вызывает ли ее входная информация ошибку.

{{#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

Функция #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 }} позволяет подсчитывать, перечислять, сопоставлять, фильтровать и распространять все входящие параметры, не зная заранее их количество.

Смотрите также