Википедия:Функции парсера

Короткая ссылка-перенаправление

Базовый набор функций парсера известен под названием magic words («волшебные слова», «магические слова»). См. также mw:Help:Extension:ParserFunctions/ru и mw:Extension:StringFunctions. Общий синтаксис функций парсера таков:

{{#функция: аргумент 1 | аргумент 2 | аргумент 3 ... }}

Если необходимо, чтобы значение, выдаваемое парсером, было частью таблицы, необходимо вместо символа вертикальной черты использовать шаблоны-подстановки — {{!-}}, {{!}}, {{!!}}, — которые адекватно воспринимается функциями парсера, и при формировании страницы движком MediaWiki раскрываются в символы, формирующие таблицу — |-, |, ||.

Для формирования таблицы можно также использовать язык HTML:

  • <table></table> — аналогично {|- и -|};
  • <tr> — начинает строку;
  • <td> — создает ячейку в строке…

Функции

#expr

Функция #expr производит математические вычисления над числами или переменными/параметрами, приводимыми к числам. Синтаксис:

{{#expr: выражение }}

Поддерживаются следующие операторы (перечислены в порядке, примерно соответствующем их приоритету):

ОператорДействиеПример
{{#expr: 123456789012345 }} = 1.2345678901234E+14

{{#expr: 0.000001 }} = 1.0E-6

()Операторы группирования{{#expr: (30 + 7) * 7 }} = 259
+Унарный знак +{{#expr: +30 * +7 }} = 210
-Унарный знак - (инвертирование знака){{#expr: -30 * -7 }} = 210
notУнарное либо логическое НЕ{{#expr: not 0 * 7 }} = 7
{{#expr: not 30+7 }} = 7
*Умножение{{#expr: 30 * 7 }} = 210
/Деление, эквивалент div{{#expr: 30 / 7 }} = 4.2857142857143
^Возведение в степень{{#expr: 3 ^ 2 }} = 9
divДеление, эквивалент / (целочисленного деления нет){{#expr: 30 div 7 }} = 4.2857142857143
{{#expr: 5 div 2 * 2 + 5 mod 2 }} = 6
modОстаток от деления, получается делением операндов, у которых отброшены дробные части
(обратите внимание, что div и mod работают не как в обычных языках программирования)
{{#expr: 30 mod 7 }} = 2

{{#expr: -8 mod -3 }} = -2
{{#expr: -8 mod +3 }} = -2
{{#expr: 8 mod 2.7 }} = 0
{{#expr: 8 mod 3.2 }} = 2
{{#expr: 8.9 mod 3 }} = 2

+Сложение{{#expr: 30 + 7 }} = 37
-Вычитание{{#expr: 30 - 7 }} = 23
roundОкругляет левый операнд до указанного числа цифр после запятой{{#expr: 30 / 7 round 3 }} = 4.286

{{#expr: 30 / 7 round 0 }} = 4
{{#expr: 3456 round -2 }} = 3500

=Равенство (численное и булево сравнение){{#expr: 30 = 7 }} = 0
<>Неравенство, эквивалент !={{#expr: 30 <> 7 }} = 1
!=Неравенство, эквивалент <> и логического xor{{#expr: 1 != 0 }} = 1
<Меньше{{#expr: 30 < 7 }} = 0
>Больше{{#expr: 30 > 7 }} = 1
<=Меньше или равно{{#expr: 30 <= 7 }} = 0
>=Больше или равно{{#expr: 30 >= 7 }} = 1
andЛогическое И{{#expr: 4 < 5 and 4 mod 2 }} = 0
orЛогическое ИЛИ{{#expr: 4 < 5 or 4 mod 2 }} = 1
sinСинус{{#expr: sin(1.57) }} = 0.99999968293183
cosКосинус{{#expr: cos(1.57) }} = 0.00079632671073326
tanТангенс{{#expr: tan(0) }} = 0

Это не все имеющиеся операторы. Более подробная документация по операторам функции — m:Help:Calculation.

Как всегда, лучше поставить лишние скобки, чем ломать голову с порядком вычисления.

На выводе логических переменных 0 означает ложь, а 1 — истину.

Например:

{{#expr: (100 - 32) / 9 * 5 round 0 }}

выдаёт: 38.

Произведено преобразование 100° по Фаренгейту в градусы по Цельсию с округлением до ближайшего целого числа.

#if

Функция #if («если») служит для создания конструкций вида if-then-else. Её синтаксис таков:

{{#if: тестовая строка | текст, если непуста | текст, если пуста }}

Если тестовая строка пуста или состоит только из пробелов, то возвращается «текст, если пуста»; в обратном случае возвращается «текст, если непуста». Последний параметр может быть опущен — в этом случае при пустой строке будет возвращена пустая строка.

Обратите внимание, что #if не поддерживает сравнение при помощи «=» и прочие математические операции. Так, {{#if: 1 = 2 | да | нет }} вернёт «да», так как строка 1 = 2 непуста. Для сравнения строк используйте #ifeq. Для сравнения чисел используйте #ifexpr.

Содержимое после вертикальных черт воспринимается как написанное с начала строки, поэтому символы *, #, :, ; и прочие на первой позиции преобразуются в соответствующие элементы вёрстки. Чтобы этого избежать, ставьте перед ними тег <nowiki/> или заменяйте на HTML-сущности &#42;, &#35;, &#58; и &#59; соответственно.

#ifeq

Функция #ifeq («if equal», «если равны») сравнивает две строки, возвращая ещё одну строку в зависимости от результата сравнения. Её синтаксис таков:

{{#ifeq: строка для сравнения 1 | строка для сравнения 2 | текст, если равны | текст, если не равны }}

#ifexist

Функция #ifexist («if exist», «если существует») похожа по синтаксису на #if, только вместо условия проверяется существование статьи с указанным заголовком. Проверка выполняется с учётом регистра после приведения проверяемого заголовка к каноническому виду (если в начале стоит строчная буква, то она преобразуется в прописную). Например:

{{#ifexist: User:Js | Участник есть | Участника нет }} вернёт Участник есть, поскольку страница User:Js существует.
{{#ifexist: user:js | Участник есть | Участника нет }} вернёт Участник есть, поскольку user:js при приведении к канонической форме даст User:Js.
{{#ifexist: User:JS | Участник есть | Участника нет }} вернёт Участника нет, поскольку страница User:JS не существует.

{{#ifexist}} не работает с относительными путями типа /подстраница.

Для пространства имён «Файл» (оно же «File», «Изображение») проверяется наличие только локального файла, но не файла на Викискладе. Для проверки наличия доступного файла также и на Викискладе, нужно использовать префикс «Media:».

Пример (файл Example.png загружен только на Викисклад):

{{#ifexist: Файл:Example.png | есть | нет }} вернёт нет
{{#ifexist: Изображение:Example.png | есть | нет }} вернёт нет
{{#ifexist: Media:Example.png | есть | нет }} вернёт есть

Если была создана локальная страница описания файла с Викисклада, все 3 варианта вернут «есть».

Также работает с параметрами шаблонов.

Количество вызовов этой функции на одной странице ограничено. Если оно превышено, страница попадает в категорию Википедия:Страницы со слишком большим количеством вызовов ресурсоёмких функций. Количество вызовов функции на странице необходимо снизить.

#ifexpr

#ifexpr вычисляет математическое выражение и возвращает одну из двух строк в зависимости от результата.

{{#ifexpr: выражение | текст, если истина | текст в противном случае }}

Математический синтаксис такой же, как у #expr.

#switch

#switch сравнивает одно значение со многими, возвращая результат, если найдено совпадение. Если совпадение не найдено, то возвращается указанный в конце записи результат по умолчанию (он обязательно должен быть последним). Наличие этого результата необязательно, и в случае отсутствия его и совпадений ничего возвращено не будет.

{{#switch: сравниваемая величина | значение1 = результат1 | значение2 = результат2 | ... | значениеn = результатn | результат по умолчанию}}

Если для нескольких значений должен быть одинаковый результат, то запись можно сократить:

{{#switch: сравниваемая величина | значение1a | значение1b | ... | значение1x = результат1 | значение2a | значение2b | ... | значение2y = результат2 | ... | значениеNa | значениеNb | ... | значениеNz = результатN | результат по умолчанию}}

#switch может использоваться вместо одного или нескольких #ifeq:

{{#switch: a | a = true | false }} даёт true
{{#ifeq: a | a | true | false }} даёт true

Если сравниваемая величина или значения содержит знак равенства (=), то #switch не сможет правильно сравнить её и значения. Для этого нужно обязательно в значениях (но необязательно в сравниваемой величине) использовать шаблон {{=}}, который содержит знак равенства, или код &#61;:

{{#switch: 1=2
 | 1=2 = raw
 | 1<nowiki>=</nowiki>2 = nowiki
 | 1&#61;2 = html
 | 1{{=}}2 = template
 | default
}}html

Если результат по умолчанию содержит знаки «=», перед ним можно написать #default = .

#time

#time — функция, позволяющая выводить время и дату в заданном формате. Синтаксис:

{{#time: формат }}{{#time: формат | время }}{{#time: формат | время | язык }}

Параметр время принимает дату в формате гггг-мм-чч, где гггг — год, мм — номер месяца, чч — число месяца. Если параметр не задан, то используется текущее время и дата.

Параметр язык принимает код языка по ISO 639-1. Если параметр не задан, то время и дата выводятся на русском языке.

Из-за кэширования возможно различие между реальным временем и отображаемым. Для ручного обновления сохраните страницу, не делая никаких изменений, или перейдите по адресу http://ru.wikipedia.org/wiki/Имя_страницы?action=purge (подробнее см. Википедия:Кэш#Чистить/актуализировать кэш сервера).

Параметр формат подобен используемому в PHP-функции date():

СимволОписаниеПримерТекущее значение
dДень месяца с нулём0428
DКраткое название дня неделиПнвс
jДень месяца без нуля428
lПолное название дня неделипонедельниквоскресенье
NНомер дня недели ISO 86011 (понедельник) — 7 (воскресенье)7
wНомер дня недели0 (воскресенье) — 6 (суббота)0
zНомер дня года (начиная с 0)0—365118
WНомер недели ISO 860117
FПолное название месяца в именительном падежеянварьапрель
xgПолное название месяца в родительном падежеянваряапреля
mНомер месяца с нулём01—1204
MКраткое название месяцасенапр
nНомер месяца без нуля1—124
tКоличество дней в месяце28—3130
LПроверка, является ли год високосным1, если год високосный, иначе 01
YГод с 4 цифрами20062024
yГод с 2 цифрами0624
aam или pmam
AAM или PMAM
g12-часовой формат без 01—122
G24-часовой формат без 00—232
h12-часовой формат с 001—1202
H24-часовой формат c 000—2302
iМинута с нулём00—5946
sСекунда с нулём00—5910
cISO 86012024-04-28T02:46:10+00:00
rRFC 2822Sun, 28 Apr 2024 02:46:10 +0000
UUNIX-время1714272370

Расширение PHP синтаксиса:

СимволОписание
xnВыводит следующий числовой код в ASCII число. Например, на языке хинди {{#time: «H, xnH» }} выведет «०६, 06».
xrВыводит следующий числовой код римскими цифрами (только для чисел <3000). Например, {{#time: «Y, xrY» }} выведет «2024, MMXXIV».
xxБуква «x»

Все другие символы будут выведены без изменений.

  • Фраза, заключённая в двойные кавычки, будет выведена без изменений и кавычек. Незакрытые кавычки считаются символами.
    • {{#time: "Сегодня" l }} → Сегодня воскресенье
    • {{#time: i's" }} → 46'10"
  • Наклонная черта влево работает так же, как и в PHP-функции date(). \H выводит H, \" выводит "[прояснить].

Формат параметра время идентичен используемому в PHP-функции strtotime(). Это могут быть абсолютные и относительные даты, например «December 11»[t 1] и/или «+10 hours», что может использоваться для перевода временных зон. Если вам нужно перевести в дату метку времени UNIX, поставьте перед ней @.

  • {{#time: j xg Y | -14 days }} → 14 апреля 2024 (14 дней назад)
  • {{#time: H:i | +4 hours }} → 06:46 (UTC+4)
  • {{#time: H:i | 8:15 +6 hours }} → 14:15
  • {{#time: r | @1483057398 }} → Fri, 30 Dec 2016 00:23:18 +0000

Число римскими цифрами

  • {{#time: xrU | 1970-1-1 + 61 second}} → LXI
  • {{#time: xrU | @62}} → LXII

Примечания

#rel2abs

Функция #rel2abs преобразует относительный путь ссылки в абсолютный.

{{#rel2abs: путь }}{{#rel2abs: путь | базовый путь }}

Под относительным путём принимается такой, который начинается с символов /, ./ или ../, а также пути .. и .

  • . — текущий уровень
  • .. — «перейти вверх на один уровень»
  • /foo — «перейти вниз на один уровень в поддиректорию „foo“»

Если базовый путь не указан, будет использован текущий.

  • {{#rel2abs: ../baz | Обсуждение:Foo/bar }} → Обсуждение:Foo/baz
  • Если, находясь на странице «Обсуждение:Foo/bar», вызвать {{#rel2abs: ../baz }}, результат будет «Обсуждение:Foo/baz».
  • Если, находясь на странице «Обсуждение:Foo», вызвать {{#rel2abs: ../baz }}, результат будет «baz».
  • Если, находясь на странице «Обсуждение:Foo», вызвать {{#rel2abs: ../../baz }}, результат будет «Ошибка: ошибочная глубина пути: «Обсуждение:Foo/../../baz» (попытка доступа к узлу, находящемуся выше, чем корневой)».

Чтобы не проверять, существует ли искомый путь, можно использовать эту функцию в комбинации с #ifexist:

{{#ifexist: {{#rel2abs: .. }} | «..» существует | «..» не существует }}

Если путь, передаваемый функции в качестве параметра, не идентифицирован как относительный путь, функция вернёт в качестве результата его. Например:

{{#rel2abs: Help:Help }} возвращает «Help:Help».

#titleparts

Функция #titleparts возвращает подстроку до нужного слэша. Основной целью является возможность получения страниц всех уровней, для которых данная является подстраницей.

{{#titleparts: название страницы | количество сегментов | начиная с (по умолчанию 1) }}

В случае, когда количество сегментов равно нулю, больше количества уровней статьи или его невозможно преобразовать в число, возвращается название страницы целиком (или с сегмента начиная с до конца, если он указан). Внимание: всегда, когда возвращается первый сегмент строки, он начинается с Заглавной буквы.

{{#titleparts: Обсуждение:Foo/bar/baz/quok }}Обсуждение:Foo/bar/baz/quok
{{#titleparts: Обсуждение:Foo/bar/baz/quok | 1 }}Обсуждение:Foo  См. также {{ROOTPAGENAME}}.
{{#titleparts: Обсуждение:Foo/bar/baz/quok | 2 }}Обсуждение:Foo/bar
{{#titleparts: Обсуждение:Foo/bar/baz/quok | 2 | 2 }}bar/baz
{{#titleparts: Обсуждение:Foo/bar/baz/quok | | 2 }}bar/baz/quok

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

{{#titleparts: Обсуждение:Foo/bar/baz/quok | -1 }}Обсуждение:Foo/bar/baz  Опускает один сегмент с конца строки. См. также {{BASEPAGENAME}}.
{{#titleparts: Обсуждение:Foo/bar/baz/quok | -4 }} Опускает все 4 сегмента с конца строки.
{{#titleparts: Обсуждение:Foo/bar/baz/quok | -5 }} Опускает 5 сегментов с конца строки (больше, чем существует).
{{#titleparts: Обсуждение:Foo/bar/baz/quok | | -1 }} quok  Возвращает последний сегмент. См. также {{SUBPAGENAME}}.
{{#titleparts: Обсуждение:Foo/bar/baz/quok | -1 | 2 }} bar/baz  Опускает последний сегмент с конца строки и возвращает второй сегмент и следующий.
{{#titleparts: Обсуждение:Foo/bar/baz/quok | -1 | -2 }} baz  Начинает копирование с второго сегмента с конца строки и опускает один сегмент с конца строки.

  • Если, находясь на странице «Участник: Foo/bar», вызвать {{#titleparts: {{FULLPAGENAME}} | 1 }}, результат будет «Участник:Foo».
  • Если, находясь на странице «Участник: Foo/bar», вызвать {{#titleparts: {{PAGENAME}} | 1 }}, результат будет «Foo».

Строки более 255 символов всегда возвращаются как переданы.

#iferror

{{#iferror: выражение | ошибка | удачно }}

Возвращает ошибку, если выражение содержит строку <strong class="error">, которая генерируется функциями #expr, #ifexpr, #time, #rel2abs и в некоторых других ситуациях в MediaWiki (такими как глубокая рекурсия). Это самый удобный способ отлавливать неправильный ввод, который должен быть передан некоторым другим функциям парсера. Например:

  • {{#iferror: {{#expr: 1+1 }} | неверный ввод | правильное выражение }}правильное выражение
  • {{#iferror: {{#expr: 1+Z }} | неверный ввод | правильное выражение }}неверный ввод

Последние два параметра необязательны. Если параметр удачно опущен, тогда в случае удачи будет возвращено выражение. Если параметр ошибка также опущен, тогда в случае ошибки не будет выведено ничего, а в случае удачного выполнения будет возвращено выражение.

  • {{#iferror: {{#expr: 1+1 }} | неверный ввод}}2
  • {{#iferror: {{#expr: 1+Z }} | неверный ввод}}неверный ввод
  • {{#iferror: {{#expr: 1+1 }} }}2
  • {{#iferror: {{#expr: 1+Z }} }}

Таким образом:

  • {{#iferror: викитекст | альтернатива }} значит «вывести викитекст, если он верный, иначе альтернативу».
  • {{#iferror: викитекст }} значит «вывести викитекст, если он верный».
Примечание: эта функциональность замещает баг в старом препроцессоре, позволявший использовать #switch для отлова ошибок в выражениях.

См. также: r29774, r29775, r29877.

#lst

Если вы хотите включить часть страницы pagename в другую, то механизм включения отдельных секций позволяет более гибко включать содержимое одних страниц в другие, чем полное включение страниц при помощи {{:pagename}} и <noinclude>. На странице, содержимое которой планируется включить в другую, начало секции помечается <section begin=label />, а конец секции помечается <section end=label />. На странице, куда включается секция ставится {{#lst:pagename|label}}.

Данный механизм позволяет отметить на включаемой странице несколько секций, причём они могут перекрываться.

См. также

История установки расширения

Расширение было написано Тимом Старлингом и установлено во всех проектах фонда «Викимедиа» в апреле 2006 года.

🔥 Top keywords: Заглавная страницаЯндексДуров, Павел ВалерьевичСлужебная:ПоискYouTubeЛунин, Андрей АлексеевичПодносова, Ирина ЛеонидовнаВКонтактеФоллаут (телесериал)WildberriesTelegramРеал Мадрид (футбольный клуб)Богуславская, Зоя БорисовнаДуров, Валерий СемёновичРоссияXVideosСписок умерших в 2024 годуЧикатило, Андрей РомановичFallout (серия игр)Список игроков НХЛ, забросивших 500 и более шайбПопков, Михаил ВикторовичOzon17 апреляИльин, Иван АлександровичMail.ruСёгун (мини-сериал, 2024)Слово пацана. Кровь на асфальтеПутин, Владимир ВладимировичЛига чемпионов УЕФАГагарина, Елена ЮрьевнаБишимбаев, Куандык ВалихановичЛига чемпионов УЕФА 2023/2024Турнир претендентов по шахматам 2024Манчестер СитиMGM-140 ATACMSРоссийский миротворческий контингент в Нагорном КарабахеЗагоризонтный радиолокаторПинапВодительское удостоверение в Российской Федерации