Это заготовка статьи.
Вы можете помочь проекту, дополнив и оформив её.
|
Данное расширение (lang-en|extension) функций парсера было написано Тимом Старлингом и установлено во всех проектах фонда Викимедиа в апреле 2006 года. Базовый набор функций парсера известен под названием 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: (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: 30 + 7}} = 37
|
-
|
Вычитание | {{#expr: 30 - 7}} = 23
|
round | Округляет число слева от себя до 1/10 в степени числа, указанного справа | {{#expr: 30 / 7 round 3}} = 4.286
|
= | Равенство (численное и булево сравнение) | {{#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=2 = html
| 1{{=}}2 = template
| default }}
→ html
#time:[]
#time
— функция, форматирующая время и дату. Синтаксис:
{{ #time: format }}
или
{{ #time: format | time }}
Если время не задано, то используется текущее.
Из-за кэширования возможно различие между реальным временем и отображаемым. Для ручного обновления сохраните страницу, не делая никаких изменений, или перейдите по адресу {{nc|1=<nowiki>http://ru.wikipedia.org/wiki/Имя_страницы?action=purge}}</nowiki>.
Аргумент format подобен используемому в функции ruwiki:PHP date
Символ | Описание | Пример | Текущее значение |
---|---|---|---|
d | День месяца с нулём. | 04 | 28 |
D | Краткое название дня недели. | Пн | чт |
j | День месяца без нуля. | 4 | 28 |
l | Полное название дня недели. | понедельник | четверг |
N | Номер дня недели ISO 8601 | 1 (понедельник) — 7 (воскресенье) | 4 |
w | Номер дня недели | 0 (воскресенье) — 6 (суббота) | 4 |
z | Номер дня года (начиная с 0) | 0—365 | 87 |
W | Номер недели ISO 8601 | 13 | |
F | Полное название месяца в именительном падеже. | январь | март |
xg | Полное название месяца в родительном падеже. | января | марта |
m | Номер месяца с нулём. | 01—12 | 03 |
M | Краткое название месяца. | сен | мар |
n | Номер месяца без нуля. | 1—12 | 3 |
t | Количество дней в месяце | 28—31 | 31 |
L | Проверка является ли год високосным | 1 если год високосный, иначе 0 | 1 |
Y | Год с 4 цифрами. | 2006 | 2024 |
y | Год с 2 цифрами. | 06 | 24 |
a | am или pm | am | |
A | AM или PM | AM | |
g | 12-часовой формат без 0 | 1—12 | 8 |
G | 24-часовой формат без 0 | 0—23 | 8 |
h | 12-часовой формат с 0 | 01—12 | 08 |
H | 24-часовой формат c 0 | 00—23 | 08 |
i | Минута с нулём. | 00—59 | 58 |
s | Секунда с нулём. | 00—59 | 16 |
c | ruwiki:ISO 8601 | 2024-03-28T08:58:16+00:00 | |
r | RFC 2822 | Thu, 28 Mar 2024 08:58:16 +0000 | |
U | ruwiki:UNIX-время | 1711616296 |
Расширение PHP cинтаксиса:
Символ | Описание |
---|---|
xn | Выводит следующий числовой код в ASCII число. Например, на языке ruwiki:хинди {{ #time:«H, xnH»}} выведет „०६, 06“.
|
xr | Выводит следующий числовой код римскими цифрами (только для чисел <3000). Например, {{ #time:«Y, xrY»}} выведет «2024, MMXXIV».
|
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 }}
→ 14 март 2024 (14 дней назад){{ #time: H:i | +4 hours }}
→ 12:58 (UTC+4){{ #time: H:i | 8:15 +6 hours }}
→ 14:15
- ↑ Русские даты типа «11 декабря» на данный момент не работают, если очень нужно их обработать, попробуйте шаблон {{tl|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) }}
В случае, когда параметр КолСегментов
равен нулю, больше количества уровней статьи или его невозможно преобразовать в число, возвращается Название
целиком (или с сегмента НачатьС
до конца, если он указан). Внимание: всегда, когда возвращается первый сегмент строки, он начинается с Заглавной буквы.
Можно указывать отрицательные значения параметов: для КолСегментов
это обозначает исключение из результата -КолСегментов
последних частей (всех, если больше их количества), для НачатьС
обозначает начало вывода с -НачатьС
сегмента справа.
Пример:
{{#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 символов всегда возвращаются как переданы.
#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.
См. также[]
- ruwiki:Википедия:Механизм шаблонов
- ruwiki:Википедия:Шаблоны/Работа со строками
- ruwiki:Википедия:Переменные
- ruwiki:mw:Help:Extension:ParserFunctions
- ruwiki:mw:Help:Magic_words/ru
История установки расширения[]
Расширение было написано Тимом Старлингом и установлено во всех проектах фонда «Викимедиа» в апреле 2006 года.
wiki:Help:Magic words#Parser functions
Главное | |
---|---|
Скрипты | |
Части ЛС | |
Занятное | |
Другое | |
В других проектах |