Help:Extension:ParserFunctions/ru

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

#expr
Эта функция вычисляет математическое выражение и возвращает вычисленное значение. Эта функция также доступна в через функцию.



Доступные операторы перечислены справа в порядке очередности. Дополнительные сведения о функции каждого оператора см. в Справка:Вычисления. Точность и формат возвращаемого результата будут варьироваться в зависимости от операционной системы сервера, на котором выполняется вики, и числового формата языка сайта.

При вычислении с помощью булева алгебры ноль вычисляется как, а любое не нулевое значение, положительное или отрицательное, вычисляется как  :



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



Порядок сложения и вычитания операндов до или после числа имеет смысл и может рассматриваться как положительное или отрицательное значение, а не как операнд с ошибочным вводом:



Обратите внимание, что при использовании вывода Волшебных слов, вы должны raw-форматировать их, чтобы удалить запятые и перевести цифры. Например, результаты в, когда мы хотим 0, которые можно получить с помощью. Это особенно важно в некоторых языках, где цифры переводятся. Например, в бенгальском языке производит ৩০,০৬১.



Округление
Округление число слева до кратного 1/10, возведенного в степень, с показателем степени, равным усеченному значению числа, заданного справа.

Для округления увеличением или уменьшением используйте унарные  или   соответственно.

Строки
Выражения работают только с числовыми значениями, они не могут сравнивать строки или символы. Вместо этого можно использовать.



#if
Функция определяет, является тестовая строка пустой или нет. Строка, содержащая только пробелы, считается пустой.





Эта функция сначала проверяет, не пуст ли первый параметр. Если первый параметр не пуст, то функция выводит второй аргумент. Если первый параметр пуст или содержит только пробельные символы (пробелы, новые строки и т. д.) он отображает третий аргумент.



Тестовая строка всегда интерпретируется как чистый текст, поэтому математические выражения не вычисляются:



Последний параметр (ложь) может быть опущен:



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

Вы также можете использовать параметр в качестве тестовой строки в операторе #if. Вы должны убедиться, что вы добавляете  (символ pipe) после имени переменной. (Таким образом, если параметр не имеет значения, он вычисляется в пустую строку вместо строки " ".)



Дополнительные примеры этой функции парсера см. в разделе.

#ifeq
Эта функция парсера сравнивает две входные строки, определяет, идентичны ли они, и возвращает одну из двух строк на основе результата. Если требуется больше сравнений и выходных строк, рассмотрите возможность использования.



Если обе строки являются допустимыми числовыми значениями, то строки сравниваются численно:



В противном случае сравнение производится как текст; это сравнение чувствительно к регистру:


 * →  (сравните с аналогичным примером выше, без кавычек)
 * →  (сравните с аналогичным примером выше, с , возвращающим сначала допустимое число)
 * →  (сравните с аналогичным примером выше, без кавычек)
 * →  (сравните с аналогичным примером выше, с , возвращающим сначала допустимое число)

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



и работает следующим образом:


 * → 20
 * → 40
 * → 40

#iferror
Эта функция принимает входную строку и возвращает один из двух результатов; функция возвращает значение, если входная строка содержит HTML-объект с  , генерируемый другими функциями синтаксического анализатора, такими как  ,   и  , шаблоны ошибки, такие как циклы и рекурсии, и другие "отказоустойчивые" ошибки парсера.



Одна или обе возвращаемые строки могут быть опущены. Если строка  опущена, то   возвращается, если она не ошибочна. Если строка  также опущена, то при ошибке возвращается пустая строка:


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

#ifexpr
Эта функция вычисляет математическое выражение и возвращает одну из двух строк в зависимости от логического значения результата:



Входные данные  вычисляются точно так же, как и для   выше, причем доступны те же операторы. Выходные данные затем вычисляются как логическое выражение.

Пустое входное выражение принимает значение :



Как упоминалось выше, нулевое значение равно, а любое не нулевое значение равно  , поэтому эта функция эквивалентна функциям   и  , использующихся одновременно:



за исключением пустого или неправильного входного выражения (сообщение об ошибке обрабатывается как пустая строка; оно не равно нулю, поэтому мы получаем ).



сравнение



Одно или оба возвращаемых значения могут быть опущены; если соответствующая ветвь оставлена пустой, выходные данные не выводятся.:



Boolean operators of equality or inequality operators are supported.



#ifexist
Эта функция принимает входную строку, интерпретирует ее как заголовок страницы и возвращает одно из двух значений в зависимости от того, существует ли страница в локальной Вики.



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



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



