Википедия:Функции парсера
Базовый набор функций парсера известен под названием magic words («волшебные слова», «магические слова»). См. также mw:Help:Extension:ParserFunctions/ru и Module:String. Общий синтаксис функций парсера таков:
{{#функция: аргумент 1 | аргумент 2 | аргумент 3 ... }}
Если необходимо, чтобы значение, выдаваемое парсером, было частью таблицы, необходимо вместо символа вертикальной черты использовать шаблоны-подстановки — {{!-}}, {{!}}, {{!!}}, — которые адекватно воспринимается функциями парсера, и при формировании страницы движком MediaWiki раскрываются в символы, формирующие таблицу — |-, |, ||.
Для формирования таблицы можно также использовать язык HTML:
— аналогично{|-и-|};— начинает строку; — создает ячейку в строке… Функции
[править код]#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 }}= 210not Унарное либо логическое НЕ {{#expr: not 0 * 7 }}= 7{{#expr: not 30+7 }}= 7* Умножение {{#expr: 30 * 7 }}= 210/ Деление (целочисленного деления нет) {{#expr: 30 / 7 }}= 4.2857142857143{{#expr: 5 div 2 * 2 + 5 mod 2 }}= 6div ^ Возведение в степень {{#expr: 3 ^ 2 }}= 9mod Остаток от деления, получается делением операндов, у которых отброшены дробные части
(обратите внимание, что 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 }}= 23round Округляет левый операнд до указанного числа цифр после запятой {{#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 }}= 1and Логическое И {{#expr: 4 < 5 and 4 mod 2 }}= 0or Логическое ИЛИ {{#expr: 4 < 5 or 4 mod 2 }}= 1sin Синус {{#expr: sin(1.57) }}= 0.99999968293183cos Косинус {{#expr: cos(1.57) }}= 0.00079632671073326tan Тангенс {{#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-сущности*,#,:и;соответственно.#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не сможет правильно сравнить её и значения. Для этого нужно обязательно в значениях (но необязательно в сравниваемой величине) использовать шаблон {{=}}, который содержит знак равенства, или код=:{{#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 16 D Краткое название дня недели Пн пт j День месяца без нуля 4 16 l Полное название дня недели понедельник пятница N Номер дня недели ISO 8601 1 (понедельник) — 7 (воскресенье) 5 w Номер дня недели 0 (воскресенье) — 6 (суббота) 5 z Номер дня года (начиная с 0) 0—365 288 W Номер недели ISO 8601 42 F Полное название месяца в именительном падеже январь октябрь xg Полное название месяца в родительном падеже января октября m Номер месяца с нулём 01—12 10 M Краткое название месяца сен окт n Номер месяца без нуля 1—12 10 t Количество дней в месяце 28—31 31 L Проверка, является ли год високосным 1, если год високосный, иначе 0 0 Y Год с 4 цифрами 2006 2026 y Год с 2 цифрами 06 26 a am или pm am A AM или PM AM g 12-часовой формат без 0 1—12 2 G 24-часовой формат без 0 0—23 2 h 12-часовой формат с 0 01—12 02 H 24-часовой формат c 0 00—23 02 i Минута с нулём 00—59 20 s Секунда с нулём 00—59 50 c ISO 8601 2026-10-16T02:20:50+00:00 r RFC 2822 Fri, 16 Oct 2026 02:20:50 +0000 U UNIX-время 1792117250 Расширение PHP синтаксиса:
Символ Описание xn Выводит следующий числовой код в ASCII число. Например, на языке хинди {{#time: «H, xnH» }}выведет «०६, 06».xr Выводит следующий числовой код римскими цифрами (только для чисел <3000). Например, {{#time: «Y, xrY» }}выведет «2026, MMXXVI».xx Буква «x» Все другие символы будут выведены без изменений.
- Фраза, заключённая в двойные кавычки, будет выведена без изменений и кавычек. Незакрытые кавычки считаются символами.
{{#time: "Сегодня" l }}→ Сегодня пятница{{#time: i's" }}→ 20'50"
- Наклонная черта влево работает так же, как и в PHP-функции date().
\HвыводитH,\"выводит"[прояснить].
Формат параметра время идентичен используемому в PHP-функции strtotime(). Это могут быть абсолютные и относительные даты, например «December 11»[t 1] и/или «+10 hours», что может использоваться для перевода временных зон. Если вам нужно перевести в дату метку времени UNIX, поставьте перед ней
@.{{#time: j xg Y | -14 days }}→ 2 октября 2026 (14 дней назад){{#time: H:i | +4 hours }}→ 06:20 (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
Примечания
[править код]- ↑ Русские даты типа «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: выражение | ошибка | удачно }}
Возвращает ошибку, если выражение содержит строку
, которая генерируется функциями#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: викитекст }}значит «вывести викитекст, если он верный».
#lst
[править код]Если вы хотите включить часть страницы
pagenameв другую, то механизм включения отдельных секций позволяет более гибко включать содержимое одних страниц в другие, чем полное включение страниц при помощи{{:pagename}}и<noinclude>. На странице, содержимое которой планируется включить в другую, начало секции помечается<section begin=label />, а конец секции помечается<section end=label />. На странице, куда включается секция ставится{{#lst:pagename|label}}.Данный механизм позволяет отметить на включаемой странице несколько секций, причём они могут перекрываться.
См. также
[править код]История установки расширения
[править код]Расширение было написано Тимом Старлингом и установлено во всех проектах фонда «Викимедиа» в апреле 2006 года.