Help:Extension:ParserFunctions

This page is a translated version of the page Help:Extension:ParserFunctions and the translation is 99% complete.

Розширення ParserFunctions впроваджує одинадцять додаткових функцій парсера на додачу до "магічних слів ", які вже присутні у MediaWiki. (Можна налаштувати конфігурацію для впровадження інших функцій парсера для обробки текстових рядків; ці функції для рядків задокументовані в іншому місці .) Всі парсерні функції впроваджені цим розширенням мають таку форму:

{{#ім'я_функції: аргумент 1 | аргумент 2 | аргумент 3 … }}

#expr

Тип Оператори
Групування (круглі дужки) ( )
Числа 1234.5   e (2.718)   pi (3.142)
бінарний оператор e   унарний +,-
Унарні not ceil trunc floor abs exp ln sin cos tan acos asin atan
Бінарні ^
* / div mod
+ -
Округлення round
Логічні = != <> > < >= <=
and
or

Ця функція обчислює математичний вираз і повертає обчислене значення. Ця функція також доступна в Scribunto під назвою mw.ext.ParserFunctions.expr.

{{#expr: вираз }}

Всі доступні оператори перелічені в таблиці справа, в порядку пріорітету. Див. Help:Calculation для детальнішої інформації про роботу кожного з операторів. Точність та формат поверненого результуючого значення відрізняються в залежності від операційної системи сервера, на якому встановлена вікі, та від формату чисел загальноприйнятого для мови сайту.

У виразах, що використовують булеву алгебру, нуль приймає значення false, а всі інші значення, як додатні, так і від'ємні, приймають значення true:

{{#expr: 1 and -1 }}1
{{#expr: 1 and 0 }}0
{{#expr: 1 or -1 }}1
{{#expr: -1 or 0 }}1
{{#expr: 0 or 0 }}0

Отримавши на вході порожній вираз, функція повертає порожній рядок. Некоректні вирази призводять до повернення одного чи декількох повідомлень про помилку, які можна перехопити використовуючи функцію #iferror:

{{#expr: }}
{{#expr: 1+ }}Expression error: Missing operand for +.
{{#expr: 1 = }}Expression error: Missing operand for =.
{{#expr: 1 foo 2 }}Expression error: Unrecognized word "foo".

Порядок операторів додавання та віднімання перед чи після числа має значення і може бути сприйнятий як додатне чи від'ємне число, а не як вираз із помилкою:

{{#expr: +1 }}1
{{#expr: -1 }}-1
{{#expr: + 1 }}1
{{#expr: - 1 }}-1

Зверніть увагу, що при використання у виразі значення поверненого магічним словом, необхідно спочатку привести це значення до "сирого" формату щоб прибрати всі пробіли між цифрами і перевести цифри до арабських. Наприклад, {{NUMBEROFUSERS}} повертає значення 17 527 581, при тому що потрібним значенням є 17527581, яке можна отримати за допомогою {{formatnum :{{NUMBEROFUSERS}}|R}}. Це особливо важливо для деяких мов, де числа записуються не арабськими цифрами. Наприклад, для бенгальської мови {{NUMBEROFUSERS}} поверне ৩০,০৬১.

{{#expr:{{NUMBEROFUSERS}}+100}} Expression error: Unrecognized punctuation character " ".
{{#expr:{{formatnum:{{NUMBEROFUSERS}}|R}}+100}}17527681
  Увага: Оператор mod дає неправильні результати для деяких значень другого аргументу:
{{#expr: 123 mod (2^64-1)}}Division by zero. (повертає повідомлення про помилку, хоча має повернути 123)
Якщо необхідно здійснити обчислення із датами (наприклад, перевірити чи поточні дата і час є пізнішими ніж деякі задані дата і час), спершу переведіть час в кількість секунд що пройшли з 1 січня 1970 використовуючи {{#time: xNU }}, після чого можна просто віднімати та додавати дати як числа.

Округлення

Оператор округлення округляє число зліва від нього до 1/10 в степені числа справа (в якому дробова частина відкидається).

Для округлення до більшого чи меншого цілого значення використовуються унарні оператори ceil та floor відповідно.

Вираз Результат Метод округлення
{{#expr: 1/3 round 5 }} 0.33333 Остання цифра (3) є меншою за 5, тому округлення не відбувається (0.333333… → 0.33333)
{{#expr: 1/6 round 5 }} 0.16667 Остання цифра (6) є більшою за 5, тому округлення відбувається (0.166666… → 0.16667)
{{#expr: 8.99999/9 round 5 }} 1 І знову, результат округляється відповідно до останньої цифри і це призводить до додаткового округлення (0.999998… → 1.00000 → 1)
{{#expr: 1234.5678 round -2 }} 1200 Округлено до найближчого числа кратного 100, оскільки від'ємна експонента (число справа) округляє вліво від десяткової точки
{{#expr: 1234.5678 round 2 }} 1234.57 Округлено до найближчої сотої частини, оскільки додатня експонента (число справа) округляє вправо від десяткової точки
{{#expr: 1234.5678 round 2.3 }} 1234.57 Дробова частина експоненти не враховується і не впливає на результат округлення
{{#expr: trunc 1234.5678 }} 1234 Відкидання дробової частини
Округлення до найближчого цілого числа
{{#expr: 1/3 round 0 }} 0 Округлення до найближчого цілого числа, в даному випадку до нуля, який є меншим за вхідне значення
{{#expr: 1/2 round 0 }} 1 Округлення до найближчого цілого числа, в даному випадку до одиниці, яка є більшою за вхідне значення
{{#expr: 3/4 round 0 }} 1 Округлення до найближчого цілого числа, в даному випадку до одиниці, яка є більшою за вхідне значення
{{#expr: -1/3 round 0 }} -0 Округлення до найближчого цілого числа, в даному випадку до онуля, який є більшим за вхідне значення
{{#expr: -1/2 round 0 }} -1 Округлення до найближчого цілого числа, яке є від'ємним та меншим за вхідне значення
{{#expr: -3/4 round 0 }} -1 Округлення до найближчого цілого числа, яке є від'ємним та меншим за вхідне значення
Округлення до більшого чи меншого цілого значення за допомогою ceil та floor
{{#expr: ceil(1/3) }} 1 Округлення до наступного більшого цілого числа, в даному випадку до одиниці
{{#expr: floor(1/3) }} 0 Округлення до наступного меншого цілого числа, в даному випадку до нуля
{{#expr: ceil(-1/3) }} -0 Округлення до наступного більшого цілого числа, в даному випадку до нуля
{{#expr: floor(-1/3) }} -1 Округлення до наступного меншого цілого числа, яке є від'ємним
{{#expr: ceil 1/3 }} 0.33333333333333 Не округлено, оскільки 1 вже і так ціле число
  Увага: Інтерпретовано як (ceil 1)/3, а не ceil(1/3), як того можна очікувати

Текстові рядки

Математичні вирази можуть містити лише числа, вони не можуть порівнювати текстові рядки або символи. Для цього слід використовувати функцію #ifeq.

{{#expr: "a" = "a" }}Expression error: Unrecognized punctuation character """.
{{#expr: a = a }}Expression error: Unrecognized word "a".
{{#ifeq: a | a | 1 | 0 }}1

#if

Ця функція визначає чи є тестовий рядок порожнім чи ні. Текстовий рядок, що містить тільки пробільні символи, вважається порожнім.

{{#if: тестовий рядок | значення, якщо тестовий рядок не порожній | значення, якщо тестовий рядок порожній (або містить тільки пробільні символи) }}
{{#if: перший параметр | другий параметр | третій параметр }}

Спершу функція перевіряє чи не є перший параметр порожнім. Якщо він не порожній, функція виводить другий параметр. Якщо параметр порожній або містить тільки пробільні символи (пробіли, символи перенесення рядка тощо), функція виводить третій параметр.

{{#if: | yes | no}}no
{{#if: string | yes | no}}yes
{{#if:      | yes | no}}no
{{#if:


| yes | no}}
no

Тестовий рядок завжди інтерпретується як текстовий, математичні вирази не вираховуються:

{{#if: 1==2 | yes | no }}yes
{{#if: 0 | yes | no }}yes

Останній аргумент може бути відсутнім:

{{#if: foo | yes }} yes
{{#if: | yes }}
{{#if: foo | | no}}

Функція може бути вкладеною. Для цього внутрішня функція #if у повній формі розміщується на місці параметра охоплюючої функції #if. Допускається не більше семи рівнів вкладеності, хоча це може залежати від вікі або обмеження пам'яті.

{{#if: тестовий рядок | значення, якщо тестовий рядок не порожній | {{#if: тестовий рядок | значення, якщо тестовий рядок не порожній | значення, якщо тестовий рядок порожній (або містить тільки пробільні символи) }} }}

Також, можна використовувати параметр в якості тестового рядку у функції #if. Необхідно переконатися, що ви додано символ | (вертикальна риска) після імені змінної. (так що, якщо параметр не має значення, то він оцінюється в порожній рядок замість рядка «{{{1}}}»)

{{#if:{{{1|}}}|Ви ввели текст у змінній 1|Тексту у змінній 1 немає }}

Див. Help:Функції парсера в шаблонах для інших прикладів використання цієї функції парсера.

#ifeq

Ця функція парсера порівнює два введені рядки, визначає чи є вони ідентичними та повертає один з двох текстових рядків залежно від результату. Якщо вимагається більша кількість порівнянь і вихідних рядків, розгляньте використання #switch.

{{#ifeq: string 1 | string 2 | value if identical | value if different }}

Якщо обидва текстові рядки є числовими значеннями, вони порівнюються як числа:

{{#ifeq: 01 | 1 | equal | not equal}}equal
{{#ifeq: 0 | -0 | equal | not equal}}equal
{{#ifeq: 1e3 | 1000 | equal | not equal}}equal
{{#ifeq: {{#expr:10^3}} | 1000 | equal | not equal}}equal

В іншому разі порівнюється текст; це порівняння чутливе до регістру:

{{#ifeq: foo | bar | equal | not equal}}not equal
{{#ifeq: foo | Foo | equal | not equal}}not equal
{{#ifeq: "01" | "1" | equal | not equal}}not equal  (порівняти з подібним прикладом вище, без лапок)
{{#ifeq: 10^3 | 1000 | equal | not equal}}not equal  (порівняти з подібним прикладом вище, де #expr повертає дійсне число першим)

Як практичний приклад, розглянемо наявний шаблон Template:Timer, який використовує парсер для вибору між двома форматами часу: коротким та довгим. Він бере параметр як перший аргумент і порівнює з текстовим рядком «short» – порядок розміщення цих рядків не має значення, але легше читати якщо параметр іде першим. Код шаблону визначено як:

{{#ifeq: {{{1|}}} | short | 20 | 40 }}

і працює таким чином:

{{timer|short}}20
{{timer|20}}40
{{timer}}40
  Увага: #ifexpr не повідомляє про еквівалентні порівняння чисел за допомогою парсерів #ifeq і #switch. Два останні є точнішими за #ifexpr і не повертають еквівалентні результати.

Розгляньте ці порівняння зі зміненою останньою цифрою:

{{#ifeq: 12345678901234567 | 12345678901234568 | equal | not equal}}not equal
{{#switch: 12345678901234567 | 12345678901234568 = equal | not equal}}not equal

Оскільки PHP, що використовується в #ifeq і #switch, порівнює два числа цілочислового типу, то він коректно повертає очікуваний результат. Тоді як #ifexpr для тих самих чисел:

{{#ifexpr: 12345678901234567 = 12345678901234568 | equal | not equal}}equal

З іншою цифрою результат рівності дійсно некоректний.

Така поведінка #ifexpr пояснюється тим, що MediaWiki перетворює числа у виразах на числа з рухомою комою, що для великих чисел, як ті що використані в прикладі, передбачає деяку степінь округлення.


  Увага: При використанні всередині функції парсера, будь-які теги та інші функції парсера мають бути замінені на унікальний код . Це впливає на порівняння таким чином:
{{#ifeq: <nowiki>foo</nowiki> | <nowiki>foo</nowiki> | equal | not equal}}not equal
{{#ifeq: <math>foo</math> | <math>foo</math> | equal | not equal}}not equal
{{#ifeq: {{#tag:math|foo}} | {{#tag:math|foo}} | equal | not equal}}not equal
{{#ifeq: [[foo]] | [[foo]] | equal | not equal}}equal
Якщо текстові рядки які необхідно порівняти є однаковими викликами одного шаблону що містять теги, то повертається значення true, але у випадку виклику двох шаблонів із однаковим вмістом що містить теги, повертається false.


  Увага: Порівняння текстового рядка із магічним словом , яке повертає назву сторінки, може не спрацювати залежно від конфігурації сайту. Наприклад, {{FULLPAGENAME}}, залежно від вікі, може зробити першу літеру великою і замінити всі пробіли на знаки підкреслення.

Для обходу цього застосуйте магічне слово до обох параметрів:

{{#ifeq: {{FULLPAGENAME: L'Aquila}} | {{FULLPAGENAME}} | equal | not equal}}equal


#iferror

Функція приймає на вході текстовий рядок і повертає значення true якщо цей рядок містить об'єкт HTML із class="error", який був згенерований іншою функцією парсера, зокрема #expr, #time або #rel2abs, або був згенерований шаблоном з помилкою, такою як нескінченний цикл або рекурсія, або виник внаслідок іншої помилки.

{{#iferror: test string | value if error | value if correct }}

Один чи обидва текстові рядки для повернення, можуть бути пропущені. Якщо пропущено рядок correct, то замість нього буде повернено значення test string якщо воно не містить помилок. Якщо пропущено рядок error, то у випадку помилки буде повернений порожній текстовий рядок.

{{#iferror: {{#expr: 1 + 2 }} | error | correct }}correct
{{#iferror: {{#expr: 1 + X }} | error | correct }}error
{{#iferror: {{#expr: 1 + 2 }} | error }}3
{{#iferror: {{#expr: 1 + X }} | error }}error
{{#iferror: {{#expr: 1 + 2 }} }}3
{{#iferror: {{#expr: 1 + X }} }}
{{#iferror: {{#expr: . }} | error | correct }}correct
{{#iferror: <strong class="error">a</strong> | error | correct }}error

#ifexpr

Ця функція обчислює математичний вираз та повертає один з двох текстових рядків залежно від логічного значення результату:

{{#ifexpr: expression | value if true | value if false }}

Вираз expression обчислюється так само як і у функції #expr, з використанням тих самих операторів. Результат виразу, після цього, трактується як логічне значення.

Порожній вхідний вираз трактується як false:

{{#ifexpr: | yes | no}}no

Як сказано вище, нуль приймає значення false, а будь-яке ненульове значення приймає значення false, тому ця функція еквівалентна до використання #expr всередині #ifeq:

{{#ifeq: {{#expr: expression }} | 0 | value if false | value if true }}

за винятком порожнього виразу чи виразу із помилкою (повідомлення про помилку вважається порожнім рядком; воно не рівне нулю, тому застосовується value if true).

{{#ifexpr: = | yes | no }} Expression error: Unexpected = operator.

в порівнянні з

{{#ifeq: {{#expr: = }} | 0 | no | yes }} yes

Одне чи обидва значення для повернення, можуть бути пропущені; якщо значення пропущене, замість нього повертається порожній рядок:

{{#ifexpr: 1 > 0 | yes }}yes
{{#ifexpr: 1 < 0 | yes }}
{{#ifexpr: 0 = 0 | yes }} yes
{{#ifexpr: 1 > 0 | | no}}
{{#ifexpr: 1 < 0 | | no}} no
{{#ifexpr: 1 > 0 }}

Boolean operators of equality or inequality operators are supported.

{{#ifexpr: 0 = 0 or 1 = 0 | yes}}yes
{{#ifexpr: 0 = 0 and 1 = 0 | | no}}no

#ifexist

Ця функція бере на вході текстовий рядок, інтерпритує його як назву сторінку, та повертає один з двох текстових рядків залежно від того чи існує сторінка на цій вікі.

{{#ifexist: page title | value if exists | value if doesn't exist }}

Функція повертає true якщо сторінка існує, незалежно від того чи є на ній видимий вміст чи вона є порожньою (містить тільки метадані такі як посилання на категорії, магічні слова або перенаправлення , але не містить видимого вмісту, або ж і взагалі є повністю порожньою). Тільки сторінки які є "червоними посиланнями" повертають значення false, включаючи сторінки що існували раніше але були видалені.

{{#ifexist: Help:Extension:ParserFunctions/uk | exists | doesn't exist }}exists
{{#ifexist: XXHelp:Extension:ParserFunctions/ukXX | exists | doesn't exist }}doesn't exist

Функція повертає значення true системних повідомлень що були адаптовані та для спеціальних сторінок які задані програмним забезпеченням.

{{#ifexist: Special:Watchlist | exists | doesn't exist }}exists
{{#ifexist: Special:CheckUser | exists | doesn't exist }}exists (оскільки на цій вікі встановлене розширення Checkuser )
{{#ifexist: MediaWiki:Copyright | exists | doesn't exist }}exists (оскільки MediaWiki:Copyright було адаптовано)

Якщо на одній сторінці перевіряється існування другої за допомогою #ifexist:, то перша (та на якій перевіряється) з'явиться в списку Special:WhatLinksHere для другої (та яка перевіряється). Тому, якщо {{#ifexist:Foo }} було би включене до цієї сторінки, то Help:Extension:ParserFunctions/uk з'явилась би в списку Special:WhatLinksHere/Foo.

На вікі, які використовують спільний репозиторій медіафайлів (зокрема Вікісховище), функція #ifexist: може бути використана для перевірки того чи існує файл із такою назвою, і функція перевірить існування файлу на репозиторії, а не на самій вікі:

{{#ifexist: File:Example.png | exists | doesn't exist }}doesn't exist
{{#ifexist: Image:Example.png | exists | doesn't exist }}doesn't exist
{{#ifexist: Media:Example.png | exists | doesn't exist }}exists

Якщо була створена сторінка опису файла на цій вікі, то для всіх трьох попередніх прикладів результатом буде exists.

Функція #ifexist: не працює з міжмовними посиланнями (інтервікі).

Обмеження

Функція #ifexist: вважається "ресурсомісткою функцією парсера", тому кількість викликів цієї функції з однієї сторінки є обмеженою (включаючи виклики зроблені в шаблонах, що включаються до сторінки). Коли це обмеження перевищене, всі подальші виклики функції #ifexist: завжди повертатимуть "false", не залежно від того чи існує сторінка чи ні. Також, сторінки із таким перевищенням обмеження додаються до категорії спостереження Category:Pages with too many expensive parser function calls, чия назва може відрізнятися залежно від мови вікі.

Для деяких випадків можливо імітувати функцію "ifexist" за допомогою CSS, використовуючи селектори a.new (щоб вибрати посилання на неіснуючі статті) або a:not(.new) (щоб вибрати посилання на існуючі статті). Крім того, оскільки максимальна кількість викликів ресурсомістких функцій на одній сторінці вказана в $wgExpensiveParserFunctionLimit , то можна пвказати більшу кількість у файлі LocalSettings.php за потреби.

ifexist і бажані сторінки

Сторінку, яка не існує та випробовується для використання #ifexist, буде додано до Бажані сторінки. Див. task T14019 щодо причини цього й w:Template:Linkless exists за обхідним шляхом.

#rel2abs

Ця функція перетворює відносний шлях до файла на абсолютний.

{{#rel2abs: path }}
{{#rel2abs: path | base path }}

В аргументі path дійсним є наступний синтаксис:

  • . → поточний рівень
  • .. → піднятися на один рівень
  • /foo → опуститися на один рівень у піддиректорію /foo

Якщо base path не задано, замість нього буде використана повна назва поточної сторінки:

{{#rel2abs: /quok | Help:Foo/bar/baz }}Help:Foo/bar/baz/quok
{{#rel2abs: ./quok | Help:Foo/bar/baz }}Help:Foo/bar/baz/quok
{{#rel2abs: ../quok | Help:Foo/bar/baz }}Help:Foo/bar/quok
{{#rel2abs: ../. | Help:Foo/bar/baz }}Help:Foo/bar

Неправильний синтаксис, такий як /. або /./, ігнорується. Оскільки не більше двох повних зупинок поспіль дозволено, то послідовності на кшталт цих можуть бути використані для відокремлення послідовних інструкцій:

{{#rel2abs: ../quok/. | Help:Foo/bar/baz }}Help:Foo/bar/quok
{{#rel2abs: ../../quok | Help:Foo/bar/baz }}Help:Foo/quok
{{#rel2abs: ../../../quok | Help:Foo/bar/baz }}quok
{{#rel2abs: ../../../../quok | Help:Foo/bar/baz }}Error: Invalid depth in path: "Help:Foo/bar/baz/../../../../quok" (tried to access a node above the root node).

#switch

Див. також: w:Help:Switch parser function

Ця функція порівнює вхідний аргумент із декількома текстовими рядками, і якщо збіг знайдено, повертає значення поставлене у відповідність до знайденого рядка.

{{#switch: comparison string
 | case = result
 | case = result
 | ...
 | case = result
 | default result
}}

Приклади:

{{#switch: baz | foo = Foo | baz = Baz | Bar }} Baz
{{#switch: foo | foo = Foo | baz = Baz | Bar }} Foo
{{#switch: zzz | foo = Foo | baz = Baz | Bar }} Bar

Функція #switch з тегами частково включення може використовуватись в конфігураційних файлах, що дає змогу користувачам незнайомим з шаблонами переглядати та змінювати конфігуровані елементи.

За замовчуванням

Результат за замовчуванням повертається якщо жоден випадок не збігається із рядком для порівняння:

{{#switch: test | foo = Foo | baz = Baz | Bar }} Bar

У цьому синтаксисі результат за замовчуванням повинен бути останнім параметром і не повинен містити сирий знак рівності (знак рівності без {{}}). Якщо це так, то розглядатиметься як порівняння випадків, і жодний текст не виводитиметься, якщо жодний випадок не відповідає. Це тому що значення за замовчуванням не було визначене (порожнє). Проте, якщо випадок відповідає, то асоційований із ним рядок буде повернуто.

{{#switch: test | Bar | foo = Foo | baz = Baz }} →
{{#switch: test | foo = Foo | baz = Baz | B=ar }} →
{{#switch: test | test = Foo | baz = Baz | B=ar }} → Foo

Або можна прямо вказати результат за замовчуванням вказавши "#default" в якості випадку.

{{#switch: comparison string
 | case = result
 | case = result
 | ...
 | case = result
 | #default = default result
}}

Результати за замовчуванням вказані таким способом можна розмістити будь-де всередині функції:

{{#switch: test | foo = Foo | #default = Bar | baz = Baz }} Bar

Якщо результат за замовчуванням не вказано і не знайдено випадку що збігається із рядком для порівняння, повертається порожній рядок:

{{#switch: test | foo = Foo | baz = Baz }}

Групування результатів

Можна зробити "провалювання" (об'єднання) одних випадків в інші. Тоді декілька випадків повернуть той самий результат. Це мінімізує повторення коду.

{{#switch: comparison string
 | case1 = result1
 | case2 
 | case3 
 | case4 = result234
 | case5 = result5
 | case6 
 | case7 = result67
 | #default = default result
}}

Тут випадки 2, 3 та 4 повертають однаковий результат result234; Обоє випадки 6 та 7 повернуть result67. «#default = » в останньому параметрі може бути опущений у вищенаведеному випадку.

Використання з параметрами

Функція може бути використана з параметрами як тестовий рядок. У цьому випадку необов'язково розміщувати вертикальну риску після імені параметру, оскільки дуже малоймовірно, що ви виберете встановити випадок із рядком «{{{parameter name}}}». (Це значення, яке параметр матиме за замовчуванням, якщо вертикальна риска відсутня, а параметр не існує чи має значення. Див. Help:Функції парсера в шаблонах .)

{{#switch: {{{1}}} | foo = Foo | baz = Baz | Bar }}

У вищенаведеному випадку якщо {{{1}}} дорівнює foo, то функція поверне Foo. Якщо ж дорівнює baz, то функція поверне Baz. Якщо параметр порожній або не існує, то функція поверне Bar.

Як у розділі вище, випадки можуть поєднуватися й давати єдиний результат.

{{#switch: {{{1}}} | foo | zoo | roo = Foo | baz = Baz | Bar }}

Тут, якщо {{{1}}} дорівнює foo, zoo чи roo, то функція поверне Foo. Якщо ж дорівнює baz, то функція поверне Baz. Якщо параметр порожній або не існує, то функція поверне Bar.

На додачу, результат за замовчуванням може бути опущений, якщо ви не бажаєте нічого повертати, якщо значення тестового параметру не відповідає жодному випадку.

{{#switch: {{{1}}} | foo = Foo | bar = Bar }}

У цьому випадку функція повертає порожній рядок, якщо {{{1}}} не існує чи не дорівнює foo або bar, у цьому випадку вона повертає Foo або Bar.

Це має той самий ефект, що й оголошення порожнім результату за замовчуванням.

{{#switch: {{{1}}} | foo | zoo | roo = Foo | baz = Baz | }}

Якщо з деяких причин ви вирішили встановити випадок як «{{{parameter name}}}», то функція поверне результат такого випадку, коли параметр не існує чи не має значення. Параметр повинен існувати та мати будь-яке значення, крім рядка «{{{parameter name}}}» для повернення результату функції за замовчуванням.

(якщо {{{1}}} не існує чи порожнє)
{{#switch: {{{1}}} | {{{1}}} = Foo | baz = Baz | Bar }} Foo
(якщо {{{1}}} має значення "test"):
{{#switch: {{{1}}} | {{{1}}} = Foo | baz = Baz | Bar }} Bar
(якщо {{{1}}} має значення "{{{1}}}"):
{{#switch: {{{1}}} | {{{1}}} = Foo | baz = Baz | Bar }} Foo


В такому гіпотетичному випадку слід додати до параметра вертикальну риску ({{{1|}}}).

Нюанси порівняння

Так само як і в #ifeq, якщо рядок для порівнянна та випадок є числами, вони порівнюються як числа. В іншому випадку вони вважаються текстовими рядками чутливими до реєстру:

{{#switch: 0 + 1 | 1 = one | 2 = two | three}} → three
{{#switch: {{#expr: 0 + 1}} | 1 = one | 2 = two | three}} → one
{{#switch: a | a = A | b = B | C}} → A
{{#switch: A | a = A | b = B | C}} → C

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

{{#switch: | = Nothing | foo = Foo | Something }}Nothing

Як тільки знайдено збіг, всі подальші випадки ігноруються:

{{#switch: b | f = Foo | b = Bar | b = Baz | }}Bar
  Увага: Порівняння чисел в #switch та #ifeq здійснюються відмінно від того як це робиться у математичних виразах (див. вище):
{{#switch: 12345678901234567 | 12345678901234568 = A | B}} → B
{{#ifexpr: 12345678901234567 = 12345678901234568 | A | B}} → A


Буквальне включення знаку рівності

Текстові рядки випадків не можуть містити знаків рівності. Щоб обійти це обмеження, створіть шаблон {{=}} що міститиме лише знак рівності - =, або замість символу рівності вставте його HTML-код &#61;.

Приклад:

{{#switch: 1=2
 | 1=2 = raw
 | 1<nowiki>=</nowiki>2 = nowiki
 | 1{{=}}2 = template
 | default
}}template


{{#switch: 1=2
 | 1&#61;2 = html
 | default
}}html
Реальний простий приклад використання функції "#switch" можна побачити в шаблоні Template:NBA color. Двома складнішими прикладами є Template:Extension та w:Template:BOTREQ.

Заміна #ifeq

Функція #switch може використовуватись для зниження рівня вкладеності.

Наприклад:

  • {{#switch:{{{1}}} |condition1=branch1 |condition2=branch2 |condition3=branch3 |branch4}}

є еквівалентними до

  • {{#ifeq:{{{1}}}|condition1 |branch1 |{{#ifeq:{{{1}}}|condition2 |branch2 |{{#ifeq:{{{1}}}|condition3 |branch3 |branch4}}}}}}

тобто глибокого вкладення, лінійного:

{{#ifeq:{{{1}}}|condition1
  |<!--then-->branch1
  |<!--else-->{{#ifeq:{{{1}}}|condition2
                |<!--then-->branch2
                |<!--else-->{{#ifeq:{{{1}}}|condition3
                              |<!--then-->branch3
                              |<!--else-->branch4}}}}}}

З іншого боку, заміна switch може бути складною чи непрактичною для IF, вкладених в обидві гілки (показано з альтернативами відступів з обох боків), утворюючи повне симетричне дерево:

{{#ifeq:{{{1}}}|condition1
 |<!--then-->branch1t{{
  #ifeq:{{{1}}}|condition2
   |<!--then-->branch1t2t{{#ifeq:{{{1}}}|condition4|<!--then-->branch1t2t4t|<!--else-->branch1t2t4e}}
   |<!--else-->branch1t2e{{#ifeq:{{{1}}}|condition5|<!--then-->branch1t2e5t|<!--else-->branch1t2e5e}}
  }}
 |<!--else-->branch1e{{#ifeq:{{{1}}}|condition3
   |<!--then-->branch1e3t{{#ifeq:{{{1}}}|condition6|branch1e3t6t|branch1e3t6e}}
   |<!--else-->branch1e3e{{
    #ifeq:{{{1}}}|condition7
     |branch1e3e7t
     |branch1e3e7t
    }}
  }}
}}

#time

Ця функція парсера приймає дату та/або час (за Грегоріанським календарем) і форматує їх відповідно до заданого синтаксису. Можна задати об'єкт дати/часу; за замовчуванням береться значення магічного слова {{CURRENTTIMESTAMP}}, яке містить час коли поточна сторінка в останнє трансформувалась в HTML.

{{#time: format string }}
{{#time: format string | date/time object }}
{{#time: format string | date/time object | language code }}
{{#time: format string | date/time object | language code | local }}

Список допустимих кодів форматування наведено в таблиці справа. Будь-який символ в текстовому рядку для форматування, який не розпізнано, включається до результату без змін; це стосується також і пробілів (для інтерпритації коду системі вони не потрібні). Існує два способи уникнення трактування символу як коду форматування:

  1. Обернена коса риска після якої йде символ, трактується як просто цей символ;
  2. Символи всередині подвійних лапок так і залишаються символами, а лапки відкидаються.

До того ж, подвійний символ xx трактується я один символ "x".

As the list of formatting codes continues to evolve (with the support of new calendars, or of new date fields computed and formatted differently), you should escape all literal characters (not just ASCII letters currently used by formatting codes) that need to be passed through unaltered.

Unfortunately, for now, the ASCII single quote is still not recognized as a simple alternative for marking literal text to the currently supported ASCII double quotes (for example, double quotes are mandatory for in other uses like the delimitation of string values in JSON, C, C++...) and backslashes (which have to be escaped as well in string constants used by many languages, including JSON, C, C++, PHP, JavaScript, Lua). So you still cannot embed any literal double quote without escaping it with a backslash (or you can use other curly, angular or square quotation marks instead).

{{#time: Y-m-d }}2021-09-25
{{#time: [[Y]] m d }}2021 09 25
{{#time: [[Y (year)]] }}2021 (21UTCamSat, 25 Sep 2021 04:48:48 +0000)
{{#time: [[Y "(year)"]] }}2021 (year)
{{#time: i's" }}48'48"

Об'єкт дати/часу можна задавати в будь-якому форматі який допускається у функції strtotime() мови PHP. Час можна вказувати як абсолютно (наприклад 20 December 2000), так і відносно (наприклад +20 hours, тобто "+20 годин").

{{#time: r|now}}Sat, 25 Sep 2021 04:48:49 +0000
{{#time: r|+2 hours}}Sat, 25 Sep 2021 06:48:49 +0000
{{#time: r|now + 2 hours}}Sat, 25 Sep 2021 06:48:49 +0000
{{#time: r|20 December 2000}}Wed, 20 Dec 2000 00:00:00 +0000
{{#time: r|December 20, 2000}}Wed, 20 Dec 2000 00:00:00 +0000
{{#time: r|2000-12-20}}Wed, 20 Dec 2000 00:00:00 +0000
{{#time: r|2000 December 20}}Error: Invalid time.

Код мови у форматі ISO 639-3 дозволяє відобразити результат обраною мовою:

{{#time:d F Y|1988-02-28|nl}}28 februari 1988
{{#time:l|now|uk}}субота
{{#time:d xg Y|20 June 2010|pl}}20 czerwca 2010

Параметр local визначає, чи об'єкт дата/час позначає місцевий часовий пояс, чи UTC.

Це булеві параметри: їхнє значення визначається приведенням значення аргументу (докладніше про приведення рядків до булевих значень див. офіційну документацію PHP).

Зверніть, будь ласка, увагу на те, що, якщо змінну $wgLocaltimezone встановлено в UTC, то немає різниці у виведенні, коли local встановлено у true чи false.

Докладніше див. наступні приклади:

{{#time: Y F d H:i:s|now|it|0}}2021 settembre 25 04:48:49
{{#time: Y F d H:i:s|now|it|1}}2021 settembre 25 04:48:49
{{#time: Y F d H:i:s|+2 hours||0}}2021 вересень 25 06:48:49
{{#time: Y F d H:i:s|+2 hours||1}}2021 вересень 25 06:48:49
{{#time:c|2019-05-16T17:05:43+02:00|it}}2019-05-16T15:05:43+00:00
{{#time:c|2019-05-16T17:05:43+02:00|it|0}}2019-05-16T15:05:43+00:00
{{#time:c|2019-05-16T17:05:43+02:00|it|true}}2019-05-16T15:05:43+00:00

Час Unix можна використовувати для підрахунку дати, якщо поставити перед ним символ @.

{{#time: U | now }}1632545329
{{#time: r | @1632545328 }}Sat, 25 Sep 2021 04:48:48 +0000
  Увага: Без вказання символу @ перед часом Unix, результатом зазвичай буде помилка, або ж неочікуване значення:
{{#time: r | 1970-01-01 00:16:39 }}Thu, 01 Jan 1970 00:16:39 +0000
{{#time: U | 1970-01-01 00:16:39 }}999
{{#time: r | @999 }}Thu, 01 Jan 1970 00:16:39 +0000 (правильний результат)
{{#time: r | 999 }}Error: Invalid time. (непідтримуваний формат року)
{{#time: r | 1970-01-01 00:16:40 }}Thu, 01 Jan 1970 00:16:40 +0000
{{#time: U | 1970-01-01 00:16:40 }}1000
{{#time: r | @1000 }}Thu, 01 Jan 1970 00:16:40 +0000 (правильний результат)
{{#time: r | 1000 }}Thu, 25 Sep 1000 00:00:00 +0000 (трактується як рік з поточними місяцем та числом)
{{#time: r | 1970-01-01 02:46:39 }}Thu, 01 Jan 1970 02:46:39 +0000
{{#time: U | 1970-01-01 02:46:39 }}9999
{{#time: r | @9999 }}Thu, 01 Jan 1970 02:46:39 +0000 (правильний результат)
{{#time: r | 9999 }}Sat, 25 Sep 9999 00:00:00 +0000 (трактується як рік з поточними місяцем та числом)
{{#time: r | 1970-01-01 02:46:40 }}Thu, 01 Jan 1970 02:46:40 +0000
{{#time: U | 1970-01-01 02:46:40 }}10000
{{#time: r | @10000 }}Thu, 01 Jan 1970 02:46:40 +0000 (правильний результат)
{{#time: r | 10000 }}Error: Invalid time. (непідтримуваний формат року)


  Увага: Допустимим є час в проміжку від 1 січня 0111 до 31 грудня 9999. Для років від 100 до 100 не завжди правильний, так само як і для Y та високосних років. Коди r, D, l та U трактують ці роки як 2000-2010.
{{#time: d F Y | 29 Feb 0100 }}01 березень 0100
(правильний результат, не високосний рік), але
{{#time: r | 29 Feb 0100 }}Mon, 01 Mar 0100 00:00:00 +0000 (неправильний результат, навіть якщо 100 трактується як 2000, оскільки це високосний рік)
{{#time: d F Y | 15 April 10000 }}Error: Invalid time.
{{#time: r | 10000-4-15 }}Sat, 15 Apr 2000 10:00:00 +0000

Роки з однозначним чи двозначним числовим записом, тобто 0-99, трактуються як 2000-2069 та 1970-1999, окрім випадку коли вони записані як чотиризначні числа що починаються з нулів:

{{#time: d F Y | 1 Jan 6 }}01 січень 2006
{{#time: d F Y | 1 Jan 06 }}01 січень 2006
{{#time: d F Y | 1 Jan 006 }}01 січень 2006
{{#time: d F Y | 1 Jan 0006 }}01 січень 0006 (4-digit format)
День тижня підтримується тільки для років 100-110 та для років починаючи із 1753. Для років 111-1752 код "r" повертає "Unknown", а код "l" повертає "<>". В наслідок цього, результат повернений кодом "r" для цих років, не приймається як вхідні дані.


Дати можна вказувати не тільки повністю, але і частково; функція доповнить частини дати яких не вистачає, використовуючи значення для поточного моменту:

{{#time: Y | January 1 }}2021
  Увага: Доповнення частин дати доповнює не всі частини дати; деякі частини доповнюються значеннями для поточного моменту, деякі ні:
{{#time: Y m d H:i:s | June }}2021 06 25 00:00:00 Повертає початковий час дня, але поточні день та рік.
{{#time: Y m d H:i:s | 2003 }}2003 09 25 00:00:00 Повертає початковий час дня, але поточні день та місяць.

Є виняток із заповненим днем:

{{#time: Y m d H:i:s | June 2003 }}2003 06 01 00:00:00 Повертає початок дня і початок місяця.


Чотиризначне число завжди трактується як рік, і ніколи як години та хвилини:[1]

{{#time: Y m d H:i:s | 1959 }}1959 09 25 00:00:00

Шестизначне число трактується як години, хвилини та секунди, якщо це можливо, інакше як помилка (не як рік та місяць):

{{#time: Y m d H:i:s | 195909 }}2021 09 25 19:59:09 Введене значення трактується як час, а не рік і місяць.
{{#time: Y m d H:i:s | 196009 }}Error: Invalid time. Попри те що 19:60:09 не є коректним часом, 196009 не трактується як вересень 1960 року.

Функція може здійснювати деякі перетворення дати:

{{#time: d F Y | January 0 2008 }}31 грудень 2007
{{#time: d F | January 32 }}Error: Invalid time.
{{#time: d F | February 29 2008 }}29 лютий
{{#time: d F | February 29 2007 }}01 березень
{{#time:Y-F|now -1 months}}2021-серпень

Довжина вхідних даних для функції #time має обмеження в 6000 символів[2].

Проблема із часовими поясами

Існує недолік в роботі функції #time (а саме у класі "DateTime" мови PHP, який використовується цією функцією) який не дозволяє нецілі значення в якості зміщення в годинах для часових поясів. Це не стосується випадків для часових поясів із зміщенням у цілу кількість годин, таких як EDT. Наприклад:

  • {{#time:g:i A | -4 hours }} → 12:48 AM

Але Індія має часовий зсув +5.5 годин від UTC, тому застосування її часового поясу не дозволить правильно обчислити відносний зсув часового поясу. Відбудеться ось що:

  • {{#time:g:i A | +5.5 hours }} → 4:48 AM

Щоб уникнути цієї проблеми, просто вкажіть зміщення часу у хвилинах чи секундах, наприклад:

  • {{#time:g:i A | +330 minutes }} → 10:18 AM
  • {{#time:g:i A | +19800 seconds }} → 10:18 AM

(Тім Старлінг, розробник цієї функції, запропонував синтаксис для вирішення цієї проблеми.)

#timel

Ця функція є ідентичною до {{#time: ... }}, окрім того що вона використовує місцевий час для поточної вікі (який налаштований в $wgLocaltimezone ), якщо час не вказано.

Синтаксис функції наступний:

{{#timel: format string }}
{{#timel: format string | date/time object }}
{{#timel: format string | date/time object | language code }}
Зверніть, будь ласка, увагу на те, що, якщо змінну $wgLocaltimezone встановлено в UTC, то немає різниці у виведенні, коли local встановлено у true чи false.
 
Приклад застосування функцій парсеру #time і #timel на сервері, де встановлено відмінний від UTC часовий пояс

Наприклад, див. наступні приклади:

{{#time:c|now|it}}2021-09-25T04:48:49+00:00
{{#time:c|now|it|0}}2021-09-25T04:48:49+00:00
{{#time:c|now|it|1}}2021-09-25T04:48:49+00:00
{{#timel:c|now|it}}2021-09-25T04:48:49+00:00
 
Приклад попередження з https://no.wikipedia.org/wiki/Maldiskusjon:Sommertid
  Увага: Пам'ятайте, що код U як в #time, так в #timel, поверне однакову кількість секунд що пройшли з моменту 00:00:00 1 січня 1970 року за UTC навіть у вікі з часовим поясом що відрізняється від UTC (раніше відомий як GMT)
U Час Unix. Кількість секунд що пройшли з моменту 00:00:00 1 січня 1970 року за GMT.
Z Зміщення часового поясу в секундах.
{{#time: U}}1632545328
{{#timel: U}}1632545328
{{#time: Z}}0
{{#timel: Z}}0


#titleparts

Ця функція поділяє назву сторінки на сегменти, що розділені символами косої риски. Після цього деякі із цих сегментів повертаються в якості результату.

{{#titleparts: назва сторінки | кількість сегментів, що треба повернути | сегмент з якого почати }}

Якщо кількість сегментів, що треба повернути не вказано, то вона отримує значення за замовчуванням "0", яке повертає всі сегменти від сегмент з якого почати до кінця. Якщо не вказано сегмент з якого почати або для нього вказане значення "0", то аргумент отримує значення за замовчуванням "1":

{{#titleparts: Talk:Foo/bar/baz/quok }}Talk:Foo/bar/baz/quok
{{#titleparts: Talk:Foo/bar/baz/quok | 1 }}Talk:Foo See also {{ROOTPAGENAME }}.
{{#titleparts: Talk:Foo/bar/baz/quok | 2 }}Talk:Foo/bar
{{#titleparts: Talk:Foo/bar/baz/quok | 2 | 2 }}bar/baz
{{#titleparts: Talk:Foo/bar/baz/quok | | 2 }}bar/baz/quok
{{#titleparts: Talk:Foo/bar/baz/quok | | 5 }}

Від'ємні значення допускаються в обох аргументах. Якщо від'ємне значення вказане для кількість сегментів, що треба повернути, то функція відрізує вказану кількість сегментів від кінця. При від'ємному значенні для сегмент з якого почати, сегменти рахуються з кінця:

{{#titleparts: Talk:Foo/bar/baz/quok | -1 }}Talk:Foo/bar/baz Відрізує один сегмент від кінця текстового рядка. Див. також {{BASEPAGENAME}}.
{{#titleparts: Talk:Foo/bar/baz/quok | -4 }} Відрізує всі 4 сегменти від кінця рядка
{{#titleparts: Talk:Foo/bar/baz/quok | -5 }} Відрізує 5 сегментів від кінця рядка (що більше ніж існує)
{{#titleparts: Talk:Foo/bar/baz/quok | | -1 }} quok Повертає останній сегмент. Див. також {{SUBPAGENAME}}.
{{#titleparts: Talk:Foo/bar/baz/quok | -1 | 2 }} bar/baz Відрізує один сегмент від кінця рядка, після чого повертає другий сегмент і все після нього, що залишилось
{{#titleparts: Talk:Foo/bar/baz/quok | -1 | -2 }} baz Бере другий сегмент і все після нього, після чого відрізує один сегмент від кінця

Перед обробкою параметр pagename є HTML-розкодованим: якщо він містить деякі стандартні сутності символів HTML, то вони перетворяться у прості символи (внутрішньо закодовані в UTF-8, тобто те саме кодування, що й на початковій сторінці MediaWiki, за допомогою цієї функції парсера).

Наприклад, будь-яке входження &quot;, &#34; чи &#x22; у pagename буд замінене на ".
Жодних інших перетворень із HTML у простий текст не здійснюється, тому теги HTML залишаються неушкодженими на цьому початковому етапі навіть, якщо вони недійсні у заголовках сторінок.
Деякі магічні слова чи функції парсера MediaWiki (як-от {{PAGENAME }} і подібні), як відомо, повертають рядки, які без потреби закодовані HTML навіть, якщо їхній власний вхідний параметр не був закодований HTML.

Функція парсера titleparts потім може бути використана як обхідний шлях для перетворення цих повернених рядків так, що вони можуть бути коректно оброблені деякими іншими функуіями парсера, що також приймать назву сторінки в параметрі (як-от {{PAGESINCAT: }}), але які досі не працюють як слід із закодованими HTML вхідними рядками.

Наприклад, якщо поточна сторінка Category:Côte-d'Or, то:

  • {{#ifeq: {{FULLPAGENAME}} | Category:Côte-d'Or | 1 | 0 }} і {{#ifeq: {{FULLPAGENAME}} | Category:Côte-d&apos;Or | 1 | 0 }} повернуть 1; (функція парсера #ifeq здійснює розкодування HTML своїх вхідних параметрів).
  • {{#switch: {{FULLPAGENAME}} | Category:Côte-d'Or = 1 | #default = 0 }} і {{#switch: {{FULLPAGENAME}} | Category:Côte-d&apos;Or = 1 | #default = 0 }} повернуть 1; (функція парсера #switch здійснює розкодування HTML своїх вхідних параметрів).
  • {{#ifexist: {{FULLPAGENAME}} | 1 | 0 }}, {{#ifexist: Category:Côte-d'Or | 1 | 0 }} або навіть {{#ifexist: Category:Côte-d&apos;Or | 1 | 0 }} повернуть 1, якщо така сторінка категорії існує (функція парсера #ifexist виконує розкодування HTML своїх вхідних параметрів);
  • {{PAGESINCAT: Côte-d'Or }} поверне ненульове число, якщо така категорія містить сторінки чи підкатегорії, але:
  • {{PAGESINCAT: {{CURRENTPAGENAME}} }} все ще може безумовно повертати 0, просто як:
  • {{PAGESINCAT: {{PAGENAME|Category:Côte-d'Or}} }}
  • {{PAGESINCAT: {{PAGENAME|Category:Côte-d&apos;Or}} }}

Причиною цієї неочікуваної поведінки є те, що з поточними версіями MediaWiki є два застереження:

  • {{FULLPAGENAME}} чи навіть {{FULLPAGENAME|Côte-d'Or}} можуть повертати дійсний HTML-закодований рядок Category:Côte-d&apos;Or, а не очікуваний Category:Côte-d'Or, і тому:
  • {{PAGESINCAT: Côte-d&apos;Or }} безумовно повертає 0 (магічне слово PAGESINCAT не здійснює жодного розкодування HTML своїх вхідних параметрів).

Простим обхідним шляхом за допомогою titleparts (який продовжуватиме працювати, якщо два застереження будуть виправлені в пізніших версіях MediaWiki) є:

  • {{PAGESINCAT: {{#titleparts: {{CURRENTPAGENAME}} }} }}
  • {{PAGESINCAT: {{#titleparts: {{PAGENAME|Category:Côte-d'Or}} }} }}
  • {{PAGESINCAT: {{#titleparts: {{PAGENAME|Category:Côte-d&apos;Or}} }} }}, які повертають дійсну кількість сторінок у тій самій категорії.

Потім розкодована назва сторінки канонізується у стандартну, підтримувану MediaWiki, якомога більше:

  1. Всі підкреслення автоматично замінюються пробілами:
    {{#titleparts: Talk:Foo/bah_boo|1|2}}bah boo Не bah_boo, попри підкреслення в оригіналі.
  2. Рядок ділиться до 25 разів; подальші риски ігноруються, і 25-й елемент міститиме решту рядка. Рядок також обмежений 255 символами, адже він розцінюється як заголовок сторінки:
    {{#titleparts: a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/aa/bb/cc/dd/ee | 1 | 25 }}y/z/aa/bb/cc/dd/ee
    Якщо з деяких причин вам потрібно проштовхнути цю функцію до даної межі, хоча й дуже малоймовірно, то можливо обійти обмеження 25 розділенням шляхом вкладання викликів функції:
    {{#titleparts: {{#titleparts: a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z/aa/bb/cc/dd/ee| 1 | 25 }} | 1 | 2}}z
  3. Нарешті, перший підрядок починається з великої літери згідно з налаштуваннями великих літер локальної вікіпедії (якщо такий підрядок також починається з локальної назви простору назв, то назва простору назв також нормалізована).
    {{#titleparts: talk:a/b/c }}Talk:A/b/c
  Увага: Ви можете використовувати #titleparts як малий «рядковий парсер і перетворювач», але зважте на те, що він повертає перший підрядок із великої літери:
{{#titleparts: one/two/three/four|1|1 }}One
{{#titleparts: one/two/three/four|1|2 }}two

Якщо потрібний нижній регістр, використовуйте функцію lc: для керування виведенням:

{{lc: {{#titleparts: one/two/three/four|1|1 }} }}one

Ви можете додати «підставну» риску на початку рядка для отримання коректної капіталізації першого підрядка (верхній або нижній регістр). Використовуйте 2 замість 1 для «повернути перший сегмент».

{{#titleparts: /one/two/three/four|1|2 }}one
{{#titleparts: /One/two/three/four|1|2 }}One


  Увага: Певні символи, заборонені в назвах сторінок, змусять #titleparts не парсити рядок.
{{#titleparts: {one/two} | 1 | 1 }}{one/two}. Не виробляє очікуване: {one
{{#titleparts: [[page]]/123 | 1 | 2 }}page/123. Не працює, тому що квадратні дужки заборонені в назвах сторінок і ця функція парсеру не обробляє посилання, вбудовані в її вхідний параметр «pagename», навіть, коли вони використовують синтаксис MediaWiki чи будь-які інші теги HTML або MediaWiki.
{{#titleparts: red/#00FF00/blue | 1 | 3 }} → "". Не працює, тому що «#» також заборонений у назвах сторінок.


  Увага: Якщо будь-якою частиною назви є просто «.» або «..», то #titleparts не парситиме рядок:
{{#titleparts: one/./three | 1 | 1 }}one/./three. Повернено весь рядок. Це не виробляє очікуваного: one


  Увага: Ця функція не деградує витончено, якщо введення перевищує 255 байтів у UTF-8. Якщо вхідний рядок складається з 256 байтів або більше, то повертається весь рядок.


Рядкові функції

Всі ці функції (len, pos, rpos, sub, replace, explode) інтегровані з розширення StringFunctions, але доступні тільки, якщо адміністратор встановив $wgPFEnableStringFunctions = true; у LocalSettings.php.

Всі ці функції працюють у складності за часом O(n), що убезпечує їх від DoS-атак.

  1. Деякі параметри цих функцій обмежені крізь глобальні налаштування для запобігання зловживанням. Див. розділ Обмеження нижче.
  2. Для функцій, які є регістрозалежними, ви можете використовувати магічне слово {{lc:string}} як обхідний шлях у деяких випадках.
  3. Для визначення того, чи сервер MediaWiki вмикає ці функції, перевірте список підтримуваних Розширених функцій парсеру в Special:Version.
  4. Довжина рядка обмежена змінною $wgPFStringLengthLimit, за замовчуванням 1000.

#len

Функція парсера #len була злита від розширення StringFunctions станом на версію 1.2.0.

Функція #len повертає довжину даного рядка. Синтаксисом є:

{{#len:string}}

Повернутим значенням завжди є кількість символів у початковому «рядку» (після розширень викликів шаблонів, але до перетворення в HTML). Якщо рядок не заданий, повернутим значенням є нуль.

  • Ця функція безпечна з багатобайтовими символами UTF-8. Приклад:
    • {{#len:Žmržlina}}8
  • Чільні та хвостові пробіли чи нові рядки не рахуються, але проміжні — беруться в рахунок. Приклади:
    • {{#len:Icecream }}8
    • {{#len: a   b }}5 - 3 пробіли між 2 символами
  • Символи, дані за посиланням, не перетворюються, але рахуються згідно з їхньою початковою формою.
    • {{#len:&nbsp;}}6 - іменовані символьні посилання
    • {{#len:&#32;}}5 - числові символьні посилання, не зігноровані попри те, що вони позначають тут пробіл.
  • Такі теги, як ‎<nowiki>, й інші розширення тегів завжди матимуть нульову довжину, оскільки їхній уміст прихований від парсера. Приклад:
    • {{#len:<nowiki>This is a </nowiki>test}}4

#pos

Функція парсера #pos була злита від розширення StringFunctions станом на версію 1.2.0.

Функція парсера #pos повертає позицію даного шуканого виразу в рядку. Синтаксисом є:

{{#pos:string|шуканий вираз|offset}}

Параметр offset, якщо заданий, каже початкову позицію, де ця функція повинна почати пошук.

Якщо шуканий вираз знайдено, то повернутим значенням є ціле число, починаючи з нуля, першої позиції в рядку.

Якщо шуканий вираз не знайдено, то функція повертає порожній рядок.

  • Ця функція регістрозалежна.
  • Максимальна дозволена довжина шуканого виразу обмежена глобальним налаштуванням $wgStringFunctionsLimitSearch.
  • Ця функція безпечна з багатобайтовими символами UTF-8. Приклад: {{#pos:Žmržlina|žlina}} повертає 3.
  • Як і з #len, ‎<nowiki> й інші розширення тегів розцінюються як такі, що мають довжину 1 з метою позиціювання символів. Приклад: {{#pos:<nowiki>This is a </nowiki>test|test}} повертає 1.

#rpos

Функція парсера #rpos була злита від розширення StringFunctions станом на версію 1.2.0.

Функція парсера #rpos повертає останню позицію даного шуканого виразу в рядку. Синтаксисом є:

 {{#rpos:string|шуканий вираз}}

Якщо шуканий вираз знайдено, то повернутим значенням є ціле число, починаючи з нуля, останньої позиції в рядку.

Якщо шуканий вираз не знайдено, то функція повертає –1.

Під час використання цього для пошуку останнього роздільника додайте +1 до результату для отримання позиції після останнього роздільника. Це також працює, коли останній роздільник не знайдений, тому що «–1 + 1» дорівнює 0, який є початком даного значення.
  • Ця функція регістрозалежна.
  • Максимальна дозволена довжина шуканого виразу обмежена глобальним налаштуванням $wgStringFunctionsLimitSearch.
  • Ця функція безпечна з багатобайтовими символами UTF-8. Приклад: {{#rpos:Žmržlina|lina}} повертає 4.
  • Як і з #len, ‎<nowiki> й інші розширення тегів розцінюються як такі, що мають довжину 1 з метою позиціювання символів. Приклад: {{#rpos:<nowiki>This is a </nowiki>test|test}} повертає 1.

#sub

Функція парсера #sub була злита від розширення StringFunctions станом на версію 1.2.0.

Функція #sub повертає підрядок даного рядка. Синтаксисом є:

{{#sub:string|start|length}}

Параметр start, якщо додатній (або нуль), визначає індекс, починаючи з нуля, першого повернутого символу.

Приклад: {{#sub:Icecream|3}} повертає cream.

{{#sub:Icecream|0|3}} повертає Ice.

Якщо параметр start від'ємний, визначає кількість символів з кінця, які слід повернути.

Приклад: {{#sub:Icecream|-3}} повертає eam.

Параметр length, якщо присутній і додатній, визначає максимальну довжину повернутого рядка.

Приклад: {{#sub:Icecream|3|3}} повертає cre.

Якщо параметр length від'ємний, він визначає, скількі символів будуть опущені з кінця рядка.

Приклад: {{#sub:Icecream|3|-3}} повертає cr.

Якщо параметр start від'ємний, він визначає кількість символів з кінця, які слід повернути. Параметр length, якщо присутній і додатній, визначає максимальну довжину повернутого рядка з початкової точки.

Приклад: {{#sub:Icecream|-3|2}} повертає ea.

  • Якщо параметр length дорівнює нулю, він не використовується для усічення взагалі.
    • Приклад: {{#sub:Icecream|3|0}} повертає cream. {{#sub:Icecream|0|3}} повертає Ice.
  • Якщо start позначає позицію за усіченням з кінця від'ємним параметром length, то буде повернуто порожній рядок.
    • Приклад: {{#sub:Icecream|3|-6}} повертає порожній рядок.
  • Ця функція безпечна з багатобайтовими символами UTF-8. Приклад: {{#sub:Žmržlina|3}} повертає žlina.
  • Як і з #len, ‎<nowiki> й інші розширення тегів розцінюються як такі, що мають довжину 1 з метою позиціювання символів. Приклад: {{#sub:<nowiki>This is a </nowiki>test|1}} повертає test.

#count

The #count parser function was added to the StringFunctions extension as of version 1.2.0.

The #count function returns the number of times a given substring appears within the provided text.

{{#count:string|substring}}

#replace

Функція парсера #replace була злита від розширення StringFunctions станом на версію 1.2.0.

Функція #replace повертає даний рядок, де всі входження шуканого виразу замінені виразом заміни.

{{#replace:string|search term|replacement term}}

Якщо search term не вказаний або порожній, то шукатиметься одиночний пробіл.

Якщо replacement term не вказаний або порожній, то всі входження search term буде вилучено з рядка.

  • Ця функція регістрозалежна.
  • Максимальна дозволена довжина search term обмежена глобальним налаштуванням $wgStringFunctionsLimitSearch.
  • Максимальна дозволена довжина replacement term обмежена глобальним налаштуванням $wgStringFunctionsLimitReplace.
  • Навіть, якщо replacement term дорівнює пробілу, використовується порожній рядок. Це побічний ефект парсера MediaWiki. Для використання пробілу як replacement term помістіть його в теги nowiki.
    • Приклад: {{#replace:My_little_home_page|_|<nowiki> </nowiki>}} повертає My little home page.
    • Якщо це не працює, спробуйте {{#replace:My_little_home_page|_|<nowiki/> <nowiki/>}} з двома одиночними тегами.
    • Зауважимо, що це єдиний прийнятний спосіб застосування nowiki у виразі для заміни, оскільки в іншому випадку nowiki можна застосувати для обходу $wgStringFunctionsLimitReplace, включаючи довільно велику кількість символів до результату. З цієї причини всі появи ‎<nowiki> чи іншого тегу розширення всередині виразу для заміни замінюються пропусками.
  • Ця функція безпечна з багатобайтовими символами UTF-8. Приклад: {{#replace:Žmržlina|ž|z}} повертає Žmrzlina.
  • Якщо необхідно замінити кілька фрагментів у текстовому рядку, слід також розглянути можливість застосування Extension:ReplaceSet . Це додає будь-яку функцію парсера до послідовності замін.
Нечутлива до регістру заміна

Поточний синтаксис не передбачає перемикача чутливості до регістру. Але можна як обхідний шлях застосувати магічні слова форматування. (приміром, {{lc:тут_ваш_текст}}) Так, якщо слід прибрати слово"Category:" із певного рядку незалежно від регістру літер, ви можете записати:

{{#replace:{{lc:{{{1}}}}}|category:|}}

Недоліком є те, що увесь вивід буде в нижньому регістрі (малими літерами). Якщо потрібно зберегти регістр літер після заміни, слід використовувати кілька рівнів вкладення функції (тобто кілька викликів заміни).

#explode

Функція парсера #explode була злита від розширення StringFunctions починаючи з версії 1.2.0.

Функція #explode розбиває заданий рядок на частини й повертає одну з цих частин. Синтаксис такий:

{{#explode:string|delimiter|position|limit}}

Параметр delimiter містить рядок-маску для розділення рядку string на частини. Рядок delimiter не ввійде до жодної частини, а якщо два фрагменти delimiter стоять поряд, буде створено порожню частину рядку. Якщо цей параметр не вказано, використовується один пропуск. Параметр limit доступний лише в ParserFunctions, його немає в окремій версії StringFunctions; він дозволяє обмежити кількість отриманих частин, тоді залишок тексту буде приєднаний до останньої частини.

Параметр position вказує, яку частину слід повернути. Номери частин починаються з 0. Якщо цей параметр не вказано, буде повернуто першу частину (частину номер 0). Негативне значення параметру position дозволяє вести відлік частин у зворотному напрямку, від кінця. В такому разі номер -1 матиме остання частина. Приклади:

  • {{#explode:And if you tolerate this| |2}} повертає you
  • {{#explode:String/Functions/Code|/|-1}} повертає Code
  • {{#explode:Split%By%Percentage%Signs|%|2}} повертає Percentage
  • {{#explode:And if you tolerate this| |2|3}} повертає you tolerate this

Повертається значення частини номер position. Якщо частин менше, ніж вимагає цей номер, повертається порожній рядок.

  • Функція чутлива до регістру.
  • Найбільшу можливу довжину значення delimiter обмежує глобальне налаштування $wgStringFunctionsLimitSearch.
  • Функція безпечно працює з багатобайтовими символами UTF-8, зокрема, {{#explode:Žmržlina|ž|1}} повертає lina.

#urldecode

#urldecode перетворює екрановані символи з 'URL-закодованого' рядку назад на читабельний текст. Синтаксис такий:

{{#urldecode:значення}}

Примітки:

  • Ця функція безпосередньо використовує PHP-функцію urldecode().
  • Коди символів можна знайти на www.w3schools.com.
  • Зворотну функція, urlencode, інтегровано до MediaWiki починаючи з версії 1.18; приклади наведено в Довідка:Магічні слова .
  • urldecode імпортовано зі Stringfunctions у 2010 комітом 1b75afd18d3695bdb6ffbfccd0e4aec064785363

Обмеження

Цей модуль додає три глобальні налаштування:

Вони застосовуються для обмеження значень окремих параметрів певних функцій, щоб гарантувати часову складність O(n) виконання функцій, що дає захист від DoS-атак.

$wgStringFunctionsLimitSearch

Це налаштування стосується #pos, #rpos, #replace і #explode. Всі ці функції шукають підрядок в більшому рядку, що дає часову складність O(n*m) і, отже, підвищує вразливість до DoS-атак. Встановлення цього налаштування в достатньо мале число обмежує часову складність до O(n).

Це налаштування обмежує максимальну довжину рядку, який можна шукати.

Значення за замовчуванням 30 (багатобайтових) символів.

$wgStringFunctionsLimitReplace

Це налаштування стосується #replace. Ця функція замінює всі входження одного рядку до іншого, що може швидко згенерувати великий обсяг даних, тобто підвищує вразливість до DoS-атак. Налаштування обмежує довжину рядку, який використовується для замін.

Значення за замовчуванням 30 (багатобайтових) символів.

Загальні поради

Підстановка

Функції парсера можуть бути підставлені. Для цього вкажіть префікс subst: перед знаком решітки у виклику функції:

{{subst:#ifexist: Help:Extension:ParserFunctions/uk | [[Help:Extension:ParserFunctions/uk]] | Help:Extension:ParserFunctions/uk }} → код [[Help:Extension:ParserFunctions/uk]] буде вставлений до вікітексту оскільки сторінка Help:Extension:ParserFunctions/uk існує.
  Увага: Результати підставлених функцій парсера невизначені, якщо вирази містять непідставлений volatile код на кшталт змінних чи інших функцій парсера. Для узгоджених результатів увесь volatile код у обчислюваному виразі повинен бути підставлений. Див. Довідка:Підстановка.


Підстановка не працює в ‎<ref>‎</ref> , ви можете використати {{subst:#tag:ref|}} з цією метою.

Перенаправлення

Підстановка поточного часу за допомогою {{#time:…|now-…}}, хоч і може використовуватись в посиланнях, але не працює в перенаправленнях .

Вставка символів вертикальної риски до таблиць

Функції парсера спотворять синтаксис вікітаблиці та вертикальні риски (|), розцінюючи всі сирі символи вертикальних рисок як роздільники параметрів. Для уникнення цього більшість вікіпедій використовували шаблон Template:!, вмістом якого був тільки сирий символ вертикальної риски (|), починаючи з MW 1.24 {{!}} магічне слово замінило цей kludge. Це «ховає» вертикальну риску від парсера MediaWiki, забезпечуючи те, що він не розглянеться до того, як усі шаблони та змінні на сторінці не будуть розширені. Поітм він інтерпретується як рядом таблиці чи роздільник колонки. Альтернативно, синтаксис сирої таблиці HTML може бути використано, хоча це менш інтуїтивно та схильніше до помилок.

Ви також можете екранувати символ «pipe» для відображення як простий, неінтерпретований символ за допомогою сутності HTML: &#124;.

Опис Ви пишете Ви отримуєте
Екранування символу «pipe» як роздільника рядка чи колонки таблиці
{{!}}
|
Екранування символу «pipe» як простого символу
&#124;
|

Прибирання пробільних символів

Пробільні символи, включаючи символи нового рядка, символи табуляції та пробіли, прибираються із початку та з кінця всіх параметрів всіх функцій парсера. Якщо при порівнянні текстових рядків, пробільні символи в початку чи в кінці текстового рядка, що є аргументом функції, все ж таки потрібні, цей текстовий рядок можна помістити у подвійні лапки.

{{#ifeq: foo           |           foo | equal | not equal }}equal
{{#ifeq: "foo          " | "          foo" | equal | not equal }}not equal

Щоб уникнути прибирання пробільних символів в аргументах функції #if можна скористатися шаблоном m:Template:If або використати <nowiki> </nowiki> замість пробілів.

foo{{#if:|| bar }}foofoobarfoo
foo{{#if:||<nowiki /> bar <nowiki />}}foofoo bar foo

Однак, цей метод може бути використаний для рендерингу тільки єдиного пробільного символу, оскільки парсер стискає багато пробільних символів у рядку в один.

<span style="white-space: pre;">foo{{#if:||<nowiki/>      bar      <nowiki/>}}foo</span>
foo bar foo

У цьому прикладі стиль white-space: pre використано для force the whitespace to be preserved браузером, але навіть із ним пробіли не показуються. Це стається тому, що пробіли are stripped програмним забезпеченням, до надсилання у браузер.

Можливо обійти цю поведінку, замінивши whitespaces на &#32; (розривний пробіл) або &nbsp; (нерозривний пробіл), адже вони не модифікуються програмним забезпеченням:

<span style="white-space: pre;">foo{{#if:||&#32;&#32;&#32;bar&#32;&#32;&#32;}}foo</span>foo bar foo
foo{{#if:||&nbsp;&nbsp;&nbsp;bar&nbsp;&nbsp;&nbsp;}}foofoo   bar   foo

Див. також

Примітки

  1. До випуску версії r86805 в 2011 році, це не завжди було так.
  2. ParserFunctions.php на phabricator.wikimedia.org