Если страница проверяет цель с помощью, то эта страница появится в списке  для целевой страницы. Поэтому, если код  был включен на этой странице, /Foo будет содержать.

В вики, использующих общий медиа-репозиторий,  можно использовать для проверки, был ли файл загружен в репозиторий, но не в саму Вики:



Если для файла была создана локальная страница описания, результатом будет "существуют" для всех вышеперечисленных.

не работает с интервики-ссылками.

#ifexist ограничения
считается "дорогой функцией парсера"; только ограниченное число может быть включено на каждой отдельной странице (включая функции внутри трансклюзованных шаблонов). При превышении этого предела любые дополнительные функции  автоматически возвращают Ложь, независимо от того, существует ли целевая страница или нет, и страница классифицируется в Category:. Название может варьировать в зависимости от языка содержимого Вики.

В некоторых случаях можно эмулировать эффект #ifexist с помощью css, используя селекторы  (для выбора ссылок на несуществующие страницы) или   (для выбора ссылок на существующие страницы). Кроме того, поскольку количество данных функций парсера, которые могут быть использованы на одной странице, контролируется, можно также увеличить лимит в LocalSettings.php, если нужно.

#ifexist и разыскиваемые страницы
Страница, которая не существует и проверена на использование #ifexist, будет в конечном итоге на Разыскиваемые страницы. See for the reason, and w:Template:Linkless exists for a workaround.

#rel2abs
Эта функция преобразует относительный путь к файлу в абсолютный путь к файлу.



Во входных данных  допустим следующий синтаксис:


 * → текущий уровень
 * → подняться на один уровень вверх
 * → опустится на один уровень вниз в подкаталог /foo

Если  не указан, вместо него будет использоваться полное имя страницы:



Недопустимый синтаксис, например  или , игнорируются. Поскольку допускается не более двух последовательных полных остановок, такие последовательности могут использоваться для разделения последовательных операторов:



#switch
''См. также: w:Help:Switch parser function''

Эта функция сравнивает одно входное значение с каждым из набора заранее указанных вариантов, возвращая соответствующую совпавшему варианту строку, если совпадение найдено.

Примеры:




 * 1) switch с тегами частичной трансклюзии может создавать конфигурационный файл, который позволяет редактору, незнакомому с шаблонным кодированием, просматривать и редактировать настраиваемые элементы.

По умолчанию
возвращается, если строка  не совпадает с  :



В этом синтаксисе результат по умолчанию должен быть последним параметром и не должен содержать обычный (необработанный) знак равенства (знак равенства без ). Если это так, он будет рассматриваться как сравнение случаев, и текст не будет отображаться, если ни один случай не совпадает. Это потому, что значение по умолчанию не было определено (является пустым). Однако, если регистр совпадает, будет возвращена связанная с ним строка.



Кроме того, результат по умолчанию может быть явно объявлен с  строкой " ".

Результаты по умолчанию, объявленные таким образом, могут быть размещены в любом месте функции:



Если параметр  опущен и не выполняется сопоставление, то   не возвращается:



Группировка результатов
Возможен 'провал' значения, где  строки возвращают одинаковые   строки. Это сводит к минимуму дублирование.

Здесь случаи 2, 3 и 4 возвращают ; случаи 6 и 7 оба возвращают " " в последнем параметре может быть опущено в вышеупомянутом случае.

Использование с параметрами
Функция может использоваться с параметрами в виде тестовой строки. В этом случае нет необходимости помещать вертикальную черту после имени параметра, потому что очень маловероятно, что вы выберете регистр для строки " ". (Это значение, которое параметр будет использовать по умолчанию, если черта отсутствует, а параметр не существует или не имеет значения. См. )



В приведенном выше случае, если  равен , функция вернет. Если оно равно, функция вернет. Если параметр пуст или не существует, функция вернет.

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



Здесь, если  равен ,   или  , функция вернет. Если оно равно, функция вернет. Если параметр пуст или не существует, функция вернет.

Кроме того, результат по умолчанию может быть опущен, если вы не хотите ничего возвращать, если значение параметра теста не соответствует ни одному из вариантов.



В этом случае функция возвращает пустую строку, если   не существует и не равен   или , и в этом случае она возвращает   или   соответственно.

Это имеет тот же эффект, что и объявление результата по умолчанию как пустого.



