Help:Extension:ParserFunctions/uk

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

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



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

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



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



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



Зверніть увагу, що при використання у виразі значення поверненого магічним словом, необхідно спочатку привести це значення до "сирого" формату щоб прибрати всі пробіли між цифрами і перевести цифри до арабських. Наприклад, повертає значення, при тому що потрібним значенням є 0, яке можна отримати за допомогою. Це особливо важливо для деяких мов, де числа записуються не арабськими цифрами. Наприклад, для бенгальської мови поверне ৩০,০৬১.



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

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

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



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





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



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



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



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

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



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

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



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



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


 * →  (порівняти з подібним прикладом вище, без лапок)
 * →  (порівняти з подібним прикладом вище, де   повертає дійсне число першим)
 * →  (порівняти з подібним прикладом вище, без лапок)
 * →  (порівняти з подібним прикладом вище, де   повертає дійсне число першим)

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



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


 * → 20
 * → 40
 * → 40

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



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


 * → &zwnj;
 * → &zwnj;
 * → &zwnj;
 * → &zwnj;
 * → &zwnj;
 * → &zwnj;

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



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

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



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



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

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

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



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



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



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



Якщо на одній сторінці перевіряється існування другої за допомогою, то перша (та на якій перевіряється) з'явиться в списку  для другої (та яка перевіряється). Тому, якщо  було би включене до цієї сторінки, то  з'явилась би в списку /Foo.

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

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

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

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

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

ifexist і бажані сторінки
Сторінка, яка не існує та випробовується для використання #ifexist, закінчиться на Бажані сторінки.

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



В аргументі  можливе використання такого синтаксису:
 * → поточний рівень
 * → вверх на один рівень
 * → вниз на один рівень до вкладеної папки /foo"

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



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



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

Приклади:



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

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



Результат за замовчуванням має бути останнім аргументом і не повинен містити знак рівності. If it does, it will be treated as a case comparison, and no text will display if no cases match. This is because the default value has not been defined (is empty). If a case matches however, its associated string will be returned.



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

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



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



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

Тут випадки 2, 3 та 4 повертають однаковий результат ; Обоє випадки 6 та 7 повернуть. The " " in the last parameter may be omitted in the above case.

