Довідка:Функції парсера
У квітні 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 | 01 |
D | Коротка назва дня тижня. | Пн | Ср |
j | День місяця без нуля. | 4 | 1 |
l | Повна назва дня тижня. | понеділок | середа |
N | Номер дня тижня ISO 8601 | 1 (понеділок) — 7 (неділя) | 3 |
w | Номер дня тижня | 0 (неділя) — 6 (субота) | 3 |
z | Номер дня року (починаючи з 0) | 0—365 | 0 |
W | Номер тижня ISO 8601 | 01 | |
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 | pm | |
A | AM або PM | PM | |
g | 12-годинний формат без 0 | 1—12 | 5 |
G | 24-годинний формат без 0 | 0—23 | 17 |
h | 12-годинний формат з 0 | 01—12 | 05 |
H | 24-годинний формат з 0 | 00—23 | 17 |
i | Хвилина з нулем. | 00—59 | 48 |
s | Секунда з нулем. | 00—59 | 41 |
c | ISO 8601 | 2025-01-01T17:48:41+00:00 | |
r | RFC 2822 | Wed, 01 Jan 2025 17:48:41 +0000 | |
U | UNIX-час | 1735753721 |
Розширення PHP синтаксису:
Символ | Опис |
---|---|
xn | Виводить наступний числовий код в ASCII число. Наприклад, на мові хінді { #time:«H, xnH»} виведе «०६, 06». |
xr | Виводить наступний числовий код римськими цифрами (тільки для чисел <3000). Наприклад, { #time:«Y, xrY»} виведе «2025, MMXXV». |
xx | Буква «x» |
Всі інші символи будуть виведені без змін.
- Фраза в подвійних лапках буде виведена без змін і лапок. Незакриті лапки вважатимуться символами.
- { #time: "Сьогодні" l} → Сьогодні середа
- { #time:i’s"} → 48’41"
- Похилена вліво риска працює так само як і з PHP date(). \H виводить H, \" виводить ".
Формат параметра time ідентичний використовуваному в PHP strtotime(). Це можуть бути абсолютні і відносні дати, наприклад «11 грудня» і/або «+10 hours», що може використовуватися для перекладу часових зон.
- { #time: j xg Y | -14 days } → 18 грудня 2024 (14 днів тому)
- { #time: H:i | +4 hours } → 21:48 (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: вікітекст }
означає відображеннявікітексту
при коректному вводі".
Інші
Функція | Опис |
---|---|
{#babel:code1|code2|...} | Відображає юзербокси ваших знань мов. Як його альтернатива — шаблон {Babel}. |
{#coordinates:arg1|arg2|...} | Зберігає географічні координати предмету у базу даних сторінок. Використано у шаблоні {coord}. |
{#invoke:module|function|arg1|arg2 |...} | Викликає (Lua) функцію в модулі Scribunto |
{#language:lang code 1|lang code 2} | відображає назву мови за мовним кодом її власною мовою, або мовою коду lang code2. |
{#property:arg1|arg2|...} | Включає властивість Вікіданих із прив'язаної сторінки (Вікіданих). Код властивості передається як аргумент. Напр. {#property:P21} виведе стать людини, якщо така властивість вказана на прив'язаній сторінці Вікіданих. Виклик {#property:P21|from=Q239864} повертає жіноча — стать Джун Гевок (на Вікіданих Q239864).
|
{#special:userlogin} = Спеціальна:Вхід
|
[MW1.? r17321+] Локальна назва наданої спеціальної сторінки. |
{#tag:tagname|content|attr1="val1"|attr2="val2"} =
<tagname attr1="val1" attr2="val2">content</tagname> |
[MW1.12+, r29482] Перетворює атрибути та вміст у тег в стилі XML. Дивіться також Дефект 2257 та Розширення:TagParser. |
{#target:fullpagename} | Send a message to a list talk pages on the fullpagename, using the MassMessage function. |
{int:pagename} | Transclude a page from the MediaWiki namespace interface according to the user's language preferences. Наприклад, a system message. |
Встановлення
Заладуйте усі п'ять вказаних нижче файлів і встановіть їх у нову директорію ParserFunctions в директорії розширень MediaWiki.
- Expr.php
- ParserFunctions.php
- ParserFunctions.i18n.php
- ParserFunctions.i18n.magic.php
- SprintfDateCompat.php
Потім додайте в кінець файлу LocalSettings.php рядок
require_once( "$IP/extensions/ParserFunctions/ParserFunctions.php" );
Дерево коду можна подивитися тут:
Посилання
- Обговорення Parserfunctions в архіві списку розсилки Wikitech-l (англ.)
- Розширення Parserfunctions введене в експлуатацію (англ.)