Функции парсера
- 1 year ago
- 0
- 0
Информация о расширениях на данной странице могла устареть.
Обновленная и более подробная информация находится на .
|
Базовый набор функций парсера известен под названием («волшебные слова», «магические слова»). См. также и . Общий синтаксис функций парсера таков:
{{#функция: аргумент 1 | аргумент 2 | аргумент 3 ... }}
Если необходимо, чтобы значение, выдаваемое парсером, было частью таблицы, необходимо вместо символа вертикальной черты использовать шаблоны-подстановки —
{{
!-
}} ,
{{
!
}} ,
{{
!!
}} , — которые адекватно воспринимается функциями парсера, и при формировании страницы движком MediaWiki раскрываются в символы, формирующие таблицу —
|-
,
|
,
||
.
Для формирования таблицы можно также использовать язык HTML :
<table></table>
— аналогично
{|-
и
-|}
;
<tr>
— начинает строку;
<td>
— создает ячейку в строке…
Функция #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 | Округляет левый операнд до указанного числа цифр после запятой |
{{#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 |
Это не все имеющиеся операторы. Более подробная документация по операторам функции — .
Как всегда, лучше поставить лишние скобки, чем ломать голову с порядком вычисления.
На выводе логических переменных 0 означает ложь, а 1 — истину.
Например:
{{#expr: (100 - 32) / 9 * 5 round 0 }}
выдаёт: 38.
Произведено преобразование 100° по Фаренгейту в градусы по Цельсию с округлением до ближайшего целого числа.
Функция #if («если») служит для создания конструкций вида if-then-else. Её синтаксис таков:
{{#if: тестовая строка | текст, если непуста | текст, если пуста }}
Если тестовая строка пуста или состоит только из пробелов, то возвращается «текст, если пуста» ; в обратном случае возвращается «текст, если непуста» . Последний параметр может быть опущен — в этом случае при пустой строке будет возвращена пустая строка.
Обратите внимание, что
#if
не поддерживает сравнение при помощи «=» и прочие математические операции. Так,
{{#if: 1 = 2 | да | нет }}
вернёт «да», так как строка
1 = 2
непуста. Для сравнения строк используйте
#ifeq
. Для сравнения чисел используйте
#ifexpr
.
Содержимое после вертикальных черт воспринимается как написанное с начала строки, поэтому символы
*
,
#
,
:
,
;
и прочие на первой позиции преобразуются в соответствующие элементы вёрстки. Чтобы этого избежать, ставьте перед ними тег
<nowiki/>
или заменяйте на HTML-сущности
*
,
#
,
:
и
;
соответственно.
Функция #ifeq («if equal», «если равны») сравнивает две строки, возвращая ещё одну строку в зависимости от результата сравнения. Её синтаксис таков:
{{#ifeq: строка для сравнения 1 | строка для сравнения 2 | текст, если равны | текст, если не равны }}
Функция #ifexist («if exist», «если существует») похожа по синтаксису на #if , только вместо условия проверяется существование статьи с указанным заголовком. Проверка выполняется с учётом регистра после приведения проверяемого заголовка к каноническому виду (если в начале стоит строчная буква, то она преобразуется в прописную). Например:
{{#ifexist}} не работает с относительными путями типа .
Для пространства имён «Файл» (оно же «File», «Изображение») проверяется наличие только локального файла, но не файла на Викискладе . Для проверки наличия доступного файла также и на Викискладе, нужно использовать префикс «Media:».
Пример (файл Example.png загружен только на Викисклад):
Если была создана локальная страница описания файла с Викисклада, все 3 варианта вернут «есть».
Также работает с параметрами шаблонов.
Количество вызовов этой функции на одной странице ограничено. Если оно превышено, страница попадает в категорию Википедия:Страницы со слишком большим количеством вызовов ресурсоёмких функций . Количество вызовов функции на странице необходимо снизить.
#ifexpr вычисляет математическое выражение и возвращает одну из двух строк в зависимости от результата.
{{#ifexpr: выражение | текст, если истина | текст в противном случае }}
Математический синтаксис такой же, как у #expr .
#switch сравнивает одно значение со многими, возвращая результат, если найдено совпадение. Если совпадение не найдено, то возвращается указанный в конце записи результат по умолчанию (он обязательно должен быть последним). Наличие этого результата необязательно, и в случае отсутствия его и совпадений ничего возвращено не будет.
{{#switch: сравниваемая величина | значение1 = результат1 | значение2 = результат2 | ... | значениеn = результатn | результат по умолчанию }}
Если для нескольких значений должен быть одинаковый результат, то запись можно сократить:
{{#switch: сравниваемая величина | значение1a | значение1b | ... | значение1x = результат1 | значение2a | значение2b | ... | значение2y = результат2 | ... | значениеNa | значениеNb | ... | значениеNz = результатN | результат по умолчанию }}
может использоваться вместо одного или нескольких :
Если сравниваемая величина или значения содержит знак равенства (
=
), то
#switch
не сможет правильно сравнить её и значения. Для этого нужно обязательно в значениях (но необязательно в сравниваемой величине) использовать шаблон
{{
=
}} , который содержит знак равенства, или код
=
:
Если
результат по умолчанию
содержит знаки «=», перед ним можно написать
#default =
.
#time — функция, позволяющая выводить время и дату в заданном формате. Синтаксис:
{{#time: формат }} {{#time: формат | время }} {{#time: формат | время | язык }}
Параметр время принимает дату в формате гггг-мм-чч , где гггг — год, мм — номер месяца, чч — число месяца. Если параметр не задан, то используется текущее время и дата.
Параметр язык принимает код языка по ISO 639 -1. Если параметр не задан, то время и дата выводятся на русском языке.
Из-за кэширования возможно различие между реальным временем и отображаемым. Для ручного обновления сохраните страницу, не делая никаких изменений, или перейдите по адресу http://ru.wikipedia.org/wiki/ Имя_страницы ?action=purge (подробнее см. Википедия:Кэш#Чистить/актуализировать кэш сервера ).
Параметр формат подобен используемому в PHP -функции :
Символ | Описание | Пример | Текущее значение |
---|---|---|---|
d | День месяца с нулём | 04 | 07 |
D | Краткое название дня недели | Пн | вт |
j | День месяца без нуля | 4 | 7 |
l | Полное название дня недели | понедельник | вторник |
N | Номер дня недели ISO 8601 | 1 (понедельник) — 7 (воскресенье) | 2 |
w | Номер дня недели | 0 (воскресенье) — 6 (суббота) | 2 |
z | Номер дня года (начиная с 0) | 0—365 | 310 |
W | Номер недели ISO 8601 | 45 | |
F | Полное название месяца в именительном падеже | январь | ноябрь |
xg | Полное название месяца в родительном падеже | января | ноября |
m | Номер месяца с нулём | 01—12 | 11 |
M | Краткое название месяца | сен | ноя |
n | Номер месяца без нуля | 1—12 | 11 |
t | Количество дней в месяце | 28—31 | 30 |
L | Проверка, является ли год високосным | 1, если год високосный, иначе 0 | 0 |
Y | Год с 4 цифрами | 2006 | 2023 |
y | Год с 2 цифрами | 06 | 23 |
a | am или pm | am | |
A | AM или PM | AM | |
g | 12-часовой формат без 0 | 1—12 | 5 |
G | 24-часовой формат без 0 | 0—23 | 5 |
h | 12-часовой формат с 0 | 01—12 | 05 |
H | 24-часовой формат c 0 | 00—23 | 05 |
i | Минута с нулём | 00—59 | 27 |
s | Секунда с нулём | 00—59 | 37 |
c | ISO 8601 | 2023-11-07T05:27:37+00:00 | |
r | Tue, 07 Nov 2023 05:27:37 +0000 | ||
U | UNIX-время | 1699334857 |
Расширение PHP синтаксиса:
Символ | Описание |
---|---|
xn | Выводит следующий числовой код в ASCII число. Например, на языке хинди {{#time: «H, xnH» }} выведет «०६, 06». |
xr | Выводит следующий числовой код римскими цифрами (только для чисел <3000). Например, {{#time: «Y, xrY» }} выведет «2023, MMXXIII». |
xx | Буква «x» |
Все другие символы будут выведены без изменений.
Формат параметра время идентичен используемому в PHP-функции . Это могут быть абсолютные и относительные даты, например «December 11» и/или «+10 hours», что может использоваться для перевода временных зон. Если вам нужно перевести в дату метку времени UNIX, поставьте перед ней @ .
Число римскими цифрами
Функция #rel2abs преобразует относительный путь ссылки в абсолютный.
{{#rel2abs: путь }} {{#rel2abs: путь | базовый путь }}
Под относительным путём принимается такой, который начинается с символов
/
,
./
или
../
, а также пути
..
и
.
.
— текущий уровень
..
— «перейти вверх на один уровень»
/foo
— «перейти вниз на один уровень в поддиректорию „foo“»
Если базовый путь не указан, будет использован текущий.
{{#rel2abs: ../baz | Обсуждение:Foo/bar }}
→ Обсуждение:Foo/baz
{{#rel2abs: ../baz }}
, результат будет «Обсуждение:Foo/baz».
{{#rel2abs: ../baz }}
, результат будет «baz».
{{#rel2abs: ../../baz }}
, результат будет «
Ошибка: ошибочная глубина пути: «Обсуждение:Foo/../../baz» (попытка доступа к узлу, находящемуся выше, чем корневой)
».
Чтобы не проверять, существует ли искомый путь, можно использовать эту функцию в комбинации с
#ifexist
:
{{#ifexist: {{#rel2abs: .. }} | «..» существует | «..» не существует }}
Если путь, передаваемый функции в качестве параметра, не идентифицирован как относительный путь, функция вернёт в качестве результата его. Например:
{{#rel2abs: Help:Help }}
возвращает «Help:Help».
Функция #titleparts возвращает подстроку до нужного слэша. Основной целью является возможность получения страниц всех уровней, для которых данная является подстраницей.
{{#titleparts: название страницы | количество сегментов | начиная с (по умолчанию 1) }}
В случае, когда количество сегментов равно нулю, больше количества уровней статьи или его невозможно преобразовать в число, возвращается название страницы целиком (или с сегмента начиная с до конца, если он указан). Внимание: всегда, когда возвращается первый сегмент строки, он начинается с Заглавной буквы.
{{#titleparts: Обсуждение:Foo/bar/baz/quok }}
→
Обсуждение:Foo/bar/baz/quok
{{#titleparts: Обсуждение:Foo /bar/baz/quok | 1 }}
→
Обсуждение:Foo
См. также
{{ }} .
{{#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
Опускает один сегмент с конца строки. См. также
{{ }} .
{{#titleparts: Обсуждение:Foo/bar/baz/quok | -4 }}
→
Опускает все 4 сегмента с конца строки.
{{#titleparts: Обсуждение:Foo/bar/baz/quok | -5 }}
→
Опускает 5 сегментов с конца строки (больше, чем существует).
{{#titleparts: Обсуждение:Foo/bar/baz/ quok | | -1 }}
→
quok
Возвращает последний сегмент. См. также
{{ }} .
{{#titleparts: Обсуждение:Foo/ bar/baz /quok | -1 | 2 }}
→
bar/baz
Опускает последний сегмент с конца строки и возвращает второй сегмент и следующий.
{{#titleparts: Обсуждение:Foo/bar/ baz /quok | -1 | -2 }}
→
baz
Начинает копирование с второго сегмента с конца строки и опускает один сегмент с конца строки.
{{#titleparts: {{FULLPAGENAME}} | 1 }}
, результат будет «Участник:Foo».
{{#titleparts: {{PAGENAME}} | 1 }}
, результат будет «Foo».
Строки более 255 символов всегда возвращаются как переданы.
{{#iferror: выражение | ошибка | удачно }}
Возвращает ошибку , если выражение содержит строку <strong class="error"> , которая генерируется функциями #expr , #ifexpr , #time , #rel2abs и в некоторых других ситуациях в MediaWiki (такими как глубокая рекурсия). Это самый удобный способ отлавливать неправильный ввод, который должен быть передан некоторым другим функциям парсера. Например:
Последние два параметра необязательны. Если параметр удачно опущен, тогда в случае удачи будет возвращено выражение . Если параметр ошибка также опущен, тогда в случае ошибки не будет выведено ничего, а в случае удачного выполнения будет возвращено выражение .
Таким образом:
См. также: , , .
Если вы хотите включить часть страницы
pagename
в другую, то механизм включения отдельных секций позволяет более гибко включать содержимое одних страниц в другие, чем полное включение страниц при помощи
{{:pagename}}
и
<
noinclude
>
. На странице, содержимое которой планируется включить в другую, начало секции помечается
< begin=
label
/>
, а конец секции помечается
< end=
label
/>
. На странице, куда включается секция ставится
{{#lst:pagename|label}}
.
Данный механизм позволяет отметить на включаемой странице несколько секций, причём они могут перекрываться.
Расширение было написано и установлено во всех проектах фонда «Викимедиа» в апреле 2006 года.