Use with parameters
The function may be used with parameters as the test string. In this case, it is not necessary to place the pipe after the parameter name, because it is very unlikely that you will choose to set a case to be the string " ". (This is the value the parameter will default to if the pipe is absent and the parameter doesn't exist or have a value. See .)



In the above case, if  equals , the function will return. If it equals, the function will return. If the parameter is empty or does not exist, the function will return.

As in the section above, cases can be combined to give a single result.



Here, if  equals ,   or  , the function will return. If it equals, the function will return. If the parameter is empty or does not exist, the function will return.

Additionally, the default result can be omitted if you do not wish to return anything if the test parameter value does not match any of the cases.



In this case, the function returns an empty string unless  exists and equals   or , in which case it returns   or  , respectively.

This has the same effect as declaring the default result as empty.



If for some reason you decide to set a case as " ", the function will return that case's result when the parameter doesn't exist or doesn't have a value. The parameter would have to exist and have a value other than the string " " to return the function's default result.


 * (when  doesn't exist or is empty):
 * →  Foo 
 * (when  has the value " "):
 * →  Bar 
 * (when  has the value " "):
 * →  Foo 

In this hypothetical case, you would need to add the pipe to the parameter.

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





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

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

Буквальне включення знаку рівності
Текстові рядки випадків не можуть містити знаків рівності. Щоб обійти це обмеження, створіть шаблон = що міститиме лише знак рівності -, або замість символу рівності вставте його HTML-код.

Приклад:





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

Наприклад: є еквівалентними до тобто глибокого вкладення, лінійного:

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

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



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



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


 * &rarr; 
 * &rarr; 
 * &rarr; 
 * &rarr; 
 * &rarr; 
 * &rarr; 
 * &rarr; 

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



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

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

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





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



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



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



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


 * →  Введене значення трактується як час, а не рік і місяць.
 * →  Попри те що 19:60:09 не є коректним часом, 196009 не трактується як вересень 1960 року.

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



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

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


 * &rarr;

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


 * &rarr;

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


 * &rarr;
 * &rarr;

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

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

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





For instance, see the following examples:





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



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


 * →  See also.
 * →  See also.

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


 * →  Відрізує один сегмент від кінця текстового рядка. Див. також.
 * →   Відрізує всі 4 сегменти від кінця рядка
 * →   Відрізує 5 сегментів від кінця рядка (що більше ніж існує)
 * →   Повертає останній сегмент. Див. також.
 * →   Відрізує один сегмент від кінця рядка, після чого повертає другий сегмент і все після нього, що залишилось
 * →   Бере другий сегмент і все після нього, після чого відрізує один сегмент від кінця

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


 * Наприклад, будь-яке входження,   чи   у pagename буд замінене на.
 * Жодних інших перетворень із HTML у простий текст не здійснюється, тому теги HTML залишаються неушкодженими на цьому початковому етапі навіть, якщо вони недійсні у заголовках сторінок.

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


 * 1) Всі підкреслення автоматично замінюються пробілами:
 * →  Не bah_boo, попри підкреслення в оригіналі.
 * 1) Рядок ділиться до 25 разів; подальші риски ігноруються, і 25-й елемент міститиме решту рядка. Рядок також обмежений 255 символами, адже він розцінюється як заголовок сторінки:
 * If for whatever reason you needed to push this function to its limit, although very unlikely, it is possible to bypass the 25 split limit by nesting function calls:
 * 1) Finally the first substring is capitalized according to the capitalization settings of the local wiki (if that substring also starts by a local namespace name, that namespace name is also normalized).
 * 1) Finally the first substring is capitalized according to the capitalization settings of the local wiki (if that substring also starts by a local namespace name, that namespace name is also normalized).
 * 1) Finally the first substring is capitalized according to the capitalization settings of the local wiki (if that substring also starts by a local namespace name, that namespace name is also normalized).