Если по какой-то причине вы решите установить случай как " ", функция вернет результат этого случая, когда параметр не существует или не имеет значения. Параметр должен существовать и иметь значение, отличное от строки " ", чтобы вернуть результат функции по умолчанию.


 * (когда  не существует или пуст):
 * →  Foo 
 * (когда  имеет значение " "):
 * →  Bar 
 * (когда  имеет значение " "):
 * →  Foo 

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

Поведение сравнения
Как и в случае с, сравнение производится численно, если и строка сравнения, и проверяемая строка регистра являются числовыми; или как чувствительная к регистру строка в противном случае:





Строка  может быть пустой:



Как только совпадение найдено, последующие  игнорируются:



Необработанные знаки равенства
Строки "Случай" не могут содержать необработанные знаки равенства. Чтобы обойти это, создайте шаблон =, содержащий один знак равенства:, или замените знак равенства html-кодом.

Пример:

Замена #ifeq
не может быть использован, чтобы уменьшить глубину расширения.

Например:



эквивалентно



т.е. глубокая вложенность, линейная:

С другой стороны, замена переключателя может быть сложной/непрактичной для #if, вложенных в обе ветви (показано с альтернативами отступа, отступами с обеих сторон), что делает полное симметричное дерево:

#time
Эта функция парсера берет дату и/или время (по Григорианскому календарю) и форматирует ее в соответствии с заданным синтаксисом. Можно задать объект даты/времени; для этого, по умолчанию используется значение волшебного слова  – то есть время, когда страница была в последний раз отображена в HTML.



Список принятых кодов форматирования приведен в таблице справа. Любой не распознаваемый символ в строке форматирования передается как неизменённый; это относится также к пустым местам (система не нуждается в них для интерпретации кодов). Существует также два способа экранирования символов в строке форматирования: Кроме того, орграф  интерпретируется как один литерал "x".
 * 1) Обратная косая черта, за которой следует символ форматирования, интерпретируется как один литеральный символ
 * 2) Символы, заключенные в двойные кавычки, считаются литеральными символами, и кавычки удаляются.

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).



может иметь любой формат, принятый функцией PHP strtotime. Принимаются как абсолютное (например, ), так и относительное (например,  ) время.


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

в ISO 639-3 позволяет отображать строку на выбранном языке



Параметр  указывает, относится ли «объект даты / времени» к местному часовому поясу или к UTC.

Это логические параметры: его значение определяется преобразованием значения аргумента (подробности о том, как преобразовать строку в логические значения, см. В official PHP documentation).

См. подробности в следующих примерах:





Если вы рассчитали временную метку Unix, вы можете использовать ее при вычислении даты, предварительно поставив символ.



Full or partial absolute dates can be specified; the function will "fill in" parts of the date that are not specified using the current values:



A four-digit number is always interpreted as a year, never as hours and minutes:



A six-digit number is interpreted as hours, minutes and seconds if possible, but otherwise as an error (not, for instance, a year and month):


 * →  Input is treated as a time rather than a year+month code.
 * →  Although 19:60:09 is not a valid time, 196009 is not interpreted as September 1960.

The function performs a certain amount of date mathematics:



The total length of the format strings of the calls of  is limited to 6000 characters.

Вопрос часового пояса
В функции #time parser существует ошибка(более конкретно в "PHP DateTime"), которая не позволяет передавать "нецелые числа" в качестве относительных смещений часовых поясов. Эта проблема не касается использования часового пояса, например EDT. Например:


 * &rarr;

Однако, Индия находится на смещении времени +5,5 часа от UTC, и поэтому использование ее часового пояса обычно не позволяет правильно рассчитать относительное смещение часового пояса. Вот что происходит:


 * &rarr;

Чтобы обойти эту проблему, просто преобразуйте время в минуты или секунды, например:


 * &rarr;
 * &rarr;

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

#timel
Эта функция полностью идентична функции  в том случае, если параметр   настроен как. При этом всегда используется местное время, установленное в вашей вики при настройке.

Синтаксис функции следующий:





Например, смотрите следующие образцы:





#titleparts
Эта функция разделяет заголовок страницы на сегменты, разделённые слэшем ("/"), и затем на выходе возвращает некоторые из этих сегментов.



Если параметр количество выводимых сегментов не определён, он принимается равным нулю ("0"), и выводятся все сегменты начиная с номера первого выводимого сегмента (включительно). Если номер первого выводимого сегмента не определён или равен "0", то он принимает значение по умолчанию "1":


 * →  See also.
 * →  See also.

