У квітні 2006 року у всіх проєктах фонду «Вікімедіа» встановлено розширення ParserFunctions, написане Тімом Старлінгом.
Цей модуль містить набір функцій парсера. Загальний синтаксис цих функцій такий:
- {{#функція: аргумент 1 | аргумент 2 | аргумент 3…}}
Функції
#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
|
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:
Функція ifexist схожа за синтаксисом на if, тільки замість умови перевіряється існування сторінки з вказаним заголовком. Перевірка виконується з урахуванням регістру після приведення заголовка, що перевіряється, до канонічного вигляду (якщо на початку стоїть мала буква, то вона перетвориться на велику). Наприклад:
- {{#ifexist:Вікіпедія:Довідка|Існує|Немає}} поверне Існує, оскільки сторінка Вікіпедія:Довідка існує.
- {{#ifexist:вікіпедія:довідка|Існує|Немає}} поверне Існує, оскільки Вікіпедія:довідка при приведенні до канонічної форми дасть Вікіпедія:Довідка.
- {{#ifexist:Вікіпедія:ДОВідка|Існує|Немає}} поверне Немає, оскільки сторінка Вікіпедія:ДОВідка не існує.
{{#ifexist}} не працює з відносними шляхами типу /підсторінка.
#ifexpr:
ifexpr обчислює математичний вираз і повертає один з двох рядків залежно від результату.
{{ #ifexpr: <вираз> | <текст, якщо істина> | <текст інакше> }}
Якщо результат обчислень рівний нулю — повертається другий текст, інакше — перший. Математичний синтаксис такий же, як у expr.
#switch:
switch
порівнює одне значення з багатьма, повертаючи результат якщо знайдений збіг.
{{#switch: <comparison value>
| <value1> = <result1>
| <value2> = <result2>
| ...
| <valuen> = <resultn>
| <default result>
}}
#switch може використовуватися замість #ifeq:
- {{#switch:a | a=true | false }} дає true
- {{#ifeq:a | a | true | false }} дає true
#time:
#time — функція форматує час і дату. Синтаксис:
- {{ #time: format }}
або
- {{ #time: format | time }}
Якщо час не заданий, то використовується поточний.
Через кешування можлива відмінність між реальним часом і відображеним. Для ручного оновлення збережіть сторінку, не роблячи ніяких змін, або перейдіть за адресою http://uk.wikipedia.org/wiki/Назва_сторінки?action=purge
Аргумент format подібний до використовуваного у функції PHP date
Символ
|
Опис
|
Приклад
|
Поточне значення (очистити кеш для оновлення)
|
d
|
День місяця з нулем.
|
04
|
15
|
D
|
Коротка назва дня тижня.
|
Пн
|
Ср
|
j
|
День місяця без нуля.
|
4
|
15
|
l
|
Повна назва дня тижня.
|
понеділок
|
середа
|
N
|
Номер дня тижня ISO 8601
|
1 (понеділок) — 7 (неділя)
|
3
|
w
|
Номер дня тижня
|
0 (неділя) — 6 (субота)
|
3
|
z
|
Номер дня року (починаючи з 0)
|
0—365
|
14
|
W
|
Номер тижня ISO 8601
|
|
03
|
F
|
Повна назва місяця в називному відмінку.
|
січень
|
січень
|
xg
|
Повна назва місяця в родовому відмінку.
|
січня
|
січня
|
m
|
Номер місяця з нулем.
|
01—12
|
01
|
M
|
Коротка назва місяця.
|
вер
|
січ
|
n
|
Номер місяця без нуля.
|
1—12
|
1
|
t
|
Кількість днів в місяці
|
28—31
|
31
|
L
|
Перевірка чи є рік високосним
|
1 якщо рік високосний, інакше 0
|
0
|
Y
|
Рік з 4 цифрами.
|
2007
|
2025
|
y
|
Рік з 2 цифрами.
|
07
|
25
|
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-годинний формат з 0
|
00—23
|
09
|
i
|
Хвилина з нулем.
|
00—59
|
21
|
s
|
Секунда з нулем.
|
00—59
|
51
|
c
|
ISO 8601
|
|
2025-01-15T09:21:51+00:00
|
r
|
RFC 2822
|
|
Wed, 15 Jan 2025 09:21:51 +0000
|
U
|
UNIX-час
|
|
1736932911
|
Розширення PHP синтаксису:
Символ
|
Опис
|
xn
|
Виводить наступний числовий код в ASCII число. Наприклад, на мові хінді {{ #time:«H, xnH»}} виведе «०६, 06».
|
xr
|
Виводить наступний числовий код римськими цифрами (тільки для чисел <3000). Наприклад, {{ #time:«Y, xrY»}} виведе «2025, MMXXV».
|
xx
|
Буква «x»
|
Всі інші символи будуть виведені без змін.
- Фраза в подвійних лапках буде виведена без змін і лапок. Незакриті лапки вважатимуться символами.
- {{ #time: "Сьогодні" l}} → Сьогодні середа
- {{ #time:i’s"}} → 21’51"
- Похилена вліво риска працює так само як і з PHP date(). \H виводить H, \" виводить ".
Формат параметра time ідентичний використовуваному в PHP strtotime(). Це можуть бути абсолютні і відносні дати, наприклад «11 грудня» і/або «+10 hours», що може використовуватися для перекладу часових зон.
- {{ #time: j xg Y | -14 days }} → 1 січня 2025 (14 днів тому)
- {{ #time: H:i | +4 hours }} → 13:21 (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}}, результатом повинно стати Помилка: неправильна глибина шляху: «Help:Foo/../../baz» (спроба доступу до вузла, що знаходиться вище, ніж кореневий)
Щоб не перевіряти, чи існує шуканий шлях, можна використовувати цю функцію в комбінації з #ifexist:
- {{#ifexist: {{#rel2abs: ..}} | '..' exist | '..' does not exist}}
Якщо шлях, передаваний на вхід функції як параметр, не ідентифікований як відносний шлях, функція його поверне як результат. Наприклад:
- {{#rel2abs: Help:Help}} повертає 'Help:Help'
#titleparts:
Функція #titleparts повертає підрядок до потрібного слеша. Основною метою є можливість отримання сторінок всіх рівнів, для яких дана є підсторінкою.
{{ #titleparts: title | bits }}
У разі, коли параметр bits рівний нулю, більше кількості рівнів статті або його неможливо перетворити в число, повертається title
Приклад:
- {{#titleparts:Стаття/foo/bar|1}} поверне результат результат Стаття
- {{#titleparts:Стаття/foo/bar|2}} поверне результат результат Стаття/foo
- Якщо знаходитися на стор. Користувач:Foo/bar і викликати {{#titleparts:{{FULLPAGENAME}}|1}}, результатом повинно стати Користувач:Foo.
- Якщо знаходитися на стор. Користувач:Foo/bar і викликати {{#titleparts:{{PAGENAME}}|1}}, результатом повинно стати Foo.
#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: вікітекст }}
означає відображення вікітексту
при коректному вводі".
Інші
Встановлення
Заладуйте усі п'ять вказаних нижче файлів і встановіть їх у нову директорію ParserFunctions в директорії розширень MediaWiki.
Потім додайте в кінець файлу LocalSettings.php рядок
require_once( "$IP/extensions/ParserFunctions/ParserFunctions.php" );
Дерево коду можна подивитися тут:
Посилання
Див. також