{{Warning|1= Certain characters that are illegal in a page title will cause #titleparts to not parse the string:


 * → {{#titleparts: {one/two} | 1 | 1 }}. Does not produce the expected: {one
 * → {{#titleparts: page/123 | 1 | 2 }}. Does not work because brackets are illegal in page titles and this parser function does not process links embedded in its input pagename parameter, even when they use the MediaWiki syntax, or any other HTML or MediaWiki tags.
 * → "{{#titleparts: red/#00FF00/blue| 1 | 3 }}". Does not work because "#" is also illegal in page titles.

}}

StringFunctions
All of these functions are now integrated into the ParserFunctions extension, but are only available if an administrator sets   in.

All of these functions operate in O(n) time complexity, making them safe against DoS attacks.

#len:
The #len function returns the length of the given string. The syntax is:

The return value is always a number of characters in the source string (after expansions of template invocations, but before conversion to HTML). If no string is specified, the return value is zero.

#pos:
The #pos function returns the position of a given search term within the string. The syntax is:

The offset parameter, if specified, tells a starting position where this function should begin searching.

If the search term is found, the return value is a zero-based integer of the first position within the string.

If the search term is not found, the function returns an empty string.

#rpos:
The #rpos function returns the last position of a given search term within the string. The syntax is:

If the search term is found, the return value is a zero-based integer of its last position within the string.

If the search term is not found, the function returns -1.

#sub:
The #sub function returns a substring from the given string. The syntax is:

The start parameter, if positive (or zero), specifies a zero-based index of the first character to be returned.

Example: returns.

returns.

If the start parameter is negative, it specifies how many characters from the end should be returned.

Example: returns.

The length parameter, if present and positive, specifies the maximum length of the returned string.

Example: returns.

If the length parameter is negative, it specifies how many characters will be omitted from the end of the string.

Example: returns.

If the start parameter is negative, it specifies how many characters from the end should be returned. The length parameter, if present and positive, specifies the maximum length of the returned string from the starting point.

Example: returns.

#replace:
The #replace function returns the given string with all occurrences of a search term replaced with a replacement term.

If the search term is unspecified or empty, a single space will be searched for.

If the replacement term is unspecified or empty, all occurrences of the search term will be removed from the string.

Currently the syntax doesn't provide a switch to toggle case-sensitivity setting. But you may make use of magic words of formatting (e.g. your_string_here ) as a workaround. For example, if you want to remove the word "Category:" from the string regardless of its case, you may type:
 * Case-insensitive replace

But the disadvantage is that the output will become all lower-case. If you want to keep the casing after replacement, you have to use multiple nesting levels (i.e. multiple replace calls) to achieve the same thing.

#explode:
The #explode function splits the given string into pieces and then returns one of the pieces. The syntax is:

The delimiter parameter specifies a string to be used to divide the string into pieces. This delimiter string is then not part of any piece, and when two delimiter strings are next to each other, they create an empty piece between them. If this parameter is not specified, a single space is used. The limit parameter is available in ParserFunctions only, not the standalone StringFunctions version, and allows you to limit the number of parts returned, with all remaining text included in the final part.

The position parameter specifies which piece is to be returned. Pieces are counted from 0. If this parameter is not specified, the first piece is used (piece with number 0). When a negative value is used as position, the pieces are counted from the end. In this case, piece number -1 means the last piece. Examples:


 * returns.
 * returns.
 * returns.
 * returns.

The return value is the position-th piece. If there are fewer pieces than the position specifies, an empty string is returned.

Limits
This module defines three global settings:


 * 
 * 
 * 

These are used to limit some parameters of some functions to ensure the functions operate in O(n) time complexity, and are therefore safe against DoS attacks.

$wgStringFunctionsLimitSearch
This setting is used by #pos, #rpos, #replace, and #explode. All these functions search for a substring in a larger string while they operate, which can run in O(n*m) and therefore make the software more vulnerable to DoS attacks. By setting this value to a specific small number, the time complexity is decreased to O(n).

This setting limits the maximum allowed length of the string being searched for.

The default value is 30 multibyte characters.

$wgStringFunctionsLimitReplace
This setting is used by #replace. This function replaces all occurrences of one string for another, which can be used to quickly generate very large amounts of data, and therefore makes the software more vulnerable to DoS attacks. This setting limits the maximum allowed length of the replacing string.

The default value is 30 multibyte characters.

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


 * → код   буде вставлений до вікітексту оскільки сторінка існує.

Підстановка не працює в, ви можете використати &hellip;  з цією метою.

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

Вставка символів вертикальної риски до таблиць
Parser functions will mangle syntax and pipe characters, treating all the raw pipe characters as parameter dividers. To avoid this, most wikis used a template    :! with its contents only a raw pipe character, since MW 1.24 a  replaced this kludge. This 'hides' the pipe from the MediaWiki parser, ensuring that it is not considered until after all the templates and variables on a page have been expanded. It will then be interpreted as a table row or column separator. Alternatively, raw HTML table syntax can be used, although this is less intuitive and more error-prone.

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

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



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


 * → foofoo
 * → foofoo

However, this method can be used to render a single whitespace character only, since the parser squeezes multiple whitespace characters in a row into one.




 * || → || foofoo 
 * }

In this example, the  style is used to force the whitespace to be preserved by the browser, but even with it the spaces are not shown. This happens because the spaces are stripped by the software, before being sent to the browser.

It is possible to workaround this behavior replacing whitespaces with  (breakable space) or   (non-breakable space), since they are not modified by the software:


 * →  foofoo 
 * → foofoo

Див. також

 * m:Help:Calculation
 * m:Help:Newlines and spaces
 * m:Help:Comparison between ParserFunctions syntax and TeX syntax
 * Module:String що замінив
 * Module:String що замінив
 * Module:String що замінив