Википедия:Функции парсера
Материал из Википедии — свободной энциклопедии
В апреле 2006 в во всех проектах фонда Викимедиа установлено расширение ParserFunctions, написанное Тимом Старлингом.
Этот модуль содержит набор функций парсера. Общий синтаксис этих функций таков:
- {{#функция: аргумент 1 | аргумент 2 | аргумент 3…}}
Содержание |
[править] Функции
[править] #expr:
Функция expr производит математические вычисления над числами или переменными/параметрами, приводимыми к числам. Синтаксис:
{{ #expr: выражение }}
Поддерживаются следующие операторы (перечислены в порядке, примерно соответствующем их приоритету):
Оператор | Действие | Пример |
---|---|---|
— | {{#expr: 123456789012345}} = 1.2345678901234E+14 | |
{{#expr: 0.000001}} = 1E-06 | ||
( ) | Операторы группирования | {{#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 |
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: -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}} = 23 |
round | Округляет число слева от себя до 1/10 в степени числа, указанного справа | {{#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}} = 1 |
and | Логическое И | {{#expr: 4<5 and 4 mod 2}} = 0 |
or | Логическое ИЛИ | {{#expr: 4<5 or 4 mod 2}} = 1 |
Как всегда, лучше поставить лишние скобки, чем ломать голову с порядком вычисления
Булевые операторы исходят из того, что 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:
[править] #ifexpr:
ifexpr вычисляет математическое выражение и возвращает одну из двух строк в зависимости от результата.
{{ #ifexpr: <выражение> | <текст, если истина> | <текст в противном случае> }}
Если результат вычислений равен нулю — возвращается второй текст, в противном случае — первый. Математический синтаксис такой же, как у expr.
[править] #switch:
[править] #time:
#time — функция форматирующая время и дату. Синтаксис:
- {{ #time: format }}
или
- {{ #time: format | time }}
Если время не задано то используется текущее.
Из-за кеширования возможно различие между реальным временем и отображаемым. Для ручного обновления сохраните страницу не делая никаких изменений, или перейдите по адресу http://ru.wikipedia.org/w/index.php?title=Имя_страници&action=purge
Аргумент format подобен используемому в функции PHP date
Символ | Описание | Пример | Текущее значение |
---|---|---|---|
d | День месяца с нулём. | 04 | 22 |
D | Краткое название дня недели. | Пн | Пт |
j | День месяца без нуля. | 4 | 22 |
l | Полное название дня недели. | понедельник | пятница |
N | Номер дня недели ISO 8601 | 1 (понедельник) — 7 (воскресенье) | 5 |
w | Номер дня недели | 0 (воскресенье) — 6 (суббота) | 5 |
z | Номер дня года (начиная с 0) | 0 — 365 | 355 |
W | Номер недели ISO 8601 | 51 | |
F | Полное название месяца в именительном падеже. | январь | декабрь |
xg | Полное название месяца в родительном падеже. | января | декабря |
m | Номер месяца с нулём. | 01 — 12 | 12 |
M | Краткое название месяца. | сен | дек |
n | Номер месяца без нуля. | 1 — 12 | 12 |
t | Количество дней в месяце | 28 — 31 | 31 |
L | Проверка является ли год високосным | 1 если год високосный, иначе 0 | 0 |
Y | Год с 4 цифрами. | 2006 | 2006 |
y | Год с 2 цифрами. | 06 | 06 |
a | am или pm | am | |
A | AM или PM | AM | |
g | 12-часовой формат без 0 | 1 — 12 | 9 |
G | 24-часовой формат без 0 | 0 — 23 | 9 |
h | 12-часовой формат с 0 | 01 — 12 | 09 |
H | 24-часовой формат c 0 | 00 — 23 | 09 |
i | Минута с нулём. | 00 — 59 | 25 |
s | Секунда с нулём. | 00 — 59 | 46 |
c | ISO 8601 | 2006-12-22T09:25:46+00:00 | |
r | RFC 2822 | Fri, 22 Dec 2006 09:25:46 +0000 | |
U | UNIX-время | 1166779546 |
Расширение PHP cинтаксиса:
Символ | Описание |
---|---|
xn | Выводит следующий числовой код в ASCII число. Например, на языке хинди {{ #time:«H, xnH»}} выведет «०६, 06». |
xr | Выводит следующий числовой код римскими цифрами (только для чисел <3000). Например, {{ #time:«Y, xrY»}} выведет «2006, MMVI». |
xx | Буква «x» |
Все другие символы будут выведены без изменений.
- Фраза заключёная в двойные кавычки будет выведена без изменений и кавычек. Незакрытые кавычки будут считаться символами.
- {{ #time: "Сегодня" l}} → Сегодня вторник
- {{ #time:i’s"}} → 20’11"
- Наклонная черта влево работает так же как и в PHP date(). \H выводит H, \" выводит ".
Формат параметра time идентичен используемому в PHP strtotime(). Это могут быть абсолютные и относительные даты, например «11 декабря» и/или «+10 hours», что может использоваться для перевода временных зон. GNU tar manual.
- {{ #time: j F Y | -14 days }} → 8 декабрь 2006 (14 дней назад)
- {{ #time: H:i | +4 hours }} → 13:25 (UTC+4)
- {{ #time: H:i | 8:15 +6 hours }} → 14:15
[править] #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'
[править] Установка
Скачайте все три указанных ниже файла и установите их в новую директорию ParserFunctions в директории расширений MediaWiki.
Затем добавьте в конец файла LocalSettings.php строку
require_once( "$IP/extensions/ParserFunctions/ParserFunctions.php" );
Дерево кода можно посмотреть тут: