Довідка:Функції парсера
У квітні 2006 року у всіх проєктах фонду «Вікімедіа» встановлено розширення ParserFunctions, написане Тімом Старлінгом.
Цей модуль містить набір функцій парсера. Загальний синтаксис цих функцій такий:
- {{#функція: аргумент 1 | аргумент 2 | аргумент 3…}}
Функція 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-then-else. Її синтаксис такий:
{{ #if: <умова> | <текст, якщо умова істинна> | <текст, якщо умова помилкова> }}
Якщо умова — порожній рядок або складається тільки з пропусків, вважається, що умова не виконана, і повертається текст, якщо умова помилкова; якщо задана умова істинна, то при його виконанні повертається текст, якщо умова істинна. Останній параметр може бути опущений — в цьому випадку за помилкової умови буде повернений порожній рядок.
Зверніть увагу, що if не підтримує порівняння за допомогою «=» і інших математичних операцій. Так, {{#if: 1 = 2|так|ні}} поверне «так», оскільки рядок «1 = 2» не порожній. Для порівняння рядків використовуйте ifeq. Для порівняння чисел використовуйте ifexpr.
Функція ifeq порівнює два рядки, повертаючи ще один рядок залежно від результату порівняння. Її синтаксис такий:
{{ #ifeq: <рядок для порівняння 1> | <рядок для порівняння 2> | <текст, якщо рівні> | <текст, якщо не рівні> }}
Функція ifexist схожа за синтаксисом на if, тільки замість умови перевіряється існування сторінки з вказаним заголовком. Перевірка виконується з урахуванням регістру після приведення заголовка, що перевіряється, до канонічного вигляду (якщо на початку стоїть мала буква, то вона перетвориться на велику). Наприклад:
- {{#ifexist:Вікіпедія:Довідка|Існує|Немає}} поверне Існує, оскільки сторінка Вікіпедія:Довідка існує.
- {{#ifexist:вікіпедія:довідка|Існує|Немає}} поверне Існує, оскільки Вікіпедія:довідка при приведенні до канонічної форми дасть Вікіпедія:Довідка.
- {{#ifexist:Вікіпедія:ДОВідка|Існує|Немає}} поверне Немає, оскільки сторінка Вікіпедія:ДОВідка не існує.
{{#ifexist}} не працює з відносними шляхами типу /підсторінка.
ifexpr обчислює математичний вираз і повертає один з двох рядків залежно від результату.
{{ #ifexpr: <вираз> | <текст, якщо істина> | <текст інакше> }}
Якщо результат обчислень рівний нулю — повертається другий текст, інакше — перший. Математичний синтаксис такий же, як у expr.
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: format }}
або
- {{ #time: format | time }}
Якщо час не заданий, то використовується поточний.
Через кешування можлива відмінність між реальним часом і відображеним. Для ручного оновлення збережіть сторінку, не роблячи ніяких змін, або перейдіть за адресою http://uk.wikipedia.org/wiki/Назва_сторінки?action=purge
Аргумент format подібний до використовуваного у функції PHP date
Символ | Опис | Приклад | Поточне значення (очистити кеш для оновлення) |
---|---|---|---|
d | День місяця з нулем. | 04 | 27 |
D | Коротка назва дня тижня. | Пн | Нд |
j | День місяця без нуля. | 4 | 27 |
l | Повна назва дня тижня. | понеділок | неділя |
N | Номер дня тижня ISO 8601 | 1 (понеділок) — 7 (неділя) | 7 |
w | Номер дня тижня | 0 (неділя) — 6 (субота) | 0 |
z | Номер дня року (починаючи з 0) | 0—365 | 300 |
W | Номер тижня ISO 8601 | 43 | |
F | Повна назва місяця в називному відмінку. | січень | жовтень |
xg | Повна назва місяця в родовому відмінку. | січня | жовтня |
m | Номер місяця з нулем. | 01—12 | 10 |
M | Коротка назва місяця. | вер | жов |
n | Номер місяця без нуля. | 1—12 | 10 |
t | Кількість днів в місяці | 28—31 | 31 |
L | Перевірка чи є рік високосним | 1 якщо рік високосний, інакше 0 | 1 |
Y | Рік з 4 цифрами. | 2007 | 2024 |
y | Рік з 2 цифрами. | 07 | 24 |
a | am або pm | am | |
A | AM або PM | AM | |
g | 12-годинний формат без 0 | 1—12 | 4 |
G | 24-годинний формат без 0 | 0—23 | 4 |
h | 12-годинний формат з 0 | 01—12 | 04 |
H | 24-годинний формат з 0 | 00—23 | 04 |
i | Хвилина з нулем. | 00—59 | 28 |
s | Секунда з нулем. | 00—59 | 57 |
c | ISO 8601 | 2024-10-27T04:28:57+00:00 | |
r | RFC 2822 | Sun, 27 Oct 2024 04:28:57 +0000 | |
U | UNIX-час | 1730003337 |
Розширення PHP синтаксису:
Символ | Опис |
---|---|
xn | Виводить наступний числовий код в ASCII число. Наприклад, на мові хінді {{ #time:«H, xnH»}} виведе «०६, 06». |
xr | Виводить наступний числовий код римськими цифрами (тільки для чисел <3000). Наприклад, {{ #time:«Y, xrY»}} виведе «2024, MMXXIV». |
xx | Буква «x» |
Всі інші символи будуть виведені без змін.
- Фраза в подвійних лапках буде виведена без змін і лапок. Незакриті лапки вважатимуться символами.
- {{ #time: "Сьогодні" l}} → Сьогодні неділя
- {{ #time:i’s"}} → 28’57"
- Похилена вліво риска працює так само як і з PHP date(). \H виводить H, \" виводить ".
Формат параметра time ідентичний використовуваному в PHP strtotime(). Це можуть бути абсолютні і відносні дати, наприклад «11 грудня» і/або «+10 hours», що може використовуватися для перекладу часових зон.
- {{ #time: j xg Y | -14 days }} → 13 жовтня 2024 (14 днів тому)
- {{ #time: H:i | +4 hours }} → 08:28 (UTC+4)
- {{ #time: H:i | 8:15 +6 hours }} → 14:15
Функція #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: 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: вираз | при помилці | якщо правильно }}
Повертає при помилці
якщо вираз містить <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" );
Дерево коду можна подивитися тут: