Копипаста:Функции парсера
Функции парсера (en ParserFunctions) — мощнейшее расширение для MediaWiki, добавляющее логические функции к парсеру движка MediaWiki. Данное расширение функций парсера было написано Тимом Старлингом и установлено во всех проектах фонда Викимедиа в апреле 2006 года. Также это расширение есть практически во всех энциклопедиях базирующихся движке MediaWiki, в то числе и здесь, на Лукоморье. Базовый набор функций парсера MediaWiki известен под названием Magic words («волшебные слова», «магические слова»). Более подробное описание функций парсера дано здесь.
Для того, чтобы активно использовать эти приспособления на сайте читаем эту, заимствованную с Википедии и, пока что, слегка модернизированную, инструкцию по применению. Вообще, если вы собираетесь хотя бы время от времени писать свои новые шаблоны, а может и дорабатывать существующие, то вам эта страница ещё не раз пригодится, поэтому советую запомнить её не сложный адрес или записать где-либо ещё для быстрого доступа. Вообще написание шаблонов с использованием ParserFunctions и волшебных слов в связке даёт отличный результат так как первое обеспечивает программную логику (по сути, это имитация языка программирования), а второе даёт лёгкий, и порой единственный, доступ к внешнему окружению страницы.
Всё очень просто. Если вы доучились в школе хотя бы так класса до 7-9 и изучали языки программирования (в частности для обычной школьной программы в подавляющем большинстве это Pascal и различные его диалекты), то понятие логики ParserFunctions у вас не вызовет затруднений.
Ниже приведена подробная разжёванная документация с примерами по «Функциям парсера MediaWiki», чуть ли не самая полная и лучшая документация в рунете.
Функции парсера — техническая документация с примерами[править]
Общий синтаксис функций парсера таков:
{{#функция: аргумент 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 |
Более подробная документация по операторам функции — en: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.
#ifeq:[править]
Функция ifeq сравнивает две строки, возвращая ещё одну строку в зависимости от результата сравнения. Её синтаксис таков:
{{ #ifeq: <строка для сравнения 1> | <строка для сравнения 2> | <текст, если равны> | <текст,
если не равны> }}
#ifexist:[править]
Функция ifexist похожа по синтаксису на if, только вместо условия проверяется существование статьи с указанным заголовком. Проверка выполняется с учётом регистра после приведения проверяемого заголовка к каноническому виду (если в начале стоит строчная буква, то она преобразуется в прописную). Например:
- {{#ifexist:User:Box|Участник есть|Участника нет}} вернёт Участника нет, поскольку страница User:Box существует.
- {{#ifexist:User:box|Участник есть|Участника нет}} вернёт Участника нет, поскольку user:box при приведении к канонической форме даст User:Box.
- {{#ifexist:User:BOX|Участник есть|Участника нет}} вернёт Участника нет, поскольку страница User:BOX не существует.
{{#ifexist}} не работает с относительными путями типа /подстраница.
Для пространства имён "Файл:" (также "File:", "Изображение:") проверяется наличие только локального файла, но не файла на Викискладе. Для проверки наличия доступного файла также и на Викискладе, нужно использовать префикс "Mediа:"
Пример (файл 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 не сможет правильно сравнить её и значения. Для этого нужно обязательно в значениях (но необязательно в сравниваемой величине) использовать шаблон {{=}}, который содержит знак равенства:
- {{#switch: 1=2
- | 1=2 = raw
- | 1<nowiki>=</nowiki>2 = nowiki
- | 1&#61;2 = html
- | 1{{=}}2 = template
- | default }} → template
#time:[править]
#time — функция, форматирующая время и дату. Синтаксис:
- {{ #time: format }}
или
- {{ #time: format | time }}
Если время не задано, то используется текущее.
Аргумент format подобен используемому в функции PHP
Символ | Описание | Пример | Текущее значение |
---|---|---|---|
d | День месяца с нулём. | 04 | 19 |
D | Краткое название дня недели. | Пн | Сб |
j | День месяца без нуля. | 4 | 19 |
l | Полное название дня недели. | понедельник | суббота |
N | Номер дня недели ISO 8601 | 1 (понедельник) — 7 (воскресенье) | 6 |
w | Номер дня недели | 0 (воскресенье) — 6 (суббота) | 6 |
z | Номер дня года (начиная с 0) | 0—365 | 108 |
W | Номер недели ISO 8601 | 16 | |
F | Полное название месяца в именительном падеже. | январь | апрель |
xg | Полное название месяца в родительном падеже. | января | апреля |
m | Номер месяца с нулём. | 01—12 | 04 |
M | Краткое название месяца. | сен | апр |
n | Номер месяца без нуля. | 1—12 | 4 |
t | Количество дней в месяце | 28—31 | 30 |
L | Проверка является ли год високосным | 1 если год високосный, иначе 0 | 0 |
Y | Год с 4 цифрами. | 2006 | 2025 |
y | Год с 2 цифрами. | 06 | 25 |
a | am или pm | pm | |
A | AM или PM | PM | |
g | 12-часовой формат без 0 | 1—12 | 12 |
G | 24-часовой формат без 0 | 0—23 | 12 |
h | 12-часовой формат с 0 | 01—12 | 12 |
H | 24-часовой формат c 0 | 00—23 | 12 |
i | Минута с нулём. | 00—59 | 52 |
s | Секунда с нулём. | 00—59 | 15 |
c | ISO 8601 | 2025-04-19T12:52:15+00:00 | |
r | Sat, 19 Apr 2025 12:52:15 +0000 | ||
U | UNIX-время | 1745067135 |
Расширение 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, \" выводит ".
Формат параметра time идентичен используемому в PHP strtotime(). Это могут быть абсолютные и относительные даты, например «December 11»[t 1] и/или «+10 hours», что может использоваться для перевода временных зон.
- {{ #time: j F Y | -14 days }} → 5 апрель 2025 (14 дней назад)
- {{ #time: H:i | +4 hours }} → 16:52 (UTC+4)
- {{ #time: H:i | 8:15 +6 hours }} → 14:15
- ↑ Русские даты типа «11 декабря» на данный момент не работают, если очень нужно их обработать, попробуйте шаблон {{DateRuToEn2}}.
#rel2abs:[править]
Функция #rel2abs преобразует относительный путь ссылки в абсолютный.
{{ #rel2abs: | path }}
Под относительным путём принимается такой, который начинается с символов '/', './' или '../', а также просто '..' или '.'.
Пример:
- Если находиться на стр. Help:Foo/bar и вызвать {{#rel2abs: ../baz}}, результатом должно стать Help:Foo/baz
- Если находиться на стр. Help:Foo и вызвать {{#rel2abs: ../baz}}, результатом должно стать baz
- Если находиться на стр. Help:Foo и вызвать {{#rel2abs: ../../baz}}, результатом должно стать Error: Invalid depth in path: "Help:Foo/../../baz" (tried to access a node above the root node)"
Чтобы не проверять, существует ли искомый путь, можно использоват эту функцию в комбинации с #ifexist:
- {{#ifexist: {{#rel2abs: ..}} | '..' exist | '..' does not exist}}
Если путь, передаваемый на вход функции в качестве параметра, не идентифицирован как относительный путь, функция его вернёт в качестве результата. Например:
- {{#rel2abs: Help:Help}} возвращает 'Help:Help'
#titleparts:[править]
Функция #titleparts возвращает подстроку до нужного слэша. Основной целью является возможность получения страниц всех уровней, для которых данная является подстраницей.
{{ #titleparts: Название | Количество_сегментов (по-умолчанию все) | Начать_с_сегмента (по-умолчанию с 1) }}
Параметры функции:
- Строка со слэшами (название страницы), которые делят строку на сегменты.
- Количество отбираемых сегментов, по-умолчанию берутся все сегменты.
- С какого сегмента начать отбирать. Отсчёт ведётся с единицы, то есть первый элемент это один, а не ноль как в большинстве языков программирования. По-умолчанию задано значение 1, то есть с самого начала строки.
В случае, когда параметр КолСегментов равен нулю, больше количества уровней статьи или его невозможно преобразовать в число, возвращается Название целиком (или с сегмента НачатьС до конца, если он указан). Внимание: всегда, когда возвращается первый сегмент строки, он начинается с Заглавной буквы.
Можно указывать отрицательные значения параметов: для КолСегментов это обозначает исключение из результата -КолСегментов последних частей (всех, если больше их количества), для НачатьС обозначает начало вывода с -НачатьС сегмента справа.
Пример:
- {{#titleparts:Статья/foo/bar|1}} вернёт результат результат Статья
- {{#titleparts:Статья/foo/bar|2}} вернёт результат результат Статья/foo
- {{#titleparts:Статья/foo/bar|1|2}} вернёт результат результат foo
- Если находиться на стр. Участник:Foo/bar и вызвать {{#titleparts:{{FULLPAGENAME}}|1}}, результатом должно стать Участник:Foo.
- Если находиться на стр. Участник:Foo/bar и вызвать {{#titleparts:{{PAGENAME}}|1}}, результатом должно стать Foo.
Строки более 255 символов всегда возвращаются как переданы.
Это функцию удобно использовать для получения базового корневого названия любой подстраницы, вот так: {{#titleparts:{{PAGENAME}}|1}}
.
#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 для отлова ошибок в выражениях.