Negative values are accepted for both values. Negative values for the number of segments to return parameter effectively 'strips' segments from the end of the string. Negative values for the first segment to return translates to "start with this segment counting from the right":


 * →  Strips one segment from the end of the string. См. также.
 * →   Strips all 4 segments from the end of the string
 * →   Strips 5 segments from the end of the string (more than exist)
 * →   Returns last segment. См. также.
 * →   Strips one segment from the end of the string, then returns the second segment and beyond
 * →   Start copying at the second last element; strip one segment from the end of the string

Before processing, the pagename parameter is HTML-decoded: if it contains some standard HTML character entities, they will be converted to plain characters (internally encoded with UTF-8, i.e. the same encoding as in the MediaWiki source page using this parser function).


 * For example, any occurrence of,  , or   in pagename will be replaced by.
 * No other conversion from HTML to plain text is performed, so HTML tags are left intact at this initial step even if they are invalid in page titles.

Then the decoded pagename is canonicalized into a standard page title supported by MediaWiki, as much as possible:


 * 1) All underscores are automatically replaced with spaces:
 * →  Not bah_boo, despite the underscore in the original.
 * 1) The string is split a maximum of 25 times; further slashes are ignored and the 25th element will contain the rest of the string. The string is also limited to 255 characters, as it is treated as a page title:
 * 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.

}}

Строковые функции
Все эти функции были перенесены в ParserFunctions из расширения StringFunctions. Но они будут доступны только в том случае, если администратор настроит  в файле.

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

#len
Функция #len возвращает длину заданной строки. Её синтаксис имеет следующий вид:

Возвращаемое значение всегда представляет собой количество символов в исходной строке string (после раскрытия вызовов шаблонов, но перед преобразованием в HTML). Если строка пуста (в ней нет ни одного символа), то возвращаемое значение равно нулю.

#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.

Пример: returns.

returns.

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

Пример: returns.

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

Пример: returns.

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

Пример: 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.

Пример: returns.

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

#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 as a workaround. (e.g. your_string_here ) 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.

#urldecode
converts the escape characters from an 'URL encoded' string string back to readable text. The syntax is:

Notes:
 * This function works by directly exposing PHP's urldecode function.
 * A character-code-reference can be found at www.w3schools.com.
 * The opposite,, has been integrated into MediaWiki as of version 1.18; for examples, see.
 * urldecode was merged from Stringfunctions in 2010, by commit 1b75afd18d3695bdb6ffbfccd0e4aec064785363

Limits
This module defines three global settings:


 * $wgStringFunctionsLimitSearch
 * $wgStringFunctionsLimitReplace
 * $wgStringFunctionsLimitPad

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.

Подстановка
Parser functions can be substituted by prefixing the hash character with :


 * → the code   will be inserted in the wikitext since the page exists.

Substitution does not work within ; you can use &hellip;  for this purpose.

Перенаправления
Особенно   может быть полезен в  для страниц, содержащих даты, но это не всегда работает.

Экранирование символа &#124; в таблицах
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.

You can also escape the pipe character for display as a plain, uninterpreted character using an HTML entity:.

Зачистка пробелов
Пробелы, включая новые строки, табуляции и пробелы, удаляются из начала и конца всех параметров функций парсера. Если это нежелательно, то сравнение строк может быть сделано после того, как они будут заключены в кавычки.



Чтобы предотвратить обрезку деталей then и else, см. раздел m:Template:If. Некоторые люди достигают этого с помощью &lt; &gt;  &lt; /nowiki &gt; вместо пробелов


 * → foofoo
 * → foofoo

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




 * || → || foofoo 
 * }

Например,  используется для принудительного сохранения белого пространства браузером, но даже при этом пробелы не отображаются. Это происходит потому, что пробелы очищаются программным обеспечением, прежде чем быть отправленными в браузер.

Можно обойти это поведение, заменив пробелы на  ("breakable space") или   ("non-breakable space"), поскольку они не изменяются программным обеспечением:


 * →  foofoo 
 * → foofoo

Смотрите также

 * m:Help:Calculation
 * m:Help:Newlines and spaces
 * m:Help:Comparison between ParserFunctions syntax and TeX syntax
 * , an (incomplete) list of parser functions added by core and extensions.
 * , an (incomplete) list of parser functions added by core and extensions.
 * , an (incomplete) list of parser functions added by core and extensions.
 * Module:String obsoleting
 * Parser functions for Wikibase (the extensions that enables Wikidata): d:Special:MyLanguage/Wikidata:How to use data on Wikimedia projects
 * Parser functions for Wikibase (the extensions that enables Wikidata): d:Special:MyLanguage/Wikidata:How to use data on Wikimedia projects