Довідка:Функції парсера

У квітні 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.

Потім додайте в кінець файлу LocalSettings.php рядок

require_once( "$IP/extensions/ParserFunctions/ParserFunctions.php" );

Дерево коду можна подивитися тут:

Посилання

Див. також