Википеди:Парсера функцеш
Базовый набор функций парсера известен под названием magic words («волшебные слова», «магические слова»). См. также mw:Help:Extension:ParserFunctions и 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: 30 + 7 } = 37 |
- | Вычитание | {#expr: 30 - 7 } = 23 |
round | Округляет левый операнд до 1/10 в степени правого операнда | {#expr: 30 / 7 round 3 } = 4.286 {#expr: 30 / 7 round 0 } = 4 |
= | Равенство (численное и булево сравнение) | {#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-сущности Ло:Amp, Ло:Amp и Ло:Amp соответственно.
#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», «Изображение») проверяется наличие только локального файла, но не файла на Викискладе. Для проверки наличия доступного файла также и на Викискладе, нужно использовать префикс «Mediа:».
Пример (файл Example.png загружен только на Викисклад):
- {#ifexist: Файл:Example.png | есть | нет } вернёт нет
- {#ifexist: Изображение:Example.png | есть | нет } вернёт нет
- {#ifexist: Media:Example.png | есть | нет } вернёт есть
Если была создана локальная страница описания файла с Викисклада, все 3 варианта вернут «есть».
Также работает с параметрами шаблонов.
Количество вызовов этой функции на одной странице ограничено. Если страница преодолела это ограничение, она попадает в категорию Википедия:Страницы, в которых слишком много ifexist. Это необходимо каким-либо образом исправить.
#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 не сможет правильно сравнить её и значения. Для этого нужно обязательно в значениях (но необязательно в сравниваемой величине) использовать шаблон {{=}}, который содержит знак равенства, или код Ло:Amp:
- {#switch: 1=2
- | 1=2 = raw
- | 1<nowiki>=</nowiki>2 = nowiki
- | 1=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 | День месяца с нулём | 04 | 19 |
D | Краткое название дня недели | Пн | кхаьра |
j | День месяца без нуля | 4 | 19 |
l | Полное название дня недели | понедельник | кхаьра |
N | Номер дня недели ISO 8601 | 1 (понедельник) — 7 (воскресенье) | 3 |
w | Номер дня недели | 0 (воскресенье) — 6 (суббота) | 3 |
z | Номер дня года (начиная с 0) | 0—365 | 77 |
W | Номер недели ISO 8601 | 12 | |
F | Полное название месяца в именительном падеже | январь | тушола |
xg | Полное название месяца в родительном падеже | января | тушола |
m | Номер месяца с нулём | 01—12 | 03 |
M | Краткое название месяца | сен | тушола |
n | Номер месяца без нуля | 1—12 | 3 |
t | Количество дней в месяце | 28—31 | 31 |
L | Проверка, является ли год високосным | 1, если год високосный, иначе 0 | 0 |
Y | Год с 4 цифрами | 2006 | 2025 |
y | Год с 2 цифрами | 06 | 25 |
a | am или pm | am | |
A | AM или PM | AM | |
g | 12-часовой формат без 0 | 1—12 | 3 |
G | 24-часовой формат без 0 | 0—23 | 3 |
h | 12-часовой формат с 0 | 01—12 | 03 |
H | 24-часовой формат c 0 | 00—23 | 03 |
i | Минута с нулём | 00—59 | 44 |
s | Секунда с нулём | 00—59 | 28 |
c | ISO 8601 | 2025-03-19T03:44:28+00:00 | |
r | RFC 2822 | Wed, 19 Mar 2025 03:44:28 +0000 | |
U | UNIX-время | 1742355868 |
Расширение PHP cинтаксиса:
Символ | Описание |
---|---|
xn | Выводит следующий числовой код в ASCII число. Например, на языке хинди {#time: «H, xnH» } выведет «०६, 06». |
xr | Выводит следующий числовой код римскими цифрами (только для чисел <3000). Например, {#time: «Y, xrY» } выведет «2025, MMXXV». |
xx | Буква «x» |
Все другие символы будут выведены без изменений.
- Фраза, заключёная в двойные кавычки, будет выведена без изменений и кавычек. Незакрытые кавычки будут считаться символами.
- {#time: "Сегодня" l } → Сегодня кхаьра
- {#time: i's" } → 20'11"
- Наклонная черта влево работает так же, как и в PHP-функции date(). \H выводит H, \" выводит "Ло:Прояснить.
Формат параметра время идентичен используемому в PHP-функции strtotime(). Это могут быть абсолютные и относительные даты, например «December 11»[t 1] и/или «+10 hours», что может использоваться для перевода временных зон. Если вам нужно перевести в дату метку времени UNIX, поставьте перед ней @.
- {#time: j F Y | -14 days } → 5 тушола 2025 (14 дней назад)
- {#time: H:i | +4 hours } → 07:44 (UTC+4)
- {#time: H:i | 8:15 +6 hours } → 14:15
- {#time: r | @1483057398 } → Fri, 30 Dec 2016 00:23:18 +0000
- ↑ Русские даты типа «11 декабря» на данный момент не работают, если очень нужно их обработать, попробуйте шаблон {Date Converter}.
#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.
См. также
- Википедия:Механизм шаблонов
- Википедия:Шаблоны/Работа со строками
- Википедия:Переменные
- mw:Help:Extension:ParserFunctions — страница, откуда был переведён этот текст
- mw:Help:Magic_words/ru
- mw:Help:Magic_words/inh
История установки расширения
Расширение было написано Тимом Старлингом и установлено во всех проектах фонда «Викимедиа» в апреле 2006 года.