<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.fetbuk.ru/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=WerySkok</id>
	<title>FetbukWiki - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.fetbuk.ru/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=WerySkok"/>
	<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/WerySkok"/>
	<updated>2026-04-16T01:13:22Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%92%D0%BE%D0%BB%D0%BA%D0%BE%D0%B2_%D0%94%D0%B8%D0%BC%D0%B8%D1%82%D1%80%D0%BE%D1%81&amp;diff=599</id>
		<title>Волков Димитрос</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%92%D0%BE%D0%BB%D0%BA%D0%BE%D0%B2_%D0%94%D0%B8%D0%BC%D0%B8%D1%82%D1%80%D0%BE%D1%81&amp;diff=599"/>
		<updated>2022-03-07T19:16:38Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Бхз&lt;br /&gt;
|title1 = Волков Дмитрий (Волчара Димитрос)&lt;br /&gt;
|image1 = TsBPbVjP7Ms.jpg&lt;br /&gt;
|цитата = У меня в ноутбуке, процессор intel core i2 4 gb ddr1&lt;br /&gt;
|годы жизни = хз-н.в.&lt;br /&gt;
|банда = АЙТИШНИК, даун, ЮТУБ, Основатели Банка Раисы&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;u&amp;gt;&amp;#039;&amp;#039;&amp;#039;Волков Дмитрий (Волчара Димитрос)&amp;#039;&amp;#039;&amp;#039;&amp;lt;/u&amp;gt; - бешенный пацан. Наблюдается не адекватное поведение. Играет через PlayGay в overdroch. Имеет слабый ноут, которому даже место в помойке не заслуженно будет. Живёт в Подзалуповке. Сооснователь [[Банк Раисы|Банка Раисы]]. Имеет свой кал на ютубе.&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%91%D1%85%D0%B7&amp;diff=598</id>
		<title>Шаблон:Бхз</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%91%D1%85%D0%B7&amp;diff=598"/>
		<updated>2022-03-07T19:15:49Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Карточка&lt;br /&gt;
|имя              = Бхз&lt;br /&gt;
|автозаголовки    = да&lt;br /&gt;
&lt;br /&gt;
|стиль_вверху     = &lt;br /&gt;
|стиль_заголовков = &lt;br /&gt;
|стиль_внизу      = &lt;br /&gt;
&lt;br /&gt;
|вверху           = {{{title1|}}}&lt;br /&gt;
|изображение      = {{Карточка/изображение|{{{image1|}}}|caption={{{caption1|}}}|size={{{ширина|}}}}}&lt;br /&gt;
&lt;br /&gt;
|метка1           = Великая цитата&lt;br /&gt;
|текст1           = {{{цитата|}}}&lt;br /&gt;
&lt;br /&gt;
|метка2           = Годы жизни&lt;br /&gt;
|текст2           = {{{годы жизни|}}}&lt;br /&gt;
&lt;br /&gt;
|метка3           = Банда&lt;br /&gt;
|текст3           = {{{банда|}}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
Пример использования:&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Бхз&lt;br /&gt;
|title1=Пример&lt;br /&gt;
|image1=Пример&lt;br /&gt;
|caption1=Пример&lt;br /&gt;
|цитата=Пример&lt;br /&gt;
|годы жизни=Пример&lt;br /&gt;
|банда=Пример&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lanmikeman&amp;diff=597</id>
		<title>Участник:Lanmikeman</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Lanmikeman&amp;diff=597"/>
		<updated>2022-03-07T19:11:08Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: Орфография&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;u&amp;gt;&amp;#039;&amp;#039;&amp;#039;Lannmikeman&amp;#039;&amp;#039;&amp;#039;&amp;lt;/u&amp;gt; - ютубер, имеет 796 подписчиков на [https://www.youtube.com/channel/UCstql6vDn9G8-STTAgUhbqQ своём канале] (данные на 07.03.2022 г.). Снимает влоги, и ЛП. Ведёт стримы. По некоторым данным, сооснователь [[Банк Раисы|Банка Раисы]]. Был в ссоре с Владом Житином.&lt;br /&gt;
&lt;br /&gt;
== Основные направления канала ==&lt;br /&gt;
* Летсплеи&lt;br /&gt;
* Timelapse&lt;br /&gt;
* Видеоблоги&lt;br /&gt;
* Стримы&lt;br /&gt;
Также есть информация, что [[Параша 1|ИТВ &amp;quot;Параша 1&amp;quot;]], создал именно он.&lt;br /&gt;
&lt;br /&gt;
== Как он стал одним из основателей БР ==&lt;br /&gt;
Однажды, летним днём, вместе с его [[Волков Димитрос|дноклассником]], он решил прикольнуться, и создать [[Банк Раисы]]. Слоган [[Банк Раисы|БР]], был:&lt;br /&gt;
&lt;br /&gt;
==== &amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Закажите нашу карту Банка Раисы, и вы получите спиннер в подарок!!!&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039; ====&lt;br /&gt;
Вот так и был создан [[Банк Раисы|БР]]!&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82-%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE_FetbukRadio&amp;diff=331</id>
		<title>Интернет-Радио FetbukRadio</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82-%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE_FetbukRadio&amp;diff=331"/>
		<updated>2022-03-06T17:01:22Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Компании&lt;br /&gt;
|title1 = ПТРК FM&lt;br /&gt;
|image1 = Ptrkfm.png&lt;br /&gt;
|caption1 = Логотип&lt;br /&gt;
|год_основания = 17 февраля, 2018&lt;br /&gt;
|девиз = Слушай и наслаждайся&lt;br /&gt;
|основатели = &lt;br /&gt;
|инфраструктура = Развлекательная, медиа&lt;br /&gt;
}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;u&amp;gt;ПТРК FM (FetbukRadio)&amp;lt;/u&amp;gt;&amp;#039;&amp;#039;&amp;#039; - интернет-радио, созданное БР, 17 февраля, 2018 года. 17 июля 2019 года произошло слияние ПТРК с KTV, в следствии чего, название радио изменилось с KerbFM на нынешнее. Вещает [https://radio.fetbuk.ru/ptrc320 здесь](320 kbps).&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=MediaWiki:Common.js&amp;diff=330</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=MediaWiki:Common.js&amp;diff=330"/>
		<updated>2022-03-06T17:00:05Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: Новая страница: «/**  * Данный код основан на https://ru.wikipedia.org/wiki/MediaWiki:Common.js  * Код MediaWiki:Common.js безусловно загружа...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/**&lt;br /&gt;
 * Данный код основан на https://ru.wikipedia.org/wiki/MediaWiki:Common.js&lt;br /&gt;
 * Код MediaWiki:Common.js безусловно загружается всем пользователям на всех страницах. Во избежание&lt;br /&gt;
 * отправки лишних запросов по возможности не используйте здесь mw.loader.using с модулями, которые&lt;br /&gt;
 * не загружаются по умолчанию (см.&lt;br /&gt;
 * [[Обсуждение MediaWiki:Common.js#Список модулей, загружаемых по умолчанию]]). В таком случае&lt;br /&gt;
 * лучше создать скрытый гаджет, загружаемый по умолчанию, и добавить ему нужные модули в качестве&lt;br /&gt;
 * зависимостей.&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Часто те или иные манипуляции со страницей нужно выполнить как можно раньше, но нет гарантии, что&lt;br /&gt;
 * к моменту выполнения кода нужный участок DOM готов, а событие полной загрузки страницы происходит&lt;br /&gt;
 * слишком поздно. В этой функции проверяется наличие элемента $testElement и в случае успеха&lt;br /&gt;
 * функция-колбэк выполняется, иначе же её выполнение поручается другой функции. Если элемент&lt;br /&gt;
 * в $testElement имеет содержимое, правильнее указать следующий за ним элемент, чтобы быть&lt;br /&gt;
 * уверенным, что он загрузился до конца. Имейте в виду, что разные скины часто используют разные&lt;br /&gt;
 * названия классов и идентификаторов.&lt;br /&gt;
 */&lt;br /&gt;
function runAsEarlyAsPossible( callback, $testElement, func ) {&lt;br /&gt;
	func = func || $;&lt;br /&gt;
	$testElement = $testElement || $( &amp;#039;#footer&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
	if ( $testElement.length ) {&lt;br /&gt;
		callback();&lt;br /&gt;
	} else {&lt;br /&gt;
		func( callback );&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Настройка обработки «е» и «ё» при сортировке в таблицах&lt;br /&gt;
 */&lt;br /&gt;
mw.config.set( &amp;#039;tableSorterCollation&amp;#039;, { &amp;#039;Ё&amp;#039;: &amp;#039;Е&amp;#039;, &amp;#039;ё&amp;#039;: &amp;#039;е&amp;#039; } );&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Строки. Иноязычный интерфейс предположительно включают весьма редко, поэтому раздувать этот&lt;br /&gt;
 * список не стоит. При необходимости добавить много сообщений во много языков можно использовать&lt;br /&gt;
 * механизм системных сообщений (= страниц в пространстве MediaWiki, у которых могут быть суффиксы&lt;br /&gt;
 * типа /en). См., как их получение реализовано в MediaWiki:Gadget-sidebarRelated.js.&lt;br /&gt;
 */&lt;br /&gt;
var expandCaption, collapseCaption, zeroSectionTip;&lt;br /&gt;
if ( mw.config.get( &amp;#039;wgUserLanguage&amp;#039; ) === &amp;#039;en&amp;#039; ) {&lt;br /&gt;
	expandCaption = &amp;#039;show&amp;#039;;&lt;br /&gt;
	collapseCaption = &amp;#039;hide&amp;#039;;&lt;br /&gt;
	zeroSectionTip = &amp;#039;Edit lead section&amp;#039;;&lt;br /&gt;
} else {&lt;br /&gt;
	expandCaption = &amp;#039;показать&amp;#039;;&lt;br /&gt;
	collapseCaption = &amp;#039;скрыть&amp;#039;;&lt;br /&gt;
	zeroSectionTip = &amp;#039;Править преамбулу&amp;#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * [[w:ru:ВП:Сворачиваемые блоки]]&lt;br /&gt;
 */&lt;br /&gt;
// Число раскрытых по умолчанию навигационных (и не только) шаблонов, если им задан параметр&lt;br /&gt;
// autocollapse. Участники могут переопределять это значение в личных JS.&lt;br /&gt;
var NavigationBarShowDefault;&lt;br /&gt;
if ( typeof NavigationBarShowDefault === &amp;#039;undefined&amp;#039; ) {&lt;br /&gt;
	NavigationBarShowDefault = 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// table.collapsible&lt;br /&gt;
// collapsibleTablesItrIdx - временное решние, чтобы не дублировались id,&lt;br /&gt;
// если во время срабатывания хука &amp;#039;wikipage.content&amp;#039; добавляются новые сворачиваемые блоки&lt;br /&gt;
var collapsibleTablesItrIdx = 0;&lt;br /&gt;
	&lt;br /&gt;
function collapsibleTables( $content ) {&lt;br /&gt;
	var $btn,&lt;br /&gt;
		$a,&lt;br /&gt;
		tblIdx = collapsibleTablesItrIdx,&lt;br /&gt;
		navboxCount = 0,&lt;br /&gt;
		notNavboxCount = 0,&lt;br /&gt;
		colTables = [],&lt;br /&gt;
		$Tables = $content.find( &amp;#039;table&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
	$Tables.each( function ( i, table ) {&lt;br /&gt;
		if ( $( table ).hasClass( &amp;#039;collapsible&amp;#039; ) ) {&lt;br /&gt;
			var $table = $( this ),&lt;br /&gt;
				$row = $table.find( &amp;#039;tr&amp;#039; ).first(),&lt;br /&gt;
				$cell = $row.find( &amp;#039;th&amp;#039; ).first();&lt;br /&gt;
			if ( !$cell.length ) {&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			$table.attr( &amp;#039;id&amp;#039;, &amp;#039;collapsibleTable&amp;#039; + tblIdx );&lt;br /&gt;
			$btn = $( &amp;#039;&amp;lt;span&amp;gt;&amp;#039; ).addClass( &amp;#039;collapseButton&amp;#039; );&lt;br /&gt;
			$a = $( &amp;#039;&amp;lt;a&amp;gt;&amp;#039; )&lt;br /&gt;
				.attr( &amp;#039;id&amp;#039;, &amp;#039;collapseButton&amp;#039; + tblIdx )&lt;br /&gt;
				.attr( &amp;#039;href&amp;#039;, &amp;#039;javascript:collapseTable(&amp;#039; + tblIdx + &amp;#039;);&amp;#039; )&lt;br /&gt;
				// Изменяем цвет ссылки, только если цвет текста в навбоксе нестандартный&lt;br /&gt;
				.css( &amp;#039;color&amp;#039;, $cell.css( &amp;#039;color&amp;#039; ) === $( &amp;#039;.mw-body&amp;#039; ).css( &amp;#039;color&amp;#039; ) ? &amp;#039;auto&amp;#039; :&lt;br /&gt;
					$cell.css( &amp;#039;color&amp;#039; ) )&lt;br /&gt;
				.text( collapseCaption );&lt;br /&gt;
			$btn&lt;br /&gt;
				.append( &amp;#039;[&amp;#039; )&lt;br /&gt;
				.append( $a )&lt;br /&gt;
				.append( &amp;#039;]&amp;#039; );&lt;br /&gt;
			if ( $cell.contents().length ) {&lt;br /&gt;
				$btn.insertBefore( $cell.contents().first() );&lt;br /&gt;
			} else {&lt;br /&gt;
				$btn.appendTo( $cell );&lt;br /&gt;
			}&lt;br /&gt;
			// hasClass( &amp;#039;navbox&amp;#039; ) — временное решение для навшаблонов, ещё не переведённых&lt;br /&gt;
			// на {{Навигационная таблица}} (также ниже)&lt;br /&gt;
			if ( $table.hasClass( &amp;#039;navbox-inner&amp;#039; ) || $table.hasClass( &amp;#039;navbox&amp;#039; ) ) {&lt;br /&gt;
				navboxCount++;&lt;br /&gt;
			} else {&lt;br /&gt;
				notNavboxCount++;&lt;br /&gt;
			}&lt;br /&gt;
			colTables[tblIdx++] = $table;&lt;br /&gt;
		}&lt;br /&gt;
	} );&lt;br /&gt;
	for ( var i = collapsibleTablesItrIdx; i &amp;lt; tblIdx; i++ ) {&lt;br /&gt;
		if ( colTables[i].hasClass( &amp;#039;collapsed&amp;#039; ) ||&lt;br /&gt;
			( colTables[i].hasClass( &amp;#039;autocollapse&amp;#039; ) &amp;amp;&amp;amp;&lt;br /&gt;
				( ( ( colTables[i].hasClass( &amp;#039;navbox-inner&amp;#039; ) || colTables[i].hasClass( &amp;#039;navbox&amp;#039; ) ) &amp;amp;&amp;amp;&lt;br /&gt;
						navboxCount &amp;gt; NavigationBarShowDefault ) ||&lt;br /&gt;
					( !( colTables[i].hasClass( &amp;#039;navbox-inner&amp;#039; ) || colTables[i].hasClass( &amp;#039;navbox&amp;#039; ) ) &amp;amp;&amp;amp;&lt;br /&gt;
						notNavboxCount &amp;gt; NavigationBarShowDefault ) ) ) )&lt;br /&gt;
		{&lt;br /&gt;
			collapseTable( i );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	collapsibleTablesItrIdx = tblIdx;&lt;br /&gt;
	// Нужно переписать код на &amp;quot;mw-collapsible&amp;quot;, и заменить использование хука на &amp;quot;wikipage.collapsibleContent&amp;quot;&lt;br /&gt;
	mw.hook( &amp;#039;common.collapsibleContent&amp;#039; ).fire( colTables );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mw.hook( &amp;#039;wikipage.content&amp;#039; ).add( collapsibleTables );&lt;br /&gt;
&lt;br /&gt;
function collapseTable( idx ) {&lt;br /&gt;
	var $table = $( &amp;#039;#collapsibleTable&amp;#039; + idx ),&lt;br /&gt;
		$rows = $table.children().children( &amp;#039;tr&amp;#039; ),&lt;br /&gt;
		$btn = $( &amp;#039;#collapseButton&amp;#039; + idx );&lt;br /&gt;
	if ( !$table.length || !$rows.length || !$btn.length ) {&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	var isExpanded = ( $btn.text() === collapseCaption ),&lt;br /&gt;
		cssDisplay = isExpanded ? &amp;#039;none&amp;#039; : $rows.first().css( &amp;#039;display&amp;#039; );&lt;br /&gt;
&lt;br /&gt;
	$btn.text( isExpanded ? expandCaption : collapseCaption );&lt;br /&gt;
	$rows.slice( 1 ).each( function () {&lt;br /&gt;
		$( this ).css( &amp;#039;display&amp;#039;, cssDisplay );&lt;br /&gt;
	} );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// div.NavFrame&lt;br /&gt;
var navFrameExpandCaption = &amp;#039;[&amp;#039; + expandCaption + &amp;#039;]&amp;#039;,&lt;br /&gt;
	navFrameCollapseCaption = &amp;#039;[&amp;#039; + collapseCaption + &amp;#039;]&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// Изолируем код из глобальной области видимости&lt;br /&gt;
( function () {&lt;br /&gt;
	function collapsibleDivs( $content ) {&lt;br /&gt;
		var navFrameIndex = 0,&lt;br /&gt;
			navFrames = [],&lt;br /&gt;
			i;&lt;br /&gt;
&lt;br /&gt;
		$content.find( &amp;#039;div&amp;#039; ).each( function () {&lt;br /&gt;
			var $div = $( this );&lt;br /&gt;
			if ( $div.hasClass( &amp;#039;NavFrame&amp;#039; ) ) {&lt;br /&gt;
				var $btn = $( &amp;#039;&amp;lt;a&amp;gt;&amp;#039; )&lt;br /&gt;
					.addClass( &amp;#039;NavToggle&amp;#039; )&lt;br /&gt;
					.attr( &amp;#039;href&amp;#039;, &amp;#039;javascript:&amp;#039; )&lt;br /&gt;
					.text( navFrameCollapseCaption )&lt;br /&gt;
					.click( navToggleClickHandler );&lt;br /&gt;
				$div.children( &amp;#039;.NavHead&amp;#039; ).append( $btn );&lt;br /&gt;
				navFrames[ navFrameIndex++ ] = $div;&lt;br /&gt;
			}&lt;br /&gt;
		} );&lt;br /&gt;
		for ( i = 0; i &amp;lt; navFrameIndex; i++ ) {&lt;br /&gt;
			if ( navFrames[ i ].hasClass( &amp;#039;collapsed&amp;#039; ) ||&lt;br /&gt;
				( navFrameIndex &amp;gt; NavigationBarShowDefault &amp;amp;&amp;amp;&lt;br /&gt;
					!navFrames[ i ].hasClass( &amp;#039;expanded&amp;#039; )&lt;br /&gt;
				)&lt;br /&gt;
			) {&lt;br /&gt;
				toggleDiv( navFrames[ i ] );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	mw.hook( &amp;#039;wikipage.content&amp;#039; ).add( collapsibleDivs );&lt;br /&gt;
&lt;br /&gt;
	function navToggleClickHandler() {&lt;br /&gt;
		var $btn = $( this );&lt;br /&gt;
		toggleDiv( $btn.closest( &amp;#039;.NavFrame&amp;#039; ), $btn );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function toggleDiv( $div, $btn ) {&lt;br /&gt;
		$btn = $btn || $div.find( &amp;#039;.NavToggle&amp;#039; ).first();&lt;br /&gt;
		if ( !$div.length || !$btn.length ) return false;&lt;br /&gt;
		var isExpanded = ( $btn.text() === navFrameCollapseCaption );&lt;br /&gt;
		$btn.text( isExpanded ? navFrameExpandCaption : navFrameCollapseCaption );&lt;br /&gt;
		$div.children( &amp;#039;.NavContent, .NavPic&amp;#039; ).each( function () {&lt;br /&gt;
			$( this ).css( &amp;#039;display&amp;#039;, isExpanded ? &amp;#039;none&amp;#039; : &amp;#039;block&amp;#039; );&lt;br /&gt;
		} );&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Aligned_table&amp;diff=329</id>
		<title>Модуль:Aligned table</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Aligned_table&amp;diff=329"/>
		<updated>2022-03-06T16:55:13Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module implements {{aligned table}}&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local function isnotempty(s)&lt;br /&gt;
	return s and s:match( &amp;#039;^%s*(.-)%s*$&amp;#039; ) ~= &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.table(frame)&lt;br /&gt;
	local args = (frame.args[3] ~= nil) and frame.args or frame:getParent().args&lt;br /&gt;
	local entries = {}&lt;br /&gt;
	local colclass = {}&lt;br /&gt;
	local colstyle = {}&lt;br /&gt;
	local cols = tonumber(args[&amp;#039;cols&amp;#039;]) or 2&lt;br /&gt;
&lt;br /&gt;
	-- create the root table&lt;br /&gt;
	local root = mw.html.create(&amp;#039;table&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	-- add table style for fullwidth&lt;br /&gt;
	if isnotempty(args[&amp;#039;fullwidth&amp;#039;]) then&lt;br /&gt;
		root&lt;br /&gt;
			:css(&amp;#039;width&amp;#039;, &amp;#039;100%&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;border-collapse&amp;#039;, &amp;#039;collapse&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;border-spacing&amp;#039;, &amp;#039;0px 0px&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;border&amp;#039;, &amp;#039;none&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- add table classes&lt;br /&gt;
	if isnotempty(args[&amp;#039;class&amp;#039;]) then&lt;br /&gt;
		root:addClass(args[&amp;#039;class&amp;#039;])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- add table style&lt;br /&gt;
	if isnotempty(args[&amp;#039;style&amp;#039;]) then&lt;br /&gt;
		root:cssText(args[&amp;#039;style&amp;#039;])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- build arrays with the column styles and classes&lt;br /&gt;
	if isnotempty(args[&amp;#039;leftright&amp;#039;]) then&lt;br /&gt;
		colstyle[1] = &amp;#039;text-align:left;&amp;#039;&lt;br /&gt;
		colstyle[2] = &amp;#039;text-align:right;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	for i = 1,cols do&lt;br /&gt;
		colclass[ i ] = colclass[ i ] or &amp;#039;&amp;#039;&lt;br /&gt;
		colstyle[ i ] = colstyle[ i ] or &amp;#039;&amp;#039;&lt;br /&gt;
		if isnotempty(args[&amp;#039;colstyle&amp;#039;]) then&lt;br /&gt;
			colstyle[ i ] = args[&amp;#039;colstyle&amp;#039;] .. &amp;#039;;&amp;#039; .. colstyle[ i ]&lt;br /&gt;
		end&lt;br /&gt;
		if isnotempty(args[&amp;#039;colalign&amp;#039; .. tostring(i)]) then&lt;br /&gt;
			colstyle[ i ] = &amp;#039;text-align:&amp;#039; .. args[&amp;#039;colalign&amp;#039; .. tostring(i)] .. &amp;#039;;&amp;#039; .. colstyle[ i ]&lt;br /&gt;
		elseif isnotempty(args[&amp;#039;col&amp;#039; .. tostring(i) .. &amp;#039;align&amp;#039;]) then&lt;br /&gt;
			colstyle[ i ] = &amp;#039;text-align:&amp;#039; .. args[&amp;#039;col&amp;#039; .. tostring(i) .. &amp;#039;align&amp;#039;] .. &amp;#039;;&amp;#039; .. colstyle[ i ]&lt;br /&gt;
		elseif isnotempty(args[&amp;#039;align&amp;#039; .. tostring(i)]) then&lt;br /&gt;
			colstyle[ i ] = &amp;#039;text-align:&amp;#039; .. args[&amp;#039;align&amp;#039; .. tostring(i)] .. &amp;#039;;&amp;#039; .. colstyle[ i ]&lt;br /&gt;
		end&lt;br /&gt;
		if isnotempty(args[&amp;#039;colnowrap&amp;#039; .. tostring(i)]) then&lt;br /&gt;
			colstyle[ i ] = &amp;#039;white-space:nowrap;&amp;#039; .. colstyle[ i ]&lt;br /&gt;
		elseif isnotempty(args[&amp;#039;col&amp;#039; .. tostring(i) .. &amp;#039;nowrap&amp;#039;]) then&lt;br /&gt;
			colstyle[ i ] = &amp;#039;white-space:nowrap;&amp;#039; .. colstyle[ i ]&lt;br /&gt;
		elseif isnotempty(args[&amp;#039;nowrap&amp;#039; .. tostring(i)]) then&lt;br /&gt;
			colstyle[ i ] = &amp;#039;white-space:nowrap;&amp;#039; .. colstyle[ i ]&lt;br /&gt;
		end&lt;br /&gt;
		if isnotempty(args[&amp;#039;colwidth&amp;#039; .. tostring(i)]) then&lt;br /&gt;
			colstyle[ i ] = &amp;#039;width:&amp;#039; .. args[&amp;#039;colwidth&amp;#039; .. tostring(i)] .. &amp;#039;;&amp;#039; .. colstyle[ i ]&lt;br /&gt;
		elseif isnotempty(args[&amp;#039;col&amp;#039; .. tostring(i) .. &amp;#039;width&amp;#039;]) then&lt;br /&gt;
			colstyle[ i ] = &amp;#039;width:&amp;#039; .. args[&amp;#039;col&amp;#039; .. tostring(i) .. &amp;#039;width&amp;#039;] .. &amp;#039;;&amp;#039; .. colstyle[ i ]&lt;br /&gt;
		elseif isnotempty(args[&amp;#039;colwidth&amp;#039;]) then&lt;br /&gt;
			colstyle[ i ] = &amp;#039;width:&amp;#039; .. args[&amp;#039;colwidth&amp;#039;] .. &amp;#039;;&amp;#039; .. colstyle[ i ]&lt;br /&gt;
		end&lt;br /&gt;
		if isnotempty(args[&amp;#039;colstyle&amp;#039; .. tostring(i)]) then&lt;br /&gt;
			colstyle[ i ] = colstyle[ i ] .. args[&amp;#039;colstyle&amp;#039; .. tostring(i)]&lt;br /&gt;
		elseif isnotempty(args[&amp;#039;col&amp;#039; .. tostring(i) .. &amp;#039;style&amp;#039;]) then&lt;br /&gt;
			colstyle[ i ] = colstyle[ i ] .. args[&amp;#039;col&amp;#039; .. tostring(i) .. &amp;#039;style&amp;#039;]&lt;br /&gt;
		elseif isnotempty(args[&amp;#039;style&amp;#039; .. tostring(i)]) then&lt;br /&gt;
			colstyle[ i ] = colstyle[ i ] .. args[&amp;#039;style&amp;#039; .. tostring(i)]&lt;br /&gt;
		end&lt;br /&gt;
		if isnotempty(args[&amp;#039;colclass&amp;#039; .. tostring(i)]) then&lt;br /&gt;
			colclass[ i ] =  args[&amp;#039;colclass&amp;#039; .. tostring(i)]&lt;br /&gt;
		elseif isnotempty(args[&amp;#039;col&amp;#039; .. tostring(i) .. &amp;#039;class&amp;#039;]) then&lt;br /&gt;
			colclass[ i ] =  args[&amp;#039;col&amp;#039; .. tostring(i) .. &amp;#039;class&amp;#039;]&lt;br /&gt;
		elseif isnotempty(args[&amp;#039;class&amp;#039; .. tostring(i)]) then&lt;br /&gt;
			colclass[ i ] =  args[&amp;#039;class&amp;#039; .. tostring(i)]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- compute the maximum cell index&lt;br /&gt;
	local cellcount = 0&lt;br /&gt;
	for k, v in pairs( args ) do&lt;br /&gt;
		if type( k ) == &amp;#039;number&amp;#039; then&lt;br /&gt;
			cellcount = math.max(cellcount, k)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- compute the number of rows&lt;br /&gt;
	local rows = math.ceil(cellcount / cols)&lt;br /&gt;
&lt;br /&gt;
	-- build the table content&lt;br /&gt;
	if isnotempty(args[&amp;#039;title&amp;#039;]) then&lt;br /&gt;
		local caption = root:tag(&amp;#039;caption&amp;#039;)&lt;br /&gt;
		caption:cssText(args[&amp;#039;titlestyle&amp;#039;])&lt;br /&gt;
		caption:wikitext(args[&amp;#039;title&amp;#039;])&lt;br /&gt;
	end&lt;br /&gt;
	if isnotempty(args[&amp;#039;above&amp;#039;]) then&lt;br /&gt;
		local row = root:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
		local cell = row:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
		cell:attr(&amp;#039;colspan&amp;#039;, cols)&lt;br /&gt;
		cell:cssText(args[&amp;#039;abovestyle&amp;#039;])&lt;br /&gt;
		cell:wikitext(args[&amp;#039;above&amp;#039;])&lt;br /&gt;
	end&lt;br /&gt;
	for j=1,rows do&lt;br /&gt;
		-- start a new row&lt;br /&gt;
		local row = root:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
		row:css(&amp;#039;vertical-align&amp;#039;, &amp;#039;top&amp;#039;)&lt;br /&gt;
		-- loop over the cells in each row&lt;br /&gt;
		for i=1,cols do&lt;br /&gt;
			local cell&lt;br /&gt;
			if isnotempty(args[&amp;#039;row&amp;#039; .. tostring(j) .. &amp;#039;header&amp;#039;]) then&lt;br /&gt;
				cell = row:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
			else&lt;br /&gt;
				cell = row:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			end&lt;br /&gt;
			if args[&amp;#039;class&amp;#039; .. tostring(j) .. &amp;#039;.&amp;#039; .. tostring(i)] then&lt;br /&gt;
				cell:addClass(args[&amp;#039;class&amp;#039; .. tostring(j) .. &amp;#039;.&amp;#039; .. tostring(i)])&lt;br /&gt;
			else&lt;br /&gt;
				if args[&amp;#039;rowclass&amp;#039; .. tostring(j)] then&lt;br /&gt;
					cell:addClass(args[&amp;#039;rowclass&amp;#039; .. tostring(j)])&lt;br /&gt;
				elseif args[&amp;#039;row&amp;#039; .. tostring(j) .. &amp;#039;class&amp;#039;] then&lt;br /&gt;
					cell:addClass(args[&amp;#039;row&amp;#039; .. tostring(j) .. &amp;#039;class&amp;#039;])&lt;br /&gt;
				end&lt;br /&gt;
				if colclass[i] ~= &amp;#039;&amp;#039; then&lt;br /&gt;
					cell:addClass(colclass[i])&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if args[&amp;#039;style&amp;#039; .. tostring(j) .. &amp;#039;.&amp;#039; .. tostring(i)] then&lt;br /&gt;
				cell:cssText(args[&amp;#039;style&amp;#039; .. tostring(j) .. &amp;#039;.&amp;#039; .. tostring(i)])&lt;br /&gt;
			else&lt;br /&gt;
				if args[&amp;#039;rowstyle&amp;#039; .. tostring(j)] then&lt;br /&gt;
					cell:cssText(args[&amp;#039;rowstyle&amp;#039; .. tostring(j)])&lt;br /&gt;
				elseif args[&amp;#039;row&amp;#039; .. tostring(j) .. &amp;#039;style&amp;#039;] then&lt;br /&gt;
					cell:cssText(args[&amp;#039;row&amp;#039; .. tostring(j) .. &amp;#039;style&amp;#039;])&lt;br /&gt;
				end&lt;br /&gt;
				if isnotempty(colstyle[i]) then&lt;br /&gt;
					cell:cssText(colstyle[i])&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			cell:wikitext(args[cols*(j - 1) + i] or &amp;#039;&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- return the root table&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D1%8B_%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_%D1%81%D1%82%D1%80%D0%BE%D0%BA&amp;diff=327</id>
		<title>Шаблон:Шаблоны обработки строк</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D1%8B_%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8_%D1%81%D1%82%D1%80%D0%BE%D0%BA&amp;diff=327"/>
		<updated>2022-03-06T16:55:13Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Навигационная таблица с блоками&lt;br /&gt;
| имя = Шаблоны обработки строк&lt;br /&gt;
| state = {{{state|uncollapsed}}}&lt;br /&gt;
| заголовок = Шаблоны обработки строк&lt;br /&gt;
| класс_списков = hlist&lt;br /&gt;
| tracking = no &lt;br /&gt;
| открытый_блок = {{lc: {{{1|}}} }}&lt;br /&gt;
&lt;br /&gt;
| имя_блока1 = обрезка&lt;br /&gt;
| блок1 = [[w:ru:Trim|Обрезка строк]]&lt;br /&gt;
| список1 =&lt;br /&gt;
  {{Навигационная таблица|child&lt;br /&gt;
   | стиль_чётных = #f7f7f7&lt;br /&gt;
&lt;br /&gt;
   | группа1 = По подсчёту&lt;br /&gt;
   | список1 = &lt;br /&gt;
    {{Aligned table |fullwidth=on |style=text-align:left; |col1width=50%;&lt;br /&gt;
     | {{Aligned table | style = padding-right: 2.5em;&lt;br /&gt;
        | col1style = width: 15em; text-align: right; white-space: nowrap; padding-right: 0.75em;&lt;br /&gt;
        | col2style = font-style: italic;&lt;br /&gt;
&lt;br /&gt;
        | {{tnav|str mid}}                 | Выводит подстроку длиной L, начиная с позиции N.{{#if: {{{примеры|}}} | &amp;lt;br&amp;gt;{{пример|str mid|строка|3|2}} }}&lt;br /&gt;
        | {{tnav|trunc}}                   | Выводит символы от начала строки до N или дублирует строку до N символов.{{#if: {{{примеры|}}} | &amp;lt;br&amp;gt;{{пример|trunc|строка|3}} }}&lt;br /&gt;
        | {{tnav|str left}}                | Выводит символы от начала строки до N или дублирует строку до N символов.{{#if: {{{примеры|}}} | &amp;lt;br&amp;gt;{{пример|str left|строка|3}} }}&lt;br /&gt;
        | {{tnav|str crop}}                | Удаляет с правой стороны строки N символов.{{#if: {{{примеры|}}} | &amp;lt;br&amp;gt;{{пример|str crop|строка|1}} }}&lt;br /&gt;
        | {{tnav|обрезать слева и справа}} | Удаляет с обеих сторон строки N символов.{{#if: {{{примеры|}}} | &amp;lt;br&amp;gt;{{пример|обрезать слева и справа|строка|2}} }}&lt;br /&gt;
       }}&lt;br /&gt;
     | {{Aligned table | style = padding-right: 2.5em;&lt;br /&gt;
        | col1style = width: 15em; text-align: right; white-space: nowrap; padding-right: 0.75em;&lt;br /&gt;
        | col2style = font-style: italic;&lt;br /&gt;
&lt;br /&gt;
        | {{tnav|str right}}               | Выводит символы от N до конца строки.{{#if: {{{примеры|}}} | &amp;lt;br&amp;gt;{{пример|str right|строка|2}} }}&lt;br /&gt;
        | {{tnav|str rightc}}              | Выводит правую часть строки из заданного количества символов.{{#if: {{{примеры|}}} | {{пример|str rightmost|строка|3}} }}&lt;br /&gt;
        | {{tnav|str sub}}                 | Удаляет слева N символов и оставляет L.{{#if: {{{примеры|}}} | &amp;lt;br&amp;gt;{{пример|str sub|строка|2|3}} }}&lt;br /&gt;
        | {{tnav|str sub new}}             | Выбирает из строки подстроку на основе выбранных индексов.{{#if: {{{примеры|}}} | &amp;lt;br&amp;gt;{{пример|str sub new|строка|3|5}} }}&lt;br /&gt;
        | {{tnav|str index}}               | Выводит из строки один символ под номером N.{{#if: {{{примеры|}}} | &amp;lt;br&amp;gt;{{пример|str index|строка|4}} }}&lt;br /&gt;
       }}&lt;br /&gt;
    }}&lt;br /&gt;
&lt;br /&gt;
   | группа2 = По проверке&lt;br /&gt;
   | список2 =&lt;br /&gt;
    {{Aligned table |fullwidth=on |style=text-align:left; |col1width=50%;&lt;br /&gt;
     | {{Aligned table | style = padding-right: 2.5em;&lt;br /&gt;
        | col1style = width: 15em; text-align: right; white-space: nowrap; padding-right: 0.75em;&lt;br /&gt;
        | col2style = font-style: italic;&lt;br /&gt;
&lt;br /&gt;
        | {{tnav|delink}}                       | Удаляет из строки вики-ссылки, оставляя их текст.&lt;br /&gt;
        | {{tnav|удалить теги}}                 | Удаляет из строки все html-теги, оставляя их содержимое.&lt;br /&gt;
        | {{tnav|удалить префикс файла}}        | Вырезает из названия файла пространство имён.&lt;br /&gt;
        | {{tnav|str trim}}                     | Удаляет пробелы справа и слева.{{#if: {{{примеры|}}} | &amp;lt;br&amp;gt;{{пример|str trim|   строка    }} }}&lt;br /&gt;
        | {{tnav|-.}}                           | Удаляет из конца строки точку (одну).&lt;br /&gt;
        | {{tnav|-года}}                        | Удаляет из строки все вхождения слов «год», «года», «г.» и «гг.».&lt;br /&gt;
        | {{tnav|без кв. скобок}}               | Удаляет из строки крайние парные квадратные скобки.&lt;br /&gt;
        | {{tnav|без начала}}                   | Удаляет из строки подстроку, совпадающую с началом строки.&lt;br /&gt;
        | {{tnav|без пунктуации}}               | Удаляет из строки знаки пунктуации.&lt;br /&gt;
        | {{tnav|без символа}}                  | Удаляет из строки первое вхождение символа.&lt;br /&gt;
       }}&lt;br /&gt;
     | {{Aligned table | style = padding-right: 2.5em;&lt;br /&gt;
        | col1style = width: 15em; text-align: right; white-space: nowrap; padding-right: 0.75em;&lt;br /&gt;
        | col2style = font-style: italic;&lt;br /&gt;
&lt;br /&gt;
        | {{tnav|без уточнения}}                | Удаляет из строки уточнение в скобках, если таковое имеется.&lt;br /&gt;
        | {{tnav|без кириллицы}}                | Удаляет из строки все кириллические символы.&lt;br /&gt;
        | {{tnav|без латиницы}}                 | Удаляет из строки все латинские символы.&lt;br /&gt;
        | {{tnav|без цифр}}                     | Удаляет из строки все цифры.&lt;br /&gt;
        | {{tnav|только цифры}}                 | Удаляет из строки всё, кроме цифр.&lt;br /&gt;
        | {{tnav|только число}}                 | Извлекает из строки первое число.&lt;br /&gt;
        | {{tnav|год из заголовка}}             | Выводит первое четырёхзначное число из заголовка.&lt;br /&gt;
        | {{tnav|доменное имя}}                 | Выводит доменное имя сайта по заданному URL.&lt;br /&gt;
        | {{tnav|до символа}}                   | Выводит строку до указанного символа.&lt;br /&gt;
        | {{tnav|после символа}}                | Выводит строку после указанного символа.&lt;br /&gt;
        | {{tnav|первое слово}}                 | Выводит первое слово в строке.{{#if: {{{примеры|}}} | &amp;lt;br&amp;gt;{{пример|первое слово|Hear ye, users |sep=,}} }}&lt;br /&gt;
        | {{tnav|удалить первое слово}}         | Удаляет первое слово в строке.{{#if: {{{примеры|}}} | &amp;lt;br&amp;gt;{{пример|удалить первое слово| Fôo bår bàz }} }}&lt;br /&gt;
        | {{tnav|последнее слово}}              | Выводит последнее слово в строке.{{#if: {{{примеры|}}} | &amp;lt;br&amp;gt;{{пример|последнее слово|Hear ye, users |sep=,}} }}&lt;br /&gt;
        | {{t|remove last word|nav&lt;br /&gt;
           |text=удалить последнее слово&lt;br /&gt;
           |lang=w}}                           | Удаляет последнее слово в строке.&lt;br /&gt;
       }}&lt;br /&gt;
    }}&lt;br /&gt;
 }}&lt;br /&gt;
&lt;br /&gt;
| имя_блока2 = вставка и замена&lt;br /&gt;
| блок2 = Вставка и замена строк&lt;br /&gt;
| список2 = &lt;br /&gt;
  {{Aligned table |fullwidth=on |style=text-align:left; |col1width=50%;&lt;br /&gt;
   | {{Aligned table | style = padding-right: 2.5em;&lt;br /&gt;
      | col1style = width: 15em; text-align: right; white-space: nowrap; padding-right: 0.75em;&lt;br /&gt;
      | col2style = font-style: italic;&lt;br /&gt;
&lt;br /&gt;
      | {{t|strloc insert|nav&lt;br /&gt;
           |text=вставить строку&lt;br /&gt;
           |lang=w}}                           | Вставляет подстроку в указанное место строки или приписывает её к концу, если {{code|strloc}} &amp;lt;{{=}} 0.&lt;br /&gt;
      | {{tnav|multi}}                          | Выводит строку указанное количество раз.&lt;br /&gt;
      | {{tnav|replace}}                        | Заменяет в строке все включения подстроки.&lt;br /&gt;
      | {{tnav|multireplace}}                   | Заменяет в строке несколько символов или групп символов.&lt;br /&gt;
      | {{tnav|без кирлата}}                    | Исправляет текст, набранный [[w:ru:ВП:Кирлат|смесью визуально неразличимой кириллицы и латиницы]], заменяя латинские буквы идентичными по начертанию кириллическими и наоборот.&lt;br /&gt;
      | {{tnav|str rep}}                        | Заменяет в строке указанное количество включений подстроки.&lt;br /&gt;
      | {{tnav|в 2 кв. скобках}}                | Викифицирует первый параметр, если он не викифицирован.&lt;br /&gt;
      | {{tnav|вложенные кавычки}}              | Заменяет в строке все парные кавычки-ёлочки («») на кавычки-лапки („“).&lt;br /&gt;
      | {{tnav|курсив или кавычки}}             | Если строка содержит кириллицу, оборачивает её в кавычки, если латиницу, выделяет курсивом.&lt;br /&gt;
      | {{tnav|курсив или нет}}                 | Если строка содержит латиницу, выделяет её курсивом.&lt;br /&gt;
     }}&lt;br /&gt;
   | {{Aligned table | style = padding-right: 0.5em;&lt;br /&gt;
      | col1style = width: 15em; text-align: right; white-space: nowrap; padding-right: 0.5em;&lt;br /&gt;
      | col2style = font-style: italic; &lt;br /&gt;
&lt;br /&gt;
      | {{tnav|локатив}}                        | Переводит слова в предложный падеж (препозитив).&lt;br /&gt;
      | {{tnav|в стране}}                       | Девикифицирует и переводит в предложный падеж название страны с добавлением предлога.&lt;br /&gt;
      | {{tnav|страна в родительном падеже}}    | Девикифицирует и переводит в родительный падеж название страны.&lt;br /&gt;
      | {{tnav|нр}}                             | Переводит видимую часть ссылки в нижний регистр.&lt;br /&gt;
      | {{tnav|первое последним}}               | Делает первое слово строки последним.&lt;br /&gt;
      | {{tnav|сначала имя}}                    | Меняет порядок с «Фамилия, Имя Отчество» на «Имя Отчество Фамилия».&lt;br /&gt;
      | {{tnav|год-года-лет}}                   | Добавляет к цифровой записи количества лет слово «год», «года» или «лет» в нужном числе и падеже.&lt;br /&gt;
      | {{tnav|+года}}                          | Добавляет к последней цифре слово «года».&lt;br /&gt;
      | {{tnav|±.}}                             | Добавляет точку к концу произвольного текста, если её там нет.&lt;br /&gt;
      | {{tnav|.±}}                             | Делает то же, что и предыдущий, но различает в конце параметра неразрывный пробел.&lt;br /&gt;
     }} &lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
| имя_блока3 = анализ&lt;br /&gt;
| блок3 = Анализ строк&lt;br /&gt;
| список3 =&lt;br /&gt;
  {{Aligned table |fullwidth=on |style=text-align:left; |col1width=50%;&lt;br /&gt;
   | {{Aligned table | style = padding-right: 2.5em;&lt;br /&gt;
      | col1style = width: 15em; text-align: right; white-space: nowrap; padding-right: 0.75em;&lt;br /&gt;
      | col2style = font-style: italic;&lt;br /&gt;
&lt;br /&gt;
      | {{tnav|str len}}                        | Выводит длину строки в символах.{{#if: {{{примеры|}}} | &amp;lt;br&amp;gt;{{пример|Str len|строка}} }}&lt;br /&gt;
      | {{tnav|str ≥ len}}                      | Проверяет, больше или равна длина строки в символах указанному числу.&lt;br /&gt;
      | {{tnav|str ≤ len}}                      | Проверяет, меньше или равна длина строки в символах указанному числу.&lt;br /&gt;
      | {{tnav|str ≠ len}}                      | Проверяет, равна ли длина строки в символах указанному числу.&lt;br /&gt;
      | {{t|str ≤ ≥ len|nav|lang=w}}           | Сравнивает длину строки с заданным числом.&lt;br /&gt;
     }}&lt;br /&gt;
   | {{Aligned table | style = padding-right: 0.5em;&lt;br /&gt;
      | col1style = width: 15em; text-align: right; white-space: nowrap; padding-right: 0.5em;&lt;br /&gt;
      | col2style = font-style: italic; &lt;br /&gt;
&lt;br /&gt;
      | {{tnav|str endswith}}                   | Проверяет, заканчивается ли строка указанной подстрокой.&lt;br /&gt;
      | {{tnav|str find}}                       | Выводит позицию первого вхождения подстроки в текст.&lt;br /&gt;
      | {{tnav|str sub find}}                   | Ищет в строке подстроку с заданным отступом от начала.&lt;br /&gt;
      | {{tnav|ASCII code}}                     | Выводит ASCII-код символа.&lt;br /&gt;
      | {{tnav|is numeric}}                     | Проверяет, является ли строка числом.&lt;br /&gt;
     }}&lt;br /&gt;
  }}&lt;br /&gt;
&lt;br /&gt;
| класс_внизу = hlist&lt;br /&gt;
| внизу =&lt;br /&gt;
* [[Модуль:String]]&lt;br /&gt;
** [[Модуль:String2|2]]&lt;br /&gt;
* [[mw:Help:Magic words/ru|«Волшебные» слова]]&lt;br /&gt;
* [[mw:Help:Extension:ParserFunctions/ru|Функции парсера]]&lt;br /&gt;
&lt;br /&gt;
}}&amp;lt;includeonly&amp;gt;{{#if:{{{nocat|}}}|| {{#switch: {{SUBPAGENAME}} | doc | песочница = | [[Категория:Шаблоны:Работа со строками]] }} }}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{doc-inline}}&lt;br /&gt;
Шаблон предназначен для навигации между шаблонами для работы со строками. По умолчанию он свернут, однако можно развернуть отдельный блок, задав в первом параметре его название (без слова «строк»).&lt;br /&gt;
&lt;br /&gt;
; Параметры&lt;br /&gt;
* &amp;#039;&amp;#039;state&amp;#039;&amp;#039;: состояние шаблона (свернут / развернут), по умолчанию — {{code|uncollapsed}}.&lt;br /&gt;
* &amp;#039;&amp;#039;примеры&amp;#039;&amp;#039;: Для некоторых шаблонов есть примеры использования, которые отображаются при любом непустом значении параметра. &lt;br /&gt;
* &amp;#039;&amp;#039;1&amp;#039;&amp;#039;: название развернутого блока ({{code|обрезка}}, {{code|вставка и замена}}, {{code|анализ}}), например &lt;br /&gt;
{{пример||вставка и замена|_sep = даст}}&lt;br /&gt;
{{doc-end}}{{Указание авторства русскоязычной Википедии}}&lt;br /&gt;
[[Категория:Навигационные шаблоны:Для шаблонов]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9D%D0%B0%D0%B2%D0%B8%D0%B3%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0_%D1%81_%D0%B1%D0%BB%D0%BE%D0%BA%D0%B0%D0%BC%D0%B8&amp;diff=325</id>
		<title>Шаблон:Навигационная таблица с блоками</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9D%D0%B0%D0%B2%D0%B8%D0%B3%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0_%D1%81_%D0%B1%D0%BB%D0%BE%D0%BA%D0%B0%D0%BC%D0%B8&amp;diff=325"/>
		<updated>2022-03-06T16:55:11Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{#invoke:navbox|navboxWithCollapsibleGroups}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;{{doc}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%91%D0%B5%D0%B7_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D0%B0/doc&amp;diff=323</id>
		<title>Шаблон:Без начала/doc</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%91%D0%B5%D0%B7_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D0%B0/doc&amp;diff=323"/>
		<updated>2022-03-06T16:55:10Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{docpage}}&lt;br /&gt;
Шаблон &amp;#039;&amp;#039;&amp;#039;{{t}}&amp;#039;&amp;#039;&amp;#039; предназначен для удаления из строки «начала», которое может там находиться.&lt;br /&gt;
&lt;br /&gt;
== Примеры ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; cellpadding=3&lt;br /&gt;
!Пример&lt;br /&gt;
!Текст&lt;br /&gt;
!Результат&amp;lt;br /&amp;gt;(дан в квадратных скобках)&lt;br /&gt;
|-&lt;br /&gt;
|Удаление части слова||{{tc||Какой-то текст|Как}}||[{{Без начала|Какой-то текст|Как}}]&lt;br /&gt;
|-&lt;br /&gt;
|Удаление слова||{{tc||Какой-то текст|Какой-то}}||[{{Без начала|Какой-то текст|Какой-то}}]&lt;br /&gt;
|-&lt;br /&gt;
|Удаление слова с пробелом||{{tc||Какой-то текст|Какой-то&amp;amp;nbsp;}}&amp;lt;!--неразрывный пробел исопользован для правильного показа примера в столбце «Текст». Реальный пример использует обычный пробел.--&amp;gt;||[{{Без начала|Какой-то текст|Какой-то }}]&lt;br /&gt;
|-&lt;br /&gt;
|Удаление несуществующего слова||{{tc||Какой-то текст|Какой-то там}}||[{{Без начала|Какой-то текст|Какой-то там}}]&lt;br /&gt;
|-&lt;br /&gt;
|Попытка удаления из слова, с неподдерживаемым символом 中||{{tc||Какой-то текст 中|Какой-то}}||[{{Без начала|Какой-то текст 中|Какой-то}}]&lt;br /&gt;
|-&lt;br /&gt;
|Попытка удаления неверного слова||{{tc||Какой-то текст 中|Мой текст}}||[{{Без начала|Какой-то текст 中|Мой текст}}]&lt;br /&gt;
|-&lt;br /&gt;
|Предлагаемое использование при формировании категории в шаблоне||&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[[Категория:Синдромы по алфавиту|{{uc:{{без начала|{{PAGENAME}}|Синдром }}}}]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;||См. [[:Категория:Синдромы по алфавиту]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{шаблоны обработки строк|обрезка}}&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:Tc&amp;diff=321</id>
		<title>Шаблон:Tc</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:Tc&amp;diff=321"/>
		<updated>2022-03-06T16:55:10Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{{{{|safesubst:}}}#invoke: Template call code | withParams | _tag = {{{_tag|code}}} }}&amp;lt;noinclude&amp;gt;{{doc}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:Str_right&amp;diff=319</id>
		<title>Шаблон:Str right</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:Str_right&amp;diff=319"/>
		<updated>2022-03-06T16:55:09Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{&amp;lt;includeonly&amp;gt;safesubst:&amp;lt;/includeonly&amp;gt;Str sub|{{{1}}}|{{{2}}}|{{&amp;lt;includeonly&amp;gt;safesubst:&amp;lt;/includeonly&amp;gt;#expr:{{&amp;lt;includeonly&amp;gt;safesubst:&amp;lt;/includeonly&amp;gt;Str len|{{{1}}}}}-{{{2}}}}}}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{doc}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:Code&amp;diff=317</id>
		<title>Шаблон:Code</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:Code&amp;diff=317"/>
		<updated>2022-03-06T16:55:07Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;&amp;lt;code&amp;gt;{{{1}}}&amp;lt;/code&amp;gt;&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;{{doc}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:Aligned_table&amp;diff=315</id>
		<title>Шаблон:Aligned table</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:Aligned_table&amp;diff=315"/>
		<updated>2022-03-06T16:55:07Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:aligned table|table}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{doc}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%3D&amp;diff=313</id>
		<title>Шаблон:=</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%3D&amp;diff=313"/>
		<updated>2022-03-06T16:55:07Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=&amp;lt;noinclude&amp;gt;{{doc}}{{Указание авторства русскоязычной Википедии}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%91%D0%B5%D0%B7_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D0%B0&amp;diff=311</id>
		<title>Шаблон:Без начала</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%91%D0%B5%D0%B7_%D0%BD%D0%B0%D1%87%D0%B0%D0%BB%D0%B0&amp;diff=311"/>
		<updated>2022-03-06T16:55:06Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{&amp;lt;includeonly&amp;gt;safesubst:&amp;lt;/includeonly&amp;gt;#ifeq:{{&amp;lt;includeonly&amp;gt;safesubst:&amp;lt;/includeonly&amp;gt;Str_left|{{{1}}}|{{&amp;lt;includeonly&amp;gt;safesubst:&amp;lt;/includeonly&amp;gt;#expr:{{&amp;lt;includeonly&amp;gt;safesubst:&amp;lt;/includeonly&amp;gt;str len|{{{2}}}*}}-1}}}}*|{{{2}}}*|{{&amp;lt;includeonly&amp;gt;safesubst:&amp;lt;/includeonly&amp;gt;Str_right|{{{1}}}|{{&amp;lt;includeonly&amp;gt;safesubst:&amp;lt;/includeonly&amp;gt;#expr:{{&amp;lt;includeonly&amp;gt;safesubst:&amp;lt;/includeonly&amp;gt;str len|{{{2}}}*}}-1}}}}|{{{1}}}}}&amp;lt;noinclude&amp;gt;{{doc}}{{Указание авторства русскоязычной Википедии}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9A%D0%BE%D0%BC%D0%BF%D0%B0%D0%BD%D0%B8%D0%B8&amp;diff=309</id>
		<title>Шаблон:Компании</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9A%D0%BE%D0%BC%D0%BF%D0%B0%D0%BD%D0%B8%D0%B8&amp;diff=309"/>
		<updated>2022-03-06T16:54:31Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Карточка&lt;br /&gt;
|имя              = Компании&lt;br /&gt;
|автозаголовки    = да&lt;br /&gt;
&lt;br /&gt;
|стиль_вверху     = &lt;br /&gt;
|стиль_заголовков = &lt;br /&gt;
|стиль_внизу      = &lt;br /&gt;
&lt;br /&gt;
|вверху           = {{{title1|}}}&lt;br /&gt;
|изображение      = {{Карточка/изображение|{{{image1|}}}|caption={{{caption1|}}}|size={{{ширина|}}}}}&lt;br /&gt;
&lt;br /&gt;
|метка1           = Год основания&lt;br /&gt;
|текст1           = {{{год_основания|}}}&lt;br /&gt;
&lt;br /&gt;
|метка2           = Девиз&lt;br /&gt;
|текст2           = {{{девиз|}}}&lt;br /&gt;
&lt;br /&gt;
|метка3           = Основатели&lt;br /&gt;
|текст3           = {{{основатели|}}}&lt;br /&gt;
&lt;br /&gt;
|метка4           = Инфраструктура&lt;br /&gt;
|текст4           = {{{инфраструктура|}}}}}&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
Пример использования:&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Компании&lt;br /&gt;
|title1=Пример&lt;br /&gt;
|image1=Пример&lt;br /&gt;
|caption1=Пример&lt;br /&gt;
|год_основания=Пример&lt;br /&gt;
|девиз=Пример&lt;br /&gt;
|основатели=Пример&lt;br /&gt;
|инфраструктура=Пример&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;title1&amp;quot;: {},&lt;br /&gt;
		&amp;quot;image1&amp;quot;: {},&lt;br /&gt;
		&amp;quot;caption1&amp;quot;: {},&lt;br /&gt;
		&amp;quot;ширина&amp;quot;: {},&lt;br /&gt;
		&amp;quot;год_основания&amp;quot;: {},&lt;br /&gt;
		&amp;quot;девиз&amp;quot;: {},&lt;br /&gt;
		&amp;quot;основатели&amp;quot;: {},&lt;br /&gt;
		&amp;quot;инфраструктура&amp;quot;: {}&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;format&amp;quot;: &amp;quot;block&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Ptrkfm.png&amp;diff=308</id>
		<title>Файл:Ptrkfm.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Ptrkfm.png&amp;diff=308"/>
		<updated>2022-03-06T16:52:47Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82-%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE_FetbukRadio&amp;diff=307</id>
		<title>Интернет-Радио FetbukRadio</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82-%D0%A0%D0%B0%D0%B4%D0%B8%D0%BE_FetbukRadio&amp;diff=307"/>
		<updated>2022-03-06T16:49:55Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: Новая страница: «{{Компании |title1 = ПТРК FM |image1 = Ptrkfm.png |caption1 = Логотип |год_основания = 17 февраля, 2018 |девиз = Слу...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Компании&lt;br /&gt;
|title1 = ПТРК FM&lt;br /&gt;
|image1 = Ptrkfm.png&lt;br /&gt;
|caption1 = Логотип&lt;br /&gt;
|год_основания = 17 февраля, 2018&lt;br /&gt;
|девиз = Слушай и наслаждайся&lt;br /&gt;
|основатели = &lt;br /&gt;
|инфраст-руктура = Развлекательная, медиа&lt;br /&gt;
}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;u&amp;gt;ПТРК FM (FetbukRadio)&amp;lt;/u&amp;gt;&amp;#039;&amp;#039;&amp;#039; - интернет-радио, созданное БР, 17 февраля, 2018 года. 17 июля 2019 года произошло слияние ПТРК с KTV, в следствии чего, название радио изменилось с KerbFM на нынешнее. Вещает [https://radio.fetbuk.ru/ptrc320 здесь](320 kbps).&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:IXmLcB9fe4.jpg&amp;diff=306</id>
		<title>Файл:IXmLcB9fe4.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:IXmLcB9fe4.jpg&amp;diff=306"/>
		<updated>2022-03-06T16:48:35Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%91%D0%B0%D0%BD%D0%BA_%D0%A0%D0%B0%D0%B8%D1%81%D1%8B&amp;diff=305</id>
		<title>Банк Раисы</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%91%D0%B0%D0%BD%D0%BA_%D0%A0%D0%B0%D0%B8%D1%81%D1%8B&amp;diff=305"/>
		<updated>2022-03-06T16:47:40Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: Новая страница: «{{Компании |title1 = Банк Раисы |image1 = IXmLcB9fe4.jpg |год_основания = 2017 |девиз = Закажите нашу карту Б...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Компании&lt;br /&gt;
|title1 = Банк Раисы&lt;br /&gt;
|image1 = IXmLcB9fe4.jpg&lt;br /&gt;
|год_основания = 2017&lt;br /&gt;
|девиз = Закажите нашу карту Банка Раисы, и вы получите спиннер в подарок!!!&lt;br /&gt;
|основатели = &lt;br /&gt;
|инфраструктура = Банковская}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;u&amp;gt;Банк Раисы (БР)&amp;lt;/u&amp;gt;&amp;#039;&amp;#039;&amp;#039; - банк, созданный 8 июля 2017 года. При открытии банка, раздавали фиджет спиннеры. В середине-конце июля, Захаров Шарарамов, задолжал БР, 145000 евро, для лечения аутизма, с помощью Тимура Россолова. На данный момент этот банк не построен и находится у кого-то дома.&lt;br /&gt;
&lt;br /&gt;
Имеется своё [[Интернет-Радио ПТРК FM|Интернет-Радио ПТРК FM]] .&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Navbox&amp;diff=304</id>
		<title>Модуль:Navbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Navbox&amp;diff=304"/>
		<updated>2022-03-06T16:45:48Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- Реализует {{навигационная таблица}}, {{подгруппы навигационной таблицы}} и {{навигационная таблица с блоками}}.&lt;br /&gt;
-- Основной объём кода заимствован из английского Module:Navbox.&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local getArgs -- lazily initialized&lt;br /&gt;
local yesno -- lazily initialized&lt;br /&gt;
local styleratio&lt;br /&gt;
&lt;br /&gt;
local ODD_EVEN_MARKER = &amp;#039;\127_ODDEVEN_\127&amp;#039;&lt;br /&gt;
local RESTART_MARKER = &amp;#039;\127_ODDEVEN0_\127&amp;#039;&lt;br /&gt;
local REGEX_MARKER = &amp;#039;\127_ODDEVEN(%d?)_\127&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- общие параметры для всех шаблонов&lt;br /&gt;
local commonAliases = {&lt;br /&gt;
	name = {&amp;#039;name&amp;#039;, &amp;#039;имя&amp;#039;},&lt;br /&gt;
	navigation = {&amp;#039;navigation&amp;#039;, &amp;#039;навигация&amp;#039;},&lt;br /&gt;
	navbar = {&amp;#039;navbar&amp;#039;, &amp;#039;ссылка_на_просмотр&amp;#039;},&lt;br /&gt;
	state = {&amp;#039;state&amp;#039;},&lt;br /&gt;
	orphan = {&amp;#039;orphan&amp;#039;},&lt;br /&gt;
	tracking = {&amp;#039;tracking&amp;#039;},&lt;br /&gt;
	border = {&amp;#039;border&amp;#039;, 1},&lt;br /&gt;
	title = {&amp;#039;title&amp;#039;, &amp;#039;заголовок&amp;#039;},&lt;br /&gt;
	titlegroup = {&amp;#039;titlegroup&amp;#039;},&lt;br /&gt;
	above = {&amp;#039;above&amp;#039;, &amp;#039;вверху&amp;#039;},&lt;br /&gt;
	image = {&amp;#039;image&amp;#039;, &amp;#039;изображение&amp;#039;},&lt;br /&gt;
	imageleft = {&amp;#039;imageleft&amp;#039;, &amp;#039;изображение2&amp;#039;, &amp;#039;изображение_слева&amp;#039;},&lt;br /&gt;
	below = {&amp;#039;below&amp;#039;, &amp;#039;внизу&amp;#039;},&lt;br /&gt;
		&lt;br /&gt;
	bodyclass = {&amp;#039;bodyclass&amp;#039;, &amp;#039;класс_тела&amp;#039;},&lt;br /&gt;
	titleclass = {&amp;#039;titleclass&amp;#039;, &amp;#039;класс_заголовка&amp;#039;},&lt;br /&gt;
	titlegroupclass = {&amp;#039;titlegroupclass&amp;#039;},&lt;br /&gt;
	aboveclass = {&amp;#039;aboveclass&amp;#039;, &amp;#039;класс_вверху&amp;#039;},&lt;br /&gt;
	belowclass = {&amp;#039;belowclass&amp;#039;, &amp;#039;класс_внизу&amp;#039;},&lt;br /&gt;
	groupclass = {&amp;#039;groupclass&amp;#039;, &amp;#039;класс_групп&amp;#039;},&lt;br /&gt;
	listclass = {&amp;#039;listclass&amp;#039;, &amp;#039;класс_списков&amp;#039;},&lt;br /&gt;
	imageclass = {&amp;#039;imageclass&amp;#039;, &amp;#039;класс_изображения&amp;#039;},&lt;br /&gt;
	&lt;br /&gt;
	basestyle = {&amp;#039;basestyle&amp;#039;, &amp;#039;стиль&amp;#039;, &amp;#039;стиль_базовый&amp;#039;},&lt;br /&gt;
	bodystyle = {&amp;#039;style&amp;#039;, &amp;#039;bodystyle&amp;#039;, &amp;#039;стиль_тела&amp;#039;},&lt;br /&gt;
	titlestyle = {&amp;#039;titlestyle&amp;#039;, &amp;#039;стиль_основного_заголовка&amp;#039;, &amp;#039;стиль_заголовка&amp;#039;},&lt;br /&gt;
	titlegroupstyle = {&amp;#039;titlegroupstyle&amp;#039;},&lt;br /&gt;
	innerstyle = {&amp;#039;innerstyle&amp;#039;},&lt;br /&gt;
	abovestyle = {&amp;#039;abovestyle&amp;#039;, &amp;#039;стиль_вверху&amp;#039;},&lt;br /&gt;
	belowstyle = {&amp;#039;belowstyle&amp;#039;, &amp;#039;стиль_внизу&amp;#039;},&lt;br /&gt;
	imagestyle = {&amp;#039;imagestyle&amp;#039;, &amp;#039;стиль_изображения&amp;#039;},&lt;br /&gt;
	imageleftstyle = {&amp;#039;imageleftstyle&amp;#039;, &amp;#039;imagestyle2&amp;#039;, &amp;#039;стиль_изображения_слева&amp;#039;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- параметры {{навигационная таблица}} и {{подгруппы навигационной таблицы}}&lt;br /&gt;
local standardAliases = {&lt;br /&gt;
	groupstyle = {&amp;#039;groupstyle&amp;#039;, &amp;#039;стиль_заголовков&amp;#039;, &amp;#039;стиль_групп&amp;#039;},&lt;br /&gt;
	liststyle = {&amp;#039;liststyle&amp;#039;, &amp;#039;стиль_списков&amp;#039;},&lt;br /&gt;
	evenodd = {&amp;#039;evenodd&amp;#039;, &amp;#039;чётные_нечётные&amp;#039;, &amp;#039;четные_нечетные&amp;#039;},&lt;br /&gt;
	groupwidth = {&amp;#039;groupwidth&amp;#039;, &amp;#039;ширина_групп&amp;#039;},&lt;br /&gt;
	listpadding = {&amp;#039;listpadding&amp;#039;, &amp;#039;отступ_списков&amp;#039;},&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- параметры {{навигационная таблица}} и {{подгруппы навигационной таблицы}} с нумерацией&lt;br /&gt;
local standardElementAliases = {&lt;br /&gt;
	group = {&amp;#039;group%s&amp;#039;, &amp;#039;заголовок%s&amp;#039;, &amp;#039;группа%s&amp;#039;},&lt;br /&gt;
	list = {&amp;#039;list%s&amp;#039;, &amp;#039;список%s&amp;#039;},&lt;br /&gt;
	groupstyle = {&amp;#039;group%sstyle&amp;#039;, &amp;#039;стиль_заголовка%s&amp;#039;, &amp;#039;стиль_группы%s&amp;#039;},&lt;br /&gt;
	liststyle = {&amp;#039;list%sstyle&amp;#039;, &amp;#039;стиль_списка%s&amp;#039;},&lt;br /&gt;
	listpadding = {&amp;#039;list%spadding&amp;#039;}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- параметры {{навигационная таблица с блоками}}&lt;br /&gt;
-- с нижнего подчеркивания начинаются параметры, конфликтующие с standardAliases &lt;br /&gt;
local groupsParentAliases = {&lt;br /&gt;
	selected = {&amp;#039;selected&amp;#039;, &amp;#039;открытый_блок&amp;#039;, &amp;#039;развернуть&amp;#039;},&lt;br /&gt;
	secttitlestyle = {&amp;#039;secttitlestyle&amp;#039;, &amp;#039;стиль_заголовков&amp;#039;},&lt;br /&gt;
	_groupstyle = {&amp;#039;groupstyle&amp;#039;, &amp;#039;стиль_блоков&amp;#039;},&lt;br /&gt;
	_liststyle = {&amp;#039;liststyle&amp;#039;, &amp;#039;стиль_списков&amp;#039;, &amp;#039;contentstyle&amp;#039;},&lt;br /&gt;
	_listpadding = {&amp;#039;listpadding&amp;#039;, &amp;#039;отступ_списка&amp;#039;, &amp;#039;отступ_списков&amp;#039;}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- параметры {{навигационная таблица с блоками}} с нумерацией&lt;br /&gt;
local groupsChildAliases = {&lt;br /&gt;
	groupname = {&amp;#039;abbr%s&amp;#039;, &amp;#039;имя_блока%s&amp;#039;, &amp;#039;аббр%s&amp;#039;},&lt;br /&gt;
	state = {&amp;#039;state%s&amp;#039;},&lt;br /&gt;
	title = {&amp;#039;group%s&amp;#039;, &amp;#039;блок%s&amp;#039;, &amp;#039;заголовок%s&amp;#039;, &amp;#039;группа%s&amp;#039;, &amp;#039;sect%s&amp;#039;, &amp;#039;section%s&amp;#039;, &amp;#039;секция%s&amp;#039;},&lt;br /&gt;
	list1 = {&amp;#039;list%s&amp;#039;, &amp;#039;список%s&amp;#039;, &amp;#039;content%s&amp;#039;},&lt;br /&gt;
	image = {&amp;#039;image%s&amp;#039;, &amp;#039;изображение%s&amp;#039;},&lt;br /&gt;
	imageleft = {&amp;#039;imageleft%s&amp;#039;, &amp;#039;изображение_слева%s&amp;#039;},&lt;br /&gt;
&lt;br /&gt;
	secttitlestyle = {&amp;#039;sect%stitlestyle&amp;#039;, &amp;#039;стиль%sзаголовка&amp;#039;, &amp;#039;стиль_секции%s&amp;#039;},&lt;br /&gt;
	groupstyle = {&amp;#039;group%sstyle&amp;#039;, &amp;#039;стиль%sблока&amp;#039;, &amp;#039;стиль_группы%s&amp;#039;, &amp;#039;стиль_блока%s&amp;#039;},&lt;br /&gt;
	liststyle = {&amp;#039;list%sstyle&amp;#039;, &amp;#039;стиль%sсписка&amp;#039;, &amp;#039;стиль_списка%s&amp;#039;, &amp;#039;content%sstyle&amp;#039;},&lt;br /&gt;
	color = {&amp;#039;цвет%s&amp;#039;}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function checkAliases(args, aliases, index)&lt;br /&gt;
	for _, alias in ipairs(aliases) do&lt;br /&gt;
		local arg&lt;br /&gt;
		if index then&lt;br /&gt;
			arg = args[string.format(alias, index)]&lt;br /&gt;
		else&lt;br /&gt;
			arg = args[alias]&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if arg then&lt;br /&gt;
			return arg&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function checkElAliases(args, name, index)&lt;br /&gt;
	return checkAliases(args, standardElementAliases[name], index)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function concatStyles(t)&lt;br /&gt;
	local res&lt;br /&gt;
	for k, v in pairs(t) do&lt;br /&gt;
		if v then&lt;br /&gt;
			res = res and res .. &amp;#039;;&amp;#039; .. v or v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function striped(wikitext, args)&lt;br /&gt;
	-- Return wikitext with markers replaced for odd/even striping.&lt;br /&gt;
	-- Child (subgroup) navboxes are flagged with a category that is removed&lt;br /&gt;
	-- by parent navboxes. The result is that the category shows all pages&lt;br /&gt;
	-- where a child navbox is not contained in a parent navbox.&lt;br /&gt;
	local orphanCat = &amp;#039;[[Категория:Навигационные шаблоны без родителя]]&amp;#039;&lt;br /&gt;
	if args.border == &amp;#039;subgroup&amp;#039; and args.orphan ~= &amp;#039;yes&amp;#039; then&lt;br /&gt;
		-- No change; striping occurs in outermost navbox.&lt;br /&gt;
		return wikitext .. orphanCat&lt;br /&gt;
	end&lt;br /&gt;
	local first, second = &amp;#039;odd&amp;#039;, &amp;#039;even&amp;#039;&lt;br /&gt;
	if args.evenodd then&lt;br /&gt;
		if args.evenodd == &amp;#039;swap&amp;#039; then&lt;br /&gt;
			first, second = second, first&lt;br /&gt;
		else&lt;br /&gt;
			first = args.evenodd&lt;br /&gt;
			second = first&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local changer&lt;br /&gt;
	if first == second then&lt;br /&gt;
		changer = first&lt;br /&gt;
	else&lt;br /&gt;
		local index = 0&lt;br /&gt;
		changer = function (code)&lt;br /&gt;
			if code == &amp;#039;0&amp;#039; then&lt;br /&gt;
				-- Current occurrence is for a group before a nested table.&lt;br /&gt;
				-- Set it to first as a valid although pointless class.&lt;br /&gt;
				-- The next occurrence will be the first row after a title&lt;br /&gt;
				-- in a subgroup and will also be first.&lt;br /&gt;
				index = 0&lt;br /&gt;
				return first&lt;br /&gt;
			end&lt;br /&gt;
			index = index + 1&lt;br /&gt;
			return index % 2 == 1 and first or second&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local regex = orphanCat:gsub(&amp;#039;([%[%]])&amp;#039;, &amp;#039;%%%1&amp;#039;)&lt;br /&gt;
	return (wikitext:gsub(regex, &amp;#039;&amp;#039;):gsub(REGEX_MARKER, changer))  -- () omits gsub count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function addNewline(s)&lt;br /&gt;
	if s:match(&amp;#039;^[*:;#]&amp;#039;) or s:match(&amp;#039;^{|&amp;#039;) then&lt;br /&gt;
		return &amp;#039;\n&amp;#039; .. s ..&amp;#039;\n&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderNavBar(titleCell, args)&lt;br /&gt;
&lt;br /&gt;
	if args.navbar ~= &amp;#039;off&amp;#039; and args.navbar ~= &amp;#039;plain&amp;#039; &lt;br /&gt;
		and (args.name or not mw.getCurrentFrame():getParent():getTitle():gsub(&amp;#039;/песочница$&amp;#039;, &amp;#039;&amp;#039;) == &amp;#039;Шаблон:Навигационная таблица&amp;#039;) then&lt;br /&gt;
		&lt;br /&gt;
		-- Check color contrast of the gear icon&lt;br /&gt;
		if not styleratio then&lt;br /&gt;
			styleratio = require(&amp;#039;Module:Color contrast&amp;#039;)._styleratio&lt;br /&gt;
		end&lt;br /&gt;
		local gearColor = &amp;#039;&amp;#039;&lt;br /&gt;
		local contrastStyle = args.titlestyle or args.basestyle&lt;br /&gt;
		local gearStyleBlack = (contrastStyle and mw.text.unstripNoWiki(contrastStyle) .. &amp;#039;; color:#666;&amp;#039; or &amp;#039;&amp;#039;)&lt;br /&gt;
		local gearStyleWhite = (contrastStyle and mw.text.unstripNoWiki(contrastStyle) .. &amp;#039;; color:#fff;&amp;#039; or &amp;#039;&amp;#039;)&lt;br /&gt;
		if styleratio{gearStyleBlack} &amp;lt; styleratio{gearStyleWhite} then&lt;br /&gt;
			gearColor = &amp;#039; white&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		local gear = string.format(&lt;br /&gt;
			&amp;#039;[[Файл:Wikipedia interwiki section gear icon%s.svg|14px|Просмотр этого шаблона|link=Шаблон:%s|alt=⛭]]&amp;#039;,&lt;br /&gt;
			gearColor, args.name&lt;br /&gt;
		)&lt;br /&gt;
		&lt;br /&gt;
		--- Gear creation&lt;br /&gt;
		titleCell&lt;br /&gt;
			:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;navbox-gear&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;float&amp;#039;, &amp;#039;left&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;text-align&amp;#039;, &amp;#039;left&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;width&amp;#039;, &amp;#039;5em&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;margin-right&amp;#039;, &amp;#039;0.5em&amp;#039;)&lt;br /&gt;
				:wikitext(gear)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--   Title row&lt;br /&gt;
--&lt;br /&gt;
local function renderTitleRow(tbl, args)&lt;br /&gt;
	if not args.title then return end&lt;br /&gt;
&lt;br /&gt;
	local titleRow = tbl:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	if args.titlegroup then&lt;br /&gt;
		titleRow&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
				:attr(&amp;#039;scope&amp;#039;, &amp;#039;row&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;navbox-group&amp;#039;)&lt;br /&gt;
				:addClass(args.titlegroupclass)&lt;br /&gt;
				:cssText(args.basestyle)&lt;br /&gt;
				:cssText(args.groupstyle)&lt;br /&gt;
				:cssText(args.titlegroupstyle)&lt;br /&gt;
				:wikitext(args.titlegroup)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local titleCell = titleRow:tag(&amp;#039;th&amp;#039;):attr(&amp;#039;scope&amp;#039;, &amp;#039;colgroup&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	if args.titlegroup then&lt;br /&gt;
		titleCell&lt;br /&gt;
			:css(&amp;#039;border-left&amp;#039;, &amp;#039;2px solid #fdfdfd&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;width&amp;#039;, &amp;#039;100%&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local titleColspan = 2&lt;br /&gt;
	if args.imageleft then titleColspan = titleColspan + 1 end&lt;br /&gt;
	if args.image then titleColspan = titleColspan + 1 end&lt;br /&gt;
	if args.titlegroup then titleColspan = titleColspan - 1 end&lt;br /&gt;
&lt;br /&gt;
	titleCell&lt;br /&gt;
		:cssText(args.basestyle)&lt;br /&gt;
		:cssText(args.titlestyle)&lt;br /&gt;
		:addClass(&amp;#039;navbox-title&amp;#039;)&lt;br /&gt;
		:attr(&amp;#039;colspan&amp;#039;, titleColspan)&lt;br /&gt;
&lt;br /&gt;
	renderNavBar(titleCell, args)&lt;br /&gt;
&lt;br /&gt;
	titleCell&lt;br /&gt;
		:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
			:attr(&amp;#039;id&amp;#039;, mw.uri.anchorEncode(args.title))&lt;br /&gt;
			:addClass(args.titleclass)&lt;br /&gt;
			:css(&amp;#039;font-size&amp;#039;, &amp;#039;114%&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;margin&amp;#039;, &amp;#039;0 5em&amp;#039;)&lt;br /&gt;
			:wikitext(addNewline(args.title))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--   Above/Below rows&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
local function getAboveBelowColspan(args)&lt;br /&gt;
	local ret = 2&lt;br /&gt;
	if args.imageleft then ret = ret + 1 end&lt;br /&gt;
	if args.image then ret = ret + 1 end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderAboveRow(tbl, args)&lt;br /&gt;
	if not args.above then return end&lt;br /&gt;
&lt;br /&gt;
	tbl:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;navbox-abovebelow&amp;#039;)&lt;br /&gt;
			:addClass(args.aboveclass)&lt;br /&gt;
			:cssText(args.basestyle)&lt;br /&gt;
			:cssText(args.abovestyle)&lt;br /&gt;
			:attr(&amp;#039;colspan&amp;#039;, getAboveBelowColspan(args))&lt;br /&gt;
			:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
				:wikitext(addNewline(args.above))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderBelowRow(tbl, args)&lt;br /&gt;
	if not args.below then return end&lt;br /&gt;
&lt;br /&gt;
	tbl:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;navbox-abovebelow&amp;#039;)&lt;br /&gt;
			:addClass(args.belowclass)&lt;br /&gt;
			:cssText(args.basestyle)&lt;br /&gt;
			:cssText(args.belowstyle)&lt;br /&gt;
			:attr(&amp;#039;colspan&amp;#039;, getAboveBelowColspan(args))&lt;br /&gt;
			:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
				:wikitext(addNewline(args.below))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--   List rows&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
local function haveSubgroups(args)&lt;br /&gt;
	for i = 1, 23 do&lt;br /&gt;
		if checkElAliases(args, &amp;#039;group&amp;#039;, i) and checkElAliases(args, &amp;#039;list&amp;#039;, i) then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderListRow(tbl, args, index, rowspan, rowArgs)&lt;br /&gt;
	local row = tbl:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	if index == 1 and args.imageleft then&lt;br /&gt;
		row&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;navbox-image&amp;#039;)&lt;br /&gt;
				:addClass(args.imageclass)&lt;br /&gt;
				:css(&amp;#039;width&amp;#039;, &amp;#039;1px&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;padding&amp;#039;, &amp;#039;0px 7px 0px 0px&amp;#039;)&lt;br /&gt;
				:cssText(args.imageleftstyle)&lt;br /&gt;
				:attr(&amp;#039;rowspan&amp;#039;, rowspan)&lt;br /&gt;
				:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
					:wikitext(addNewline(args.imageleft))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if rowArgs.group then&lt;br /&gt;
		local groupCell = row:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
		groupCell&lt;br /&gt;
			:attr(&amp;#039;scope&amp;#039;, &amp;#039;row&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;navbox-group&amp;#039;)&lt;br /&gt;
			:addClass(args.groupclass)&lt;br /&gt;
			:cssText(args.basestyle)&lt;br /&gt;
			:css(&amp;#039;width&amp;#039;, args.groupwidth or &amp;#039;1px&amp;#039;) -- If groupwidth not specified, minimize width&lt;br /&gt;
&lt;br /&gt;
		groupCell&lt;br /&gt;
			:cssText(args.groupstyle)&lt;br /&gt;
			:cssText(rowArgs.groupstyle)&lt;br /&gt;
			:wikitext(rowArgs.group)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local listCell = row:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	if rowArgs.group then&lt;br /&gt;
		listCell&lt;br /&gt;
			:css(&amp;#039;text-align&amp;#039;, &amp;#039;left&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;border-left-width&amp;#039;, &amp;#039;2px&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;border-left-style&amp;#039;, &amp;#039;solid&amp;#039;)&lt;br /&gt;
	else&lt;br /&gt;
		if haveSubgroups(args) then&lt;br /&gt;
			listCell&lt;br /&gt;
				:attr(&amp;#039;colspan&amp;#039;, 2)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not args.groupwidth then&lt;br /&gt;
		listCell:css(&amp;#039;width&amp;#039;, &amp;#039;100%&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local listText = rowArgs.list&lt;br /&gt;
	local oddEven = ODD_EVEN_MARKER&lt;br /&gt;
	if listText:sub(1, 12) == &amp;#039;&amp;lt;/div&amp;gt;&amp;lt;table&amp;#039; then&lt;br /&gt;
		-- Assume list text is for a subgroup navbox so no automatic striping for this row.&lt;br /&gt;
		oddEven = listText:find(&amp;#039;&amp;lt;th[^&amp;gt;]*&amp;quot;navbox%-title&amp;quot;&amp;#039;) and RESTART_MARKER or &amp;#039;odd&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	listCell&lt;br /&gt;
		:css(&amp;#039;padding&amp;#039;, &amp;#039;0px&amp;#039;)&lt;br /&gt;
		:cssText(args.liststyle)&lt;br /&gt;
		:cssText(rowArgs.liststyle)&lt;br /&gt;
		:addClass(&amp;#039;navbox-list&amp;#039;)&lt;br /&gt;
		:addClass(&amp;#039;navbox-&amp;#039; .. oddEven)&lt;br /&gt;
		:addClass(args.listclass)&lt;br /&gt;
		:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;padding&amp;#039;, rowArgs.listpadding or args.listpadding or &amp;#039;0em 0.25em&amp;#039;)&lt;br /&gt;
			:wikitext(addNewline(listText))&lt;br /&gt;
&lt;br /&gt;
	if index == 1 and args.image then&lt;br /&gt;
		row&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;navbox-image&amp;#039;)&lt;br /&gt;
				:addClass(args.imageclass)&lt;br /&gt;
				:css(&amp;#039;width&amp;#039;, &amp;#039;1px&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;padding&amp;#039;, &amp;#039;0px 0px 0px 7px&amp;#039;)&lt;br /&gt;
				:cssText(args.imagestyle)&lt;br /&gt;
				:attr(&amp;#039;rowspan&amp;#039;, rowspan)&lt;br /&gt;
				:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
					:wikitext(addNewline(args.image))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--   Tracking categories&lt;br /&gt;
--&lt;br /&gt;
local function needsChangetoSubgroups(args)&lt;br /&gt;
	for i = 1, 23 do&lt;br /&gt;
		if (checkElAliases(args, &amp;#039;group&amp;#039;, i)) and not (checkElAliases(args, &amp;#039;list&amp;#039;, i)) then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function needsHorizontalLists(args)&lt;br /&gt;
	if args.border == &amp;#039;subgroup&amp;#039; or args.tracking == &amp;#039;no&amp;#039; then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	local listClasses = {&lt;br /&gt;
		[&amp;#039;plainlist&amp;#039;] = true, [&amp;#039;hlist&amp;#039;] = true, [&amp;#039;hlist hnum&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;hlist hwrap&amp;#039;] = true, [&amp;#039;hlist vcard&amp;#039;] = true, [&amp;#039;vcard hlist&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;hlist vevent&amp;#039;] = true, [&amp;#039;hlist hlist-items-nowrap&amp;#039;] = true, [&amp;#039;hlist-items-nowrap&amp;#039;] = true,&lt;br /&gt;
	}&lt;br /&gt;
	return not (listClasses[args.listclass] or listClasses[args.bodyclass])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- local function hasBackgroundColors()&lt;br /&gt;
--	return mw.ustring.match(titlestyle or &amp;#039;&amp;#039;,&amp;#039;background&amp;#039;) or mw.ustring.match(groupstyle or &amp;#039;&amp;#039;,&amp;#039;background&amp;#039;) or mw.ustring.match(basestyle or &amp;#039;&amp;#039;,&amp;#039;background&amp;#039;)&lt;br /&gt;
-- end&lt;br /&gt;
&lt;br /&gt;
local function isIllegible(args)&lt;br /&gt;
	if not styleratio then&lt;br /&gt;
		styleratio = require(&amp;#039;Module:Color contrast&amp;#039;)._styleratio&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for key, style in pairs(args) do&lt;br /&gt;
		if tostring(key):match(&amp;quot;style$&amp;quot;) or tostring(key):match(&amp;quot;^стиль&amp;quot;) then&lt;br /&gt;
			if styleratio{mw.text.unstripNoWiki(style)} &amp;lt; 4.5 then&lt;br /&gt;
				return true &lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getTrackingCategories(args)&lt;br /&gt;
	local cats = {}&lt;br /&gt;
	if needsChangetoSubgroups(args) then table.insert(cats, &amp;#039;Навигационные шаблоны с ошибочным использованием заголовков&amp;#039;) end&lt;br /&gt;
	if needsHorizontalLists(args) then table.insert(cats, &amp;#039;Навигационные шаблоны без горизонтальных списков&amp;#039;) end&lt;br /&gt;
	if isIllegible(args) then table.insert(cats, &amp;#039;Потенциально нечитаемые навигационные шаблоны&amp;#039;) end&lt;br /&gt;
	return cats&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTrackingCategories(builder, args)&lt;br /&gt;
	local title = mw.title.getCurrentTitle()&lt;br /&gt;
	if title.namespace ~= 10 then return end -- not in template space&lt;br /&gt;
	local subpage = title.subpageText&lt;br /&gt;
	if subpage == &amp;#039;doc&amp;#039; or subpage == &amp;#039;песочница&amp;#039; or subpage == &amp;#039;тесты&amp;#039; then return end&lt;br /&gt;
&lt;br /&gt;
	for i, cat in ipairs(getTrackingCategories(args)) do&lt;br /&gt;
		builder:wikitext(&amp;#039;[[Категория:&amp;#039; .. cat .. &amp;#039;]]&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--   Main navbox tables&lt;br /&gt;
--&lt;br /&gt;
local function renderMainTable(args, listnums)&lt;br /&gt;
	local tbl = mw.html.create(&amp;#039;table&amp;#039;)&lt;br /&gt;
		:addClass(&amp;#039;nowraplinks&amp;#039;)&lt;br /&gt;
		:addClass(args.bodyclass)&lt;br /&gt;
&lt;br /&gt;
	if args.title and (args.state ~= &amp;#039;plain&amp;#039; and args.state ~= &amp;#039;off&amp;#039;) then&lt;br /&gt;
		tbl&lt;br /&gt;
			:addClass(&amp;#039;collapsible&amp;#039;)&lt;br /&gt;
			:addClass(args.state or &amp;#039;autocollapse&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	tbl:css(&amp;#039;border-spacing&amp;#039;, 0)&lt;br /&gt;
	if args.border == &amp;#039;subgroup&amp;#039; or args.border == &amp;#039;none&amp;#039; then&lt;br /&gt;
		tbl&lt;br /&gt;
			:addClass(&amp;#039;navbox-subgroup&amp;#039;)&lt;br /&gt;
			:cssText(args.bodystyle)&lt;br /&gt;
	else -- regular navbox - bodystyle and style will be applied to the wrapper table&lt;br /&gt;
		tbl&lt;br /&gt;
			:addClass(&amp;#039;navbox-inner&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;background&amp;#039;, &amp;#039;transparent&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;color&amp;#039;, &amp;#039;inherit&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	tbl:cssText(args.innerstyle)&lt;br /&gt;
&lt;br /&gt;
	renderTitleRow(tbl, args)&lt;br /&gt;
	renderAboveRow(tbl, args)&lt;br /&gt;
	for i, listnum in ipairs(listnums) do&lt;br /&gt;
		local rowArgs = {&lt;br /&gt;
			group = checkElAliases(args, &amp;#039;group&amp;#039;, listnum),&lt;br /&gt;
			list = checkElAliases(args, &amp;#039;list&amp;#039;, listnum),&lt;br /&gt;
			groupstyle = checkElAliases(args, &amp;#039;groupstyle&amp;#039;, listnum),&lt;br /&gt;
			liststyle = checkElAliases(args, &amp;#039;liststyle&amp;#039;, listnum),&lt;br /&gt;
			listpadding = checkElAliases(args, &amp;#039;listpadding&amp;#039;, listnum)&lt;br /&gt;
		}&lt;br /&gt;
		renderListRow(tbl, args, i, #listnums, rowArgs)&lt;br /&gt;
	end&lt;br /&gt;
	renderBelowRow(tbl, args)&lt;br /&gt;
&lt;br /&gt;
	return tbl&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Read the arguments in the order they&amp;#039;ll be output in, to make references number in the right order.&lt;br /&gt;
local function readInTheRightOrder(args, groupAliases, listAliases)&lt;br /&gt;
	local _&lt;br /&gt;
	_ = checkAliases(args, commonAliases.title)&lt;br /&gt;
	_ = checkAliases(args, commonAliases.above)&lt;br /&gt;
	for i = 1, 23 do&lt;br /&gt;
		_ = checkAliases(args, groupAliases, i)&lt;br /&gt;
		_ = checkAliases(args, listAliases, i)&lt;br /&gt;
	end&lt;br /&gt;
	_ = checkAliases(args, commonAliases.below)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._navbox(args)&lt;br /&gt;
	if not yesno then&lt;br /&gt;
		yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local listnums = {}&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		local listnum = (&amp;#039;&amp;#039; .. k):match(&amp;#039;^list(%d+)$&amp;#039;) or (&amp;#039;&amp;#039; .. k):match(&amp;#039;^список(%d+)$&amp;#039;)&lt;br /&gt;
		if listnum then table.insert(listnums, tonumber(listnum)) end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	table.sort(listnums)&lt;br /&gt;
&lt;br /&gt;
	args.border = mw.text.trim(args.border or args[1] or &amp;#039;&amp;#039;)&lt;br /&gt;
	if args.border == &amp;#039;child&amp;#039; then&lt;br /&gt;
		args.border = &amp;#039;subgroup&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for argname, aliasesList in pairs(commonAliases) do&lt;br /&gt;
		args[argname] = checkAliases(args, aliasesList)	&lt;br /&gt;
	end&lt;br /&gt;
	for argname, aliasesList in pairs(standardAliases) do&lt;br /&gt;
		args[argname] = checkAliases(args, aliasesList)	&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	args.navigation = yesno(args.navigation, &amp;#039;&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	-- render the main body of the navbox&lt;br /&gt;
	local tbl = renderMainTable(args, listnums)&lt;br /&gt;
&lt;br /&gt;
	-- render the appropriate wrapper around the navbox, depending on the border param&lt;br /&gt;
	local res = mw.html.create()&lt;br /&gt;
	if args.border == &amp;#039;none&amp;#039; then&lt;br /&gt;
		local nav = res:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
			:attr(&amp;#039;role&amp;#039;, &amp;#039;navigation&amp;#039;)&lt;br /&gt;
			:node(tbl)&lt;br /&gt;
		if args.title then&lt;br /&gt;
			nav:attr(&amp;#039;aria-labelledby&amp;#039;, mw.uri.anchorEncode(args.title))&lt;br /&gt;
		else&lt;br /&gt;
			nav:attr(&amp;#039;aria-label&amp;#039;, &amp;#039;Навигационный шаблон&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if args.name and args.name ~= &amp;#039;-&amp;#039; then&lt;br /&gt;
			nav:attr(&amp;#039;data-name&amp;#039;, args.name)&lt;br /&gt;
		end&lt;br /&gt;
		if args.navigation == true then&lt;br /&gt;
			nav:attr(&amp;#039;data-navboxnavigation&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
		elseif args.navigation == false then&lt;br /&gt;
			nav:attr(&amp;#039;data-navboxnavigation&amp;#039;, &amp;#039;0&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	elseif args.border == &amp;#039;subgroup&amp;#039; then&lt;br /&gt;
		-- We assume that this navbox is being rendered in a list cell of a parent navbox, and is&lt;br /&gt;
		-- therefore inside a div with padding:0em 0.25em. We start with a &amp;lt;/div&amp;gt; to avoid the&lt;br /&gt;
		-- padding being applied, and at the end add a &amp;lt;div&amp;gt; to balance out the parent&amp;#039;s &amp;lt;/div&amp;gt;&lt;br /&gt;
		res&lt;br /&gt;
			:wikitext(&amp;#039;&amp;lt;/div&amp;gt;&amp;#039;) -- XXX: hack due to lack of unclosed support in mw.html.&lt;br /&gt;
			:node(tbl)&lt;br /&gt;
			:wikitext(&amp;#039;&amp;lt;div&amp;gt;&amp;#039;) -- XXX: hack due to lack of unclosed support in mw.html.&lt;br /&gt;
	else&lt;br /&gt;
		local nav = res:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
			:attr(&amp;#039;role&amp;#039;, &amp;#039;navigation&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;navbox&amp;#039;)&lt;br /&gt;
			:cssText(args.bodystyle)&lt;br /&gt;
			:css(&amp;#039;padding&amp;#039;, &amp;#039;3px&amp;#039;)&lt;br /&gt;
			:node(tbl)&lt;br /&gt;
		if args.title then&lt;br /&gt;
			nav:attr(&amp;#039;aria-labelledby&amp;#039;, mw.uri.anchorEncode(args.title))&lt;br /&gt;
		else&lt;br /&gt;
			nav:attr(&amp;#039;aria-label&amp;#039;, &amp;#039;Навигационный шаблон&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if args.name and args.name ~= &amp;#039;-&amp;#039; then&lt;br /&gt;
			nav:attr(&amp;#039;data-name&amp;#039;, args.name)&lt;br /&gt;
		end&lt;br /&gt;
		if args.navigation == true then&lt;br /&gt;
			nav:attr(&amp;#039;data-navboxnavigation&amp;#039;, &amp;#039;1&amp;#039;)&lt;br /&gt;
		elseif args.navigation == false then&lt;br /&gt;
			nav:attr(&amp;#039;data-navboxnavigation&amp;#039;, &amp;#039;0&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	renderTrackingCategories(res, args)&lt;br /&gt;
&lt;br /&gt;
	return striped(tostring(res), args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.navbox(frame)&lt;br /&gt;
	if not getArgs then&lt;br /&gt;
		getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
	end&lt;br /&gt;
	if not yesno then&lt;br /&gt;
		yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	args = getArgs(frame, {wrappers = {&amp;#039;Шаблон:Навигационная таблица&amp;#039;, &amp;#039;Шаблон:Подгруппы навигационной таблицы&amp;#039;}})&lt;br /&gt;
	if frame.args.border then&lt;br /&gt;
		-- This allows Template:Navbox_subgroup to use {{#invoke:Navbox|navbox|border=...}}.&lt;br /&gt;
		args.border = frame.args.border&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	readInTheRightOrder(args, standardElementAliases.group, standardElementAliases.list)&lt;br /&gt;
&lt;br /&gt;
	return p._navbox(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.navboxWithCollapsibleGroups(frame)&lt;br /&gt;
	if not getArgs then&lt;br /&gt;
		getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
	end&lt;br /&gt;
	local args = getArgs(frame, {wrappers = {&amp;#039;Шаблон:Навигационная таблица с блоками&amp;#039;}})&lt;br /&gt;
	&lt;br /&gt;
	readInTheRightOrder(args, groupsChildAliases.title, groupsChildAliases.list1)&lt;br /&gt;
	&lt;br /&gt;
	local parent = {}&lt;br /&gt;
	for argname, aliasesList in pairs(commonAliases) do&lt;br /&gt;
		parent[argname] = checkAliases(args, aliasesList)	&lt;br /&gt;
	end&lt;br /&gt;
	for argname, aliasesList in pairs(groupsParentAliases) do&lt;br /&gt;
		parent[argname] = checkAliases(args, aliasesList)	&lt;br /&gt;
	end&lt;br /&gt;
				&lt;br /&gt;
	for i = 1, 20 do&lt;br /&gt;
		local child = {}&lt;br /&gt;
		for argname, aliasesList in pairs(groupsChildAliases) do&lt;br /&gt;
			child[argname] = checkAliases(args, aliasesList, i)	&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		child.color = child.color and string.format(&amp;#039;background:%s;&amp;#039;, child.color) or &amp;#039;&amp;#039;&lt;br /&gt;
		child.border = &amp;#039;child&amp;#039;&lt;br /&gt;
		child.navbar = &amp;#039;plain&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
		if parent.selected and parent.selected == child.groupname then&lt;br /&gt;
			child.state = &amp;#039;uncollapsed&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		child.state = child.state or &amp;#039;collapsed&amp;#039;&lt;br /&gt;
		&lt;br /&gt;
		child.basestyle = concatStyles{parent.basestyle, parent.secttitlestyle, child.secttitlestyle}&lt;br /&gt;
    	child.titlestyle = concatStyles{parent._groupstyle, child.groupstyle, child.color}&lt;br /&gt;
    	child.liststyle  = concatStyles{parent._liststyle, child.liststyle}&lt;br /&gt;
    	child.lispadding = parent._listpadding&lt;br /&gt;
		&lt;br /&gt;
		if child.title then&lt;br /&gt;
			parent[&amp;#039;list&amp;#039; .. i] = p._navbox(child)&lt;br /&gt;
		else&lt;br /&gt;
			parent[&amp;#039;list&amp;#039; .. i] = child.list1&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return p._navbox(parent)&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Color_contrast/colors&amp;diff=302</id>
		<title>Модуль:Color contrast/colors</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Color_contrast/colors&amp;diff=302"/>
		<updated>2022-03-06T16:45:48Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;return {&lt;br /&gt;
	aliceblue            = 0.92880068253475,&lt;br /&gt;
	antiquewhite         = 0.84646951707754,&lt;br /&gt;
	aqua                 = 0.7874,&lt;br /&gt;
	aquamarine           = 0.8078549208338,&lt;br /&gt;
	azure                = 0.97265264954166,&lt;br /&gt;
	beige                = 0.8988459998705,&lt;br /&gt;
	bisque               = 0.80732327372979,&lt;br /&gt;
	black                = 0,&lt;br /&gt;
	blanchedalmond       = 0.85084439608156,&lt;br /&gt;
	blue                 = 0.0722,&lt;br /&gt;
	blueviolet           = 0.12622014321946,&lt;br /&gt;
	brown                = 0.098224287876511,&lt;br /&gt;
	burlywood            = 0.51559844533893,&lt;br /&gt;
	cadetblue            = 0.29424681085422,&lt;br /&gt;
	chartreuse           = 0.76032025902623,&lt;br /&gt;
	chocolate            = 0.23898526114557,&lt;br /&gt;
	coral                = 0.37017930872924,&lt;br /&gt;
	cornflowerblue       = 0.30318641994179,&lt;br /&gt;
	cornsilk             = 0.93562110372965,&lt;br /&gt;
	crimson              = 0.16042199953026,&lt;br /&gt;
	cyan                 = 0.7874,&lt;br /&gt;
	darkblue             = 0.018640801980939,&lt;br /&gt;
	darkcyan             = 0.20329317839046,&lt;br /&gt;
	darkgoldenrod        = 0.27264703559993,&lt;br /&gt;
	darkgray             = 0.39675523072563,&lt;br /&gt;
	darkgreen            = 0.091143429047575,&lt;br /&gt;
	darkgrey             = 0.39675523072563,&lt;br /&gt;
	darkkhaki            = 0.45747326349994,&lt;br /&gt;
	darkmagenta          = 0.07353047651207,&lt;br /&gt;
	darkolivegreen       = 0.12651920884889,&lt;br /&gt;
	darkorange           = 0.40016167026524,&lt;br /&gt;
	darkorchid           = 0.13413142174857,&lt;br /&gt;
	darkred              = 0.054889674531132,&lt;br /&gt;
	darksalmon           = 0.40541471563381,&lt;br /&gt;
	darkseagreen         = 0.43789249325969,&lt;br /&gt;
	darkslateblue        = 0.065792846227988,&lt;br /&gt;
	darkslategray        = 0.067608151928044,&lt;br /&gt;
	darkslategrey        = 0.067608151928044,&lt;br /&gt;
	darkturquoise        = 0.4874606277449,&lt;br /&gt;
	darkviolet           = 0.10999048339343,&lt;br /&gt;
	deeppink             = 0.23866895828276,&lt;br /&gt;
	deepskyblue          = 0.44481603395575,&lt;br /&gt;
	dimgray              = 0.14126329114027,&lt;br /&gt;
	dimgrey              = 0.14126329114027,&lt;br /&gt;
	dodgerblue           = 0.27442536991456,&lt;br /&gt;
	firebrick            = 0.10724525535015,&lt;br /&gt;
	floralwhite          = 0.95922484825004,&lt;br /&gt;
	forestgreen          = 0.18920812076002,&lt;br /&gt;
	fuchsia              = 0.2848,&lt;br /&gt;
	gainsboro            = 0.71569350050648,&lt;br /&gt;
	ghostwhite           = 0.94311261886323,&lt;br /&gt;
	gold                 = 0.69860877428159,&lt;br /&gt;
	goldenrod            = 0.41919977809569,&lt;br /&gt;
	gray                 = 0.2158605001139,&lt;br /&gt;
	green                = 0.15438342968146,&lt;br /&gt;
	greenyellow          = 0.80609472611453,&lt;br /&gt;
	grey                 = 0.2158605001139,&lt;br /&gt;
	honeydew             = 0.96336535554782,&lt;br /&gt;
	hotpink              = 0.34658438169715,&lt;br /&gt;
	indianred            = 0.21406134963884,&lt;br /&gt;
	indigo               = 0.03107561486337,&lt;br /&gt;
	ivory                = 0.99071270600615,&lt;br /&gt;
	khaki                = 0.77012343394121,&lt;br /&gt;
	lavender             = 0.80318750514521,&lt;br /&gt;
	lavenderblush        = 0.90172748631046,&lt;br /&gt;
	lawngreen            = 0.73905893124963,&lt;br /&gt;
	lemonchiffon         = 0.94038992245622,&lt;br /&gt;
	lightblue            = 0.63709141280807,&lt;br /&gt;
	lightcoral           = 0.35522120733135,&lt;br /&gt;
	lightcyan            = 0.94587293494829,&lt;br /&gt;
	lightgoldenrodyellow = 0.93348351018297,&lt;br /&gt;
	lightgray            = 0.65140563741982,&lt;br /&gt;
	lightgreen           = 0.69091979956865,&lt;br /&gt;
	lightgrey            = 0.65140563741982,&lt;br /&gt;
	lightpink            = 0.58566152734898,&lt;br /&gt;
	lightsalmon          = 0.4780675225206,&lt;br /&gt;
	lightseagreen        = 0.35050145117042,&lt;br /&gt;
	lightskyblue         = 0.56195637618331,&lt;br /&gt;
	lightslategray       = 0.23830165007287,&lt;br /&gt;
	lightslategrey       = 0.23830165007287,&lt;br /&gt;
	lightsteelblue       = 0.53983888284666,&lt;br /&gt;
	lightyellow          = 0.98161818392882,&lt;br /&gt;
	lime                 = 0.7152,&lt;br /&gt;
	limegreen            = 0.44571042246098,&lt;br /&gt;
	linen                = 0.88357340984379,&lt;br /&gt;
	magenta              = 0.2848,&lt;br /&gt;
	maroon               = 0.045891942324215,&lt;br /&gt;
	mediumaquamarine     = 0.49389703310801,&lt;br /&gt;
	mediumblue           = 0.044077780212328,&lt;br /&gt;
	mediumorchid         = 0.21639251153773,&lt;br /&gt;
	mediumpurple         = 0.22905858091648,&lt;br /&gt;
	mediumseagreen       = 0.34393112338131,&lt;br /&gt;
	mediumslateblue      = 0.20284629471622,&lt;br /&gt;
	mediumspringgreen    = 0.70704308194184,&lt;br /&gt;
	mediumturquoise      = 0.5133827926448,&lt;br /&gt;
	mediumvioletred      = 0.14371899849357,&lt;br /&gt;
	midnightblue         = 0.02071786635086,&lt;br /&gt;
	mintcream            = 0.97834604947588,&lt;br /&gt;
	mistyrose            = 0.82183047859185,&lt;br /&gt;
	moccasin             = 0.80083000991567,&lt;br /&gt;
	navajowhite          = 0.76519682342785,&lt;br /&gt;
	navy                 = 0.015585128108224,&lt;br /&gt;
	oldlace              = 0.91900633405549,&lt;br /&gt;
	olive                = 0.20027537200568,&lt;br /&gt;
	olivedrab            = 0.22593150951929,&lt;br /&gt;
	orange               = 0.4817026703631,&lt;br /&gt;
	orangered            = 0.25516243753416,&lt;br /&gt;
	orchid               = 0.31348806761439,&lt;br /&gt;
	palegoldenrod        = 0.78792647887614,&lt;br /&gt;
	palegreen            = 0.77936759006353,&lt;br /&gt;
	paleturquoise        = 0.76436077921714,&lt;br /&gt;
	palevioletred        = 0.28754994117889,&lt;br /&gt;
	papayawhip           = 0.87797100199835,&lt;br /&gt;
	peachpuff            = 0.74905589878251,&lt;br /&gt;
	peru                 = 0.30113074877936,&lt;br /&gt;
	pink                 = 0.63271070702466,&lt;br /&gt;
	plum                 = 0.45734221587969,&lt;br /&gt;
	powderblue           = 0.68254586500605,&lt;br /&gt;
	purple               = 0.061477070432439,&lt;br /&gt;
	rebeccapurple        = 0.07492341159447,&lt;br /&gt;
	red                  = 0.2126,&lt;br /&gt;
	rosybrown            = 0.32319457649407,&lt;br /&gt;
	royalblue            = 0.16663210743188,&lt;br /&gt;
	saddlebrown          = 0.097922285020521,&lt;br /&gt;
	salmon               = 0.36977241527596,&lt;br /&gt;
	sandybrown           = 0.46628543696283,&lt;br /&gt;
	seagreen             = 0.19734199706275,&lt;br /&gt;
	seashell             = 0.92737862206922,&lt;br /&gt;
	sienna               = 0.13697631337098,&lt;br /&gt;
	silver               = 0.52711512570581,&lt;br /&gt;
	skyblue              = 0.55291668518184,&lt;br /&gt;
	slateblue            = 0.14784278062136,&lt;br /&gt;
	slategray            = 0.20896704076536,&lt;br /&gt;
	slategrey            = 0.20896704076536,&lt;br /&gt;
	snow                 = 0.96533341834849,&lt;br /&gt;
	springgreen          = 0.73052306068529,&lt;br /&gt;
	steelblue            = 0.20562642207625,&lt;br /&gt;
	tan                  = 0.48237604163921,&lt;br /&gt;
	teal                 = 0.16996855778968,&lt;br /&gt;
	thistle              = 0.56818401093733,&lt;br /&gt;
	tomato               = 0.30638612719415,&lt;br /&gt;
	turquoise            = 0.5895536427578,&lt;br /&gt;
	violet               = 0.40315452986676,&lt;br /&gt;
	wheat                = 0.74909702820482,&lt;br /&gt;
	white                = 1,&lt;br /&gt;
	whitesmoke           = 0.91309865179342,&lt;br /&gt;
	yellow               = 0.9278,&lt;br /&gt;
	yellowgreen          = 0.50762957208707,&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Color_contrast&amp;diff=300</id>
		<title>Модуль:Color contrast</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Color_contrast&amp;diff=300"/>
		<updated>2022-03-06T16:45:48Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements &lt;br /&gt;
--  {{Color contrast ratio}}&lt;br /&gt;
--  {{Greater color contrast ratio}}&lt;br /&gt;
--  {{ColorToLum}}&lt;br /&gt;
--  {{RGBColorToLum}}&lt;br /&gt;
--&lt;br /&gt;
local p = {}&lt;br /&gt;
local HTMLcolor = mw.loadData( &amp;#039;Module:Color contrast/colors&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
local function sRGB ( v ) &lt;br /&gt;
	if (v &amp;lt;= 0.03928) then &lt;br /&gt;
		v = v / 12.92&lt;br /&gt;
	else&lt;br /&gt;
		v = math.pow((v+0.055)/1.055, 2.4)&lt;br /&gt;
	end&lt;br /&gt;
	return v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function rgbdec2lum( R, G, B )&lt;br /&gt;
	if ( 0 &amp;lt;= R and R &amp;lt; 256 and 0 &amp;lt;= G and G &amp;lt; 256 and 0 &amp;lt;= B and B &amp;lt; 256 ) then&lt;br /&gt;
		return 0.2126 * sRGB(R/255) + 0.7152 * sRGB(G/255) + 0.0722 * sRGB(B/255)&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hsl2lum( h, s, l )&lt;br /&gt;
	if ( 0 &amp;lt;= h and h &amp;lt; 360 and 0 &amp;lt;= s and s &amp;lt;= 1 and 0 &amp;lt;= l and l &amp;lt;= 1 ) then&lt;br /&gt;
		local c = (1 - math.abs(2*l - 1))*s&lt;br /&gt;
		local x = c*(1 - math.abs( math.fmod(h/60, 2) - 1) )&lt;br /&gt;
		local m = l - c/2&lt;br /&gt;
&lt;br /&gt;
		local r, g, b = m, m, m&lt;br /&gt;
		if( 0 &amp;lt;= h and h &amp;lt; 60 ) then&lt;br /&gt;
			r = r + c&lt;br /&gt;
			g = g + x&lt;br /&gt;
		elseif( 60 &amp;lt;= h and h &amp;lt; 120 ) then&lt;br /&gt;
			r = r + x&lt;br /&gt;
			g = g + c&lt;br /&gt;
		elseif( 120 &amp;lt;= h and h &amp;lt; 180 ) then&lt;br /&gt;
			g = g + c&lt;br /&gt;
			b = b + x&lt;br /&gt;
		elseif( 180 &amp;lt;= h and h &amp;lt; 240 ) then&lt;br /&gt;
			g = g + x&lt;br /&gt;
			b = b + c&lt;br /&gt;
		elseif( 240 &amp;lt;= h and h &amp;lt; 300 ) then&lt;br /&gt;
			r = r + x&lt;br /&gt;
			b = b + c&lt;br /&gt;
		elseif( 300 &amp;lt;= h and h &amp;lt; 360 ) then&lt;br /&gt;
			r = r + c&lt;br /&gt;
			b = b + x&lt;br /&gt;
		end&lt;br /&gt;
		return rgbdec2lum(255*r, 255*g, 255*b)&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function color2lum( c )&lt;br /&gt;
&lt;br /&gt;
	if (c == nil) then&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	-- whitespace&lt;br /&gt;
	c = c:match( &amp;#039;^%s*(.-)[%s;]*$&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
	-- lowercase&lt;br /&gt;
	c = c:lower()&lt;br /&gt;
&lt;br /&gt;
	-- first try to look it up&lt;br /&gt;
	local L = HTMLcolor[c]&lt;br /&gt;
	if (L ~= nil) then&lt;br /&gt;
		return L&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
   	-- convert from hsl&lt;br /&gt;
   	if mw.ustring.match(c,&amp;#039;^hsl%([%s]*[0-9][0-9%.]*[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*%)$&amp;#039;) then&lt;br /&gt;
		local h, s, l = mw.ustring.match(c,&amp;#039;^hsl%([%s]*([0-9][0-9%.]*)[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*%)$&amp;#039;)&lt;br /&gt;
		return hsl2lum(tonumber(h), tonumber(s)/100, tonumber(l)/100)&lt;br /&gt;
   	end&lt;br /&gt;
&lt;br /&gt;
   	-- convert from rgb&lt;br /&gt;
   	if mw.ustring.match(c,&amp;#039;^rgb%([%s]*[0-9][0-9]*[%s]*,[%s]*[0-9][0-9]*[%s]*,[%s]*[0-9][0-9]*[%s]*%)$&amp;#039;) then&lt;br /&gt;
		local R, G, B = mw.ustring.match(c,&amp;#039;^rgb%([%s]*([0-9][0-9]*)[%s]*,[%s]*([0-9][0-9]*)[%s]*,[%s]*([0-9][0-9]*)[%s]*%)$&amp;#039;)&lt;br /&gt;
		return rgbdec2lum(tonumber(R), tonumber(G), tonumber(B))&lt;br /&gt;
   	end&lt;br /&gt;
&lt;br /&gt;
   	-- convert from rgb percent&lt;br /&gt;
   	if mw.ustring.match(c,&amp;#039;^rgb%([%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*%)$&amp;#039;) then&lt;br /&gt;
		local R, G, B = mw.ustring.match(c,&amp;#039;^rgb%([%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*%)$&amp;#039;)&lt;br /&gt;
		return rgbdec2lum(255*tonumber(R)/100, 255*tonumber(G)/100, 255*tonumber(B)/100)&lt;br /&gt;
   	end&lt;br /&gt;
&lt;br /&gt;
	-- remove leading # (if there is one) and whitespace&lt;br /&gt;
	c = mw.ustring.match(c, &amp;#039;^[%s#]*([a-f0-9]*)[%s]*$&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	-- split into rgb&lt;br /&gt;
	local cs = mw.text.split(c or &amp;#039;&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
	if( #cs == 6 ) then&lt;br /&gt;
		local R = 16*tonumber(&amp;#039;0x&amp;#039; .. cs[1]) + tonumber(&amp;#039;0x&amp;#039; .. cs[2])&lt;br /&gt;
		local G = 16*tonumber(&amp;#039;0x&amp;#039; .. cs[3]) + tonumber(&amp;#039;0x&amp;#039; .. cs[4])&lt;br /&gt;
		local B = 16*tonumber(&amp;#039;0x&amp;#039; .. cs[5]) + tonumber(&amp;#039;0x&amp;#039; .. cs[6])&lt;br /&gt;
&lt;br /&gt;
		return rgbdec2lum(R, G, B)&lt;br /&gt;
	elseif ( #cs == 3 ) then&lt;br /&gt;
		local R = 16*tonumber(&amp;#039;0x&amp;#039; .. cs[1]) + tonumber(&amp;#039;0x&amp;#039; .. cs[1])&lt;br /&gt;
		local G = 16*tonumber(&amp;#039;0x&amp;#039; .. cs[2]) + tonumber(&amp;#039;0x&amp;#039; .. cs[2])&lt;br /&gt;
		local B = 16*tonumber(&amp;#039;0x&amp;#039; .. cs[3]) + tonumber(&amp;#039;0x&amp;#039; .. cs[3])&lt;br /&gt;
&lt;br /&gt;
		return rgbdec2lum(R, G, B)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- failure, return blank&lt;br /&gt;
	return &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._greatercontrast(args)&lt;br /&gt;
	local bias = tonumber(args[&amp;#039;bias&amp;#039;] or &amp;#039;0&amp;#039;) or 0&lt;br /&gt;
	local v1 = color2lum(args[1] or &amp;#039;&amp;#039;)&lt;br /&gt;
	local c2 = args[2] or &amp;#039;#FFFFFF&amp;#039;&lt;br /&gt;
	local v2 = color2lum(c2)&lt;br /&gt;
	local c3 = args[3] or &amp;#039;#000000&amp;#039;&lt;br /&gt;
	local v3 = color2lum(c3)&lt;br /&gt;
	local ratio1 = 0;&lt;br /&gt;
	local ratio2 = 0;&lt;br /&gt;
	if (type(v1) == &amp;#039;number&amp;#039; and type(v2) == &amp;#039;number&amp;#039;) then&lt;br /&gt;
		ratio1 = (v2 + 0.05)/(v1 + 0.05)&lt;br /&gt;
		ratio1 = (ratio1 &amp;lt; 1) and 1/ratio1 or ratio1&lt;br /&gt;
	end&lt;br /&gt;
	if (type(v1) == &amp;#039;number&amp;#039; and type(v3) == &amp;#039;number&amp;#039;) then&lt;br /&gt;
		ratio2 = (v3 + 0.05)/(v1 + 0.05)&lt;br /&gt;
		ratio2 = (ratio2 &amp;lt; 1) and 1/ratio2 or ratio2&lt;br /&gt;
	end&lt;br /&gt;
	return (ratio1 + bias &amp;gt; ratio2) and c2 or c3&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._ratio(args)&lt;br /&gt;
	local v1 = color2lum(mw.text.unstripNoWiki(args[1] or &amp;#039;&amp;#039;))&lt;br /&gt;
	local v2 = color2lum(mw.text.unstripNoWiki(args[2] or &amp;#039;&amp;#039;))&lt;br /&gt;
	if (type(v1) == &amp;#039;number&amp;#039; and type(v2) == &amp;#039;number&amp;#039;) then&lt;br /&gt;
		-- v1 should be the brighter of the two.&lt;br /&gt;
		if v2 &amp;gt; v1 then&lt;br /&gt;
			v1, v2 = v2, v1&lt;br /&gt;
		end&lt;br /&gt;
		return (v1 + 0.05)/(v2 + 0.05)&lt;br /&gt;
	else&lt;br /&gt;
		return args[&amp;#039;error&amp;#039;] or &amp;#039;?&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._styleratio(args)&lt;br /&gt;
	local style = (args[1] or &amp;#039;&amp;#039;):lower()&lt;br /&gt;
	local bg, fg = &amp;#039;white&amp;#039;, &amp;#039;#202122&amp;#039;&lt;br /&gt;
	local lum_bg, lum_fg = 1, 0.016&lt;br /&gt;
&lt;br /&gt;
	if args[2] then&lt;br /&gt;
		local lum = color2lum(args[2])&lt;br /&gt;
		if lum ~= &amp;#039;&amp;#039; then bg, lum_bg = args[2], lum end&lt;br /&gt;
	end&lt;br /&gt;
	if args[3] then&lt;br /&gt;
		local lum = color2lum(args[3])&lt;br /&gt;
		if lum ~= &amp;#039;&amp;#039; then fg, lum_fg = args[3], lum end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local slist = mw.text.split(style or &amp;#039;&amp;#039;, &amp;#039;;&amp;#039;)&lt;br /&gt;
	for k = 1, #slist do&lt;br /&gt;
		local s = slist[k]&lt;br /&gt;
		local k, v = s:match( &amp;#039;^[%s]*([^:]-):([^:]-)[%s;]*$&amp;#039; )&lt;br /&gt;
		k = k or &amp;#039;&amp;#039;&lt;br /&gt;
		v = v or &amp;#039;&amp;#039;&lt;br /&gt;
		if (k:match(&amp;#039;^[%s]*(background)[%s]*$&amp;#039;) or k:match(&amp;#039;^[%s]*(background%-color)[%s]*$&amp;#039;)) then&lt;br /&gt;
			local lum = color2lum(v)&lt;br /&gt;
			if( lum ~= &amp;#039;&amp;#039; ) then bg, lum_bg = v, lum end&lt;br /&gt;
		elseif (k:match(&amp;#039;^[%s]*(color)[%s]*$&amp;#039;)) then&lt;br /&gt;
			local lum = color2lum(v)&lt;br /&gt;
			if( lum ~= &amp;#039;&amp;#039; ) then bg, lum_fg = v, lum end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if lum_bg &amp;gt; lum_fg then&lt;br /&gt;
		return (lum_bg + 0.05)/(lum_fg + 0.05)&lt;br /&gt;
	else&lt;br /&gt;
		return (lum_fg + 0.05)/(lum_bg + 0.05)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.lum(frame)&lt;br /&gt;
	return color2lum(frame.args[1] or frame:getParent().args[1])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.ratio(frame)&lt;br /&gt;
	local args = frame.args[1] and frame.args or frame:getParent().args&lt;br /&gt;
	return p._ratio(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.styleratio(frame)&lt;br /&gt;
	local args = frame.args[1] and frame.args or frame:getParent().args&lt;br /&gt;
	return p._styleratio(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.greatercontrast(frame)&lt;br /&gt;
	local args = frame.args[1] and frame.args or frame:getParent().args&lt;br /&gt;
	return p._greatercontrast(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9F%D0%BE%D0%B4%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B0_%D0%9A%D0%B0%D1%80%D1%82%D0%BE%D1%87%D0%BA%D0%B0&amp;diff=298</id>
		<title>Шаблон:Подстраницы шаблона Карточка</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9F%D0%BE%D0%B4%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%B0_%D0%9A%D0%B0%D1%80%D1%82%D0%BE%D1%87%D0%BA%D0%B0&amp;diff=298"/>
		<updated>2022-03-06T16:45:47Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Навигационная таблица&lt;br /&gt;
|имя           = Подстраницы шаблона Карточка&lt;br /&gt;
|state         = {{{state|}}}&lt;br /&gt;
|класс_списков = hlist hlist-items-nowrap&lt;br /&gt;
|заголовок     = Подстраницы шаблона {{tnav|Карточка}}&lt;br /&gt;
&lt;br /&gt;
|группа1       = {{!}}вверху=&lt;br /&gt;
|список1       =&lt;br /&gt;
* {{tnav|карточка/название}} (заголовок без уточнения)&lt;br /&gt;
* {{tnav|карточка/имя}} (заголовок в обратном порядке и без уточнения)&lt;br /&gt;
&lt;br /&gt;
|группа2       = {{!}}вверху2=&lt;br /&gt;
|список2       =&lt;br /&gt;
* {{tnav|карточка/оригинал названия}}&lt;br /&gt;
* {{tnav|карточка/оригинал названия произведения}}&lt;br /&gt;
* {{tnav|карточка/официальное название}}&lt;br /&gt;
* {{tnav|карточка/оригинал имени}}&lt;br /&gt;
&lt;br /&gt;
|группа3       = Разное&lt;br /&gt;
|список3       = &lt;br /&gt;
* {{tnav|карточка/изображение}}&lt;br /&gt;
* {{tnav|карточка/Изображение рядом}}&lt;br /&gt;
* {{tnav|карточка/флаг и герб}}&lt;br /&gt;
* {{tnav|карточка/медали}}&lt;br /&gt;
* {{tnav|карточка/хронология}}&lt;br /&gt;
* {{tnav|карточка/период}}&lt;br /&gt;
* {{tnav|карточка/коды в каталогах}}&lt;br /&gt;
* {{tnav|карточка/блок}}&lt;br /&gt;
* {{tnav|карточка/блок с маркерами}}&lt;br /&gt;
&lt;br /&gt;
|класс_внизу   = hlist&lt;br /&gt;
|внизу         = &lt;br /&gt;
; См. также&lt;br /&gt;
: [[w:ru:Википедия:Шаблоны-карточки|Википедия:Шаблоны-карточки]]&lt;br /&gt;
: [[:Категория:Шаблоны:Для шаблонов-карточек]]&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Категория:Навигационные шаблоны:Для шаблонов]]{{Указание авторства русскоязычной Википедии}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9D%D0%B0%D0%B2%D0%B8%D0%B3%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0&amp;diff=296</id>
		<title>Шаблон:Навигационная таблица</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9D%D0%B0%D0%B2%D0%B8%D0%B3%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0&amp;diff=296"/>
		<updated>2022-03-06T16:45:47Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{#invoke:Navbox|navbox}}&amp;lt;/includeonly&amp;gt;{{#ifeq: {{NAMESPACE}} | Шаблон &lt;br /&gt;
| {{#switch: {{{1|}}}&lt;br /&gt;
  | child | subgroup | none =&lt;br /&gt;
  | {{#ifeq: {{{имя|{{{name|}}}}}} | {{PAGENAME}}&lt;br /&gt;
    |&lt;br /&gt;
    | {{#if:{{yesno|{{{tracking|}}}|no=1|yes=|blank=}}&lt;br /&gt;
      |&lt;br /&gt;
      | {{#if: {{{имя|{{{name|}}}}}}&lt;br /&gt;
        | [[Категория:Навигационные шаблоны, у которых нужно проверить параметр Имя]]&lt;br /&gt;
        | [[Категория:Навигационные шаблоны, у которых предположительно недостаёт параметра Имя]]&lt;br /&gt;
        }}&lt;br /&gt;
      }}&lt;br /&gt;
    }}&lt;br /&gt;
  }}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;{{doc}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9A%D0%B0%D1%80%D1%82%D0%BE%D1%87%D0%BA%D0%B0/%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5/doc&amp;diff=294</id>
		<title>Шаблон:Карточка/изображение/doc</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9A%D0%B0%D1%80%D1%82%D0%BE%D1%87%D0%BA%D0%B0/%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5/doc&amp;diff=294"/>
		<updated>2022-03-06T16:45:47Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{docpage}}&lt;br /&gt;
Используется в [[w:ru:Википедия:Шаблоны-карточки|шаблонах-карточках]] для вывода полей изображений.&lt;br /&gt;
&lt;br /&gt;
== Заполнение в статьях ==&lt;br /&gt;
Для изображений в формате «&amp;#039;&amp;#039;&amp;#039;&amp;lt;nowiki&amp;gt;[[Файл:&amp;lt;Имя&amp;gt;|…]]&amp;lt;/nowiki&amp;gt;&amp;#039;&amp;#039;&amp;#039;» (и вообще для любого параметра, начинающегося с «&amp;#039;&amp;#039;&amp;#039;[&amp;#039;&amp;#039;&amp;#039;», «&amp;#039;&amp;#039;&amp;#039;{&amp;#039;&amp;#039;&amp;#039;» или «&amp;#039;&amp;#039;&amp;#039;&amp;lt;&amp;#039;&amp;#039;&amp;#039;») текст вставится без изменения:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{{изображение|}}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если же просто указано название изображения, то оно оформится так:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;[[Файл:{{{изображение|}}}|274x400px]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Использование шаблона ==&lt;br /&gt;
Вставляется в шаблон {{t|карточка}} — либо в поле {{para|изображение}}, либо в поле {{para|текстN}} (в таком случае может понадобиться сбросить паддинги: {{para|стиль_текстаN|padding:0;}}).&lt;br /&gt;
&lt;br /&gt;
Формат применения:&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;| изображение = {{Карточка/изображение|{{{изображение|}}}|size={{{ширина|}}}|caption={{{описание изображения|}}}}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TemplateData ==&lt;br /&gt;
&amp;lt;templatedata&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;description&amp;quot;: &amp;quot;Этот шаблон используется для вставки параметра изображения.&amp;quot;,&lt;br /&gt;
	&amp;quot;params&amp;quot;: {&lt;br /&gt;
		&amp;quot;1&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;1&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Изображение в любом виде, если &amp;#039;&amp;#039;&amp;#039;none&amp;#039;&amp;#039;&amp;#039; или &amp;#039;&amp;#039;&amp;#039;нет&amp;#039;&amp;#039;&amp;#039;, то игнорируется.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;required&amp;quot;: false&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;caption&amp;quot;: {&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;caption&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Подпись под изображением.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
			&amp;quot;required&amp;quot;: false&lt;br /&gt;
		},&lt;br /&gt;
		&amp;quot;size&amp;quot;: {&lt;br /&gt;
			&amp;quot;aliases&amp;quot;: [&lt;br /&gt;
				&amp;quot;2&amp;quot;&lt;br /&gt;
			],&lt;br /&gt;
			&amp;quot;label&amp;quot;: &amp;quot;size&amp;quot;,&lt;br /&gt;
			&amp;quot;description&amp;quot;: &amp;quot;Его размер, можно с &amp;#039;&amp;#039;&amp;#039;px&amp;#039;&amp;#039;&amp;#039; или без, по-умолчанию — &amp;#039;&amp;#039;&amp;#039;274x400px&amp;#039;&amp;#039;&amp;#039;.&amp;quot;,&lt;br /&gt;
			&amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	},&lt;br /&gt;
	&amp;quot;paramOrder&amp;quot;: [&lt;br /&gt;
		&amp;quot;1&amp;quot;,&lt;br /&gt;
		&amp;quot;size&amp;quot;,&lt;br /&gt;
		&amp;quot;caption&amp;quot;&lt;br /&gt;
	]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/templatedata&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Шаблон:Карточка/изображение/тесты]] (для проверки изменений)&lt;br /&gt;
* {{tl|URL}}&lt;br /&gt;
&lt;br /&gt;
{{Подстраницы шаблона Карточка}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;includeonly&amp;gt;&lt;br /&gt;
[[Категория:Шаблоны:Подстраницы шаблона Карточка]]&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:Tnav&amp;diff=292</id>
		<title>Шаблон:Tnav</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:Tnav&amp;diff=292"/>
		<updated>2022-03-06T16:45:46Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{t|{{{1|}}}|nav|comment={{{comment|}}}}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{doc-inline}}&lt;br /&gt;
&lt;br /&gt;
Это — обёртка для шаблона {{t|tl}}, предназначенная для использования в блоках навигации. Она передаёт в него флаг &amp;lt;code&amp;gt;nav&amp;lt;/code&amp;gt; и комментарий в параметре {{para|comment}}.&lt;br /&gt;
&lt;br /&gt;
{{шаблоны для документирования}}&lt;br /&gt;
&lt;br /&gt;
{{doc-end}}{{Указание авторства русскоязычной Википедии}}&lt;br /&gt;
[[Категория:Шаблоны:Ссылки на шаблоны]]&lt;br /&gt;
[[Категория:Шаблоны:Для навигационных шаблонов]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:Str_find&amp;diff=290</id>
		<title>Шаблон:Str find</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:Str_find&amp;diff=290"/>
		<updated>2022-03-06T16:45:45Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ {{{|safesubst:}}}#invoke:String|str_find|source={{{1|}}}|{{{2|}}}}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{doc}}{{Указание авторства русскоязычной Википедии}}&lt;br /&gt;
&amp;lt;!-- Add categories and interwikis to the /doc subpage, not here! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:Para&amp;diff=288</id>
		<title>Шаблон:Para</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:Para&amp;diff=288"/>
		<updated>2022-03-06T16:45:45Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;code style=&amp;quot;white-space:nowrap;&amp;quot;&amp;gt;&amp;amp;#124;{{#if:{{{1|}}}|{{{1}}}&amp;amp;#61;|}}{{{2|}}}&amp;lt;/code&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{doc}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9A%D0%B0%D1%80%D1%82%D0%BE%D1%87%D0%BA%D0%B0/%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=286</id>
		<title>Шаблон:Карточка/изображение</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9A%D0%B0%D1%80%D1%82%D0%BE%D1%87%D0%BA%D0%B0/%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=286"/>
		<updated>2022-03-06T16:45:43Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{#if:{{{1|}}}|&lt;br /&gt;
 {{#switch:{{{1|}}}&lt;br /&gt;
 |-=-&lt;br /&gt;
 |none=&lt;br /&gt;
 |нет=&lt;br /&gt;
 |{{#switch:{{str left|{{{1|}}}|1}}&lt;br /&gt;
  |[|&amp;lt;|{|={{{1|}}}&lt;br /&gt;
  |[[Файл:{{{1|}}}|{{#if:{{{size|{{{2|}}}}}}|{{#ifeq:{{str rightc|{{{size|{{{2|}}}}}}|2}}|px|{{{size|{{{2|}}}}}}|{{#ifeq:{{str rightc|{{{size|{{{2|}}}}}}|3}}|пкс|{{{size|{{{2|}}}}}}|{{{size|{{{2|}}}}}}px}}}}|274x400px}}{{#if:{{{caption|}}}|{{!}}{{{caption|}}}}}|frameless{{#if:{{{border|}}}|{{!}}border}}{{#if:{{{alt|}}}|{{!}}alt={{{alt|}}}}}]]&lt;br /&gt;
  }}{{#if:{{{caption|}}}&lt;br /&gt;
  |&amp;lt;span class=&amp;quot;media-caption&amp;quot; style=&amp;quot;display:block;&amp;quot;&amp;gt;{{{caption|}}}&amp;lt;/span&amp;gt;&lt;br /&gt;
  }}&lt;br /&gt;
 }}&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if: {{{2|}}} | [[Категория:Страницы с использованием устаревшего формата параметра Карточка/изображение]] }}&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#ifeq: {{str find|{{{size|{{{2|}}}}}}|pxpx}} | -1 || [[Категория:Википедия:Изображение с pxpx в размере]] }}&amp;lt;noinclude&amp;gt;{{doc}}{{Указание авторства русскоязычной Википедии}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9A%D0%BE%D0%BC%D0%BF%D0%B0%D0%BD%D0%B8%D0%B8&amp;diff=284</id>
		<title>Шаблон:Компании</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%9A%D0%BE%D0%BC%D0%BF%D0%B0%D0%BD%D0%B8%D0%B8&amp;diff=284"/>
		<updated>2022-03-06T16:44:57Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Карточка&lt;br /&gt;
|имя              = Компании&lt;br /&gt;
|автозаголовки    = да&lt;br /&gt;
&lt;br /&gt;
стиль_вверху     = &lt;br /&gt;
|стиль_заголовков = &lt;br /&gt;
|стиль_внизу      = &lt;br /&gt;
&lt;br /&gt;
|вверху           = {{{title1|}}}&lt;br /&gt;
|изображение      = {{Карточка/изображение|{{{image1|}}}|caption={{{caption1|}}}|size={{{ширина|}}}}}&lt;br /&gt;
&lt;br /&gt;
|метка1           = Год основания&lt;br /&gt;
|текст1           = {{{год_основания|}}}&lt;br /&gt;
&lt;br /&gt;
|метка2           = Девиз&lt;br /&gt;
|текст2           = {{{девиз|}}}&lt;br /&gt;
&lt;br /&gt;
|метка3           = Основатели&lt;br /&gt;
|текст3           = {{{основатели|}}}&lt;br /&gt;
&lt;br /&gt;
|метка4           = Инфраструктура&lt;br /&gt;
|текст4           = {{{инфраструктура|}}}}}&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
Пример использования:&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Компании&lt;br /&gt;
|title1=Пример&lt;br /&gt;
|image1=Пример&lt;br /&gt;
|caption1=Пример&lt;br /&gt;
|год_основания:=Пример&lt;br /&gt;
|девиз:=Пример&lt;br /&gt;
|основате-ли:=Пример&lt;br /&gt;
|инфраст-руктура:=Пример&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:%D0%AF%D0%BA%D0%BE%D1%80%D1%8C&amp;diff=283</id>
		<title>Модуль:Якорь</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:%D0%AF%D0%BA%D0%BE%D1%80%D1%8C&amp;diff=283"/>
		<updated>2022-03-06T16:36:26Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
local compressSparseArray = require(&amp;#039;Module:TableTools&amp;#039;).compressSparseArray&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local function add_anchor(anchor, text, visible)&lt;br /&gt;
	local result = mw.html.create(&amp;#039;span&amp;#039;)&lt;br /&gt;
		:attr(&amp;#039;id&amp;#039;, anchor)&lt;br /&gt;
		:wikitext(text)&lt;br /&gt;
	if visible then&lt;br /&gt;
		result:addClass(&amp;#039;highlight-target&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	return tostring(result)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function unpack(...)&lt;br /&gt;
	local frame = ...&lt;br /&gt;
	local args&lt;br /&gt;
	if type(frame.args) == &amp;#039;table&amp;#039; then&lt;br /&gt;
		args = getArgs(frame)&lt;br /&gt;
	elseif type(frame) == &amp;#039;table&amp;#039; then&lt;br /&gt;
		args = frame&lt;br /&gt;
	else&lt;br /&gt;
		args = {...}&lt;br /&gt;
	end&lt;br /&gt;
	return args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(...)&lt;br /&gt;
	local args = unpack(...)&lt;br /&gt;
	local anchors = compressSparseArray(args)&lt;br /&gt;
	local text&lt;br /&gt;
	local visible = yesno(args.visible or args.v)&lt;br /&gt;
	if visible then&lt;br /&gt;
		text = args.text or args[&amp;#039;текст&amp;#039;] or args[1]&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local result = text&lt;br /&gt;
	for i, v in ipairs(anchors) do&lt;br /&gt;
		result = add_anchor(anchors[i], result, visible)&lt;br /&gt;
		--[[&lt;br /&gt;
			создание старого вида якорей для совместимости,&lt;br /&gt;
			см. Обсуждение шаблона:Якорь#Новые html5 ссылки и старые&lt;br /&gt;
		]]&lt;br /&gt;
		local encoded_anchor = mw.uri.encode(anchors[i], &amp;#039;WIKI&amp;#039;):gsub(&amp;#039;%%&amp;#039;, &amp;#039;.&amp;#039;)&lt;br /&gt;
		if anchors[i] ~= encoded_anchor then&lt;br /&gt;
			result = add_anchor(encoded_anchor, result, visible)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Yesno&amp;diff=281</id>
		<title>Модуль:Yesno</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Yesno&amp;diff=281"/>
		<updated>2022-03-06T16:36:26Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Function allowing for consistent treatment of boolean-like wikitext input.&lt;br /&gt;
-- It works similarly to the template {{yesno}}.&lt;br /&gt;
&lt;br /&gt;
return function (val, default)&lt;br /&gt;
	-- If your wiki uses non-ascii characters for any of &amp;quot;yes&amp;quot;, &amp;quot;no&amp;quot;, etc., you&lt;br /&gt;
	-- should replace &amp;quot;val:lower()&amp;quot; with &amp;quot;mw.ustring.lower(val)&amp;quot; in the&lt;br /&gt;
	-- following line.&lt;br /&gt;
	val = type(val) == &amp;#039;string&amp;#039; and val:lower() or val&lt;br /&gt;
	if val == nil then&lt;br /&gt;
		return nil&lt;br /&gt;
	elseif val == true &lt;br /&gt;
		or val == &amp;#039;yes&amp;#039;&lt;br /&gt;
		or val == &amp;#039;y&amp;#039;&lt;br /&gt;
		or val == &amp;#039;true&amp;#039;&lt;br /&gt;
		or val == &amp;#039;t&amp;#039;&lt;br /&gt;
		or val == &amp;#039;да&amp;#039;&lt;br /&gt;
		or val == &amp;#039;д&amp;#039;&lt;br /&gt;
        or val == &amp;#039;+&amp;#039;&lt;br /&gt;
		or tonumber(val) == 1&lt;br /&gt;
	then&lt;br /&gt;
		return true&lt;br /&gt;
	elseif val == false&lt;br /&gt;
		or val == &amp;#039;no&amp;#039;&lt;br /&gt;
		or val == &amp;#039;n&amp;#039;&lt;br /&gt;
		or val == &amp;#039;false&amp;#039;&lt;br /&gt;
		or val == &amp;#039;f&amp;#039;&lt;br /&gt;
		or val == &amp;#039;нет&amp;#039;&lt;br /&gt;
		or val == &amp;#039;н&amp;#039;&lt;br /&gt;
		or val == &amp;#039;-&amp;#039;&lt;br /&gt;
		or tonumber(val) == 0&lt;br /&gt;
	then&lt;br /&gt;
		return false&lt;br /&gt;
	else&lt;br /&gt;
		return default&lt;br /&gt;
	end&lt;br /&gt;
end&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Transclude&amp;diff=279</id>
		<title>Модуль:Transclude</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Transclude&amp;diff=279"/>
		<updated>2022-03-06T16:36:26Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p={}&lt;br /&gt;
&lt;br /&gt;
-- Вызывает внутренний шаблон с аргументами объемлющего шаблона&lt;br /&gt;
function p.call(frame)&lt;br /&gt;
	local template = frame.args[1]&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
    return frame:expandTemplate{ title=template, args=args }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Общая реализация для forall и call&lt;br /&gt;
local function forallImpl(args, separator, conjunction, func)&lt;br /&gt;
	-- нумерованные ключи из args&lt;br /&gt;
	local keys = {}&lt;br /&gt;
	-- перебор в произвольном порядке, даже для нумерованных ключей&lt;br /&gt;
	for key, value in pairs(args) do&lt;br /&gt;
		if type(key) == &amp;#039;number&amp;#039; and value and value ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			table.insert(keys, key)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(keys)&lt;br /&gt;
	&lt;br /&gt;
	local results = {}&lt;br /&gt;
	for _, key in ipairs(keys) do&lt;br /&gt;
		local value = func(args[key])&lt;br /&gt;
		table.insert(results, value)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return mw.text.listToText(results, separator, conjunction)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Вызывает внутренний шаблон, передавая ему нумерованные параметры объемлющего шаблона по-одному&lt;br /&gt;
function p.forall(frame)&lt;br /&gt;
	local template = frame.args[1]&lt;br /&gt;
	local separator = frame.args.separator or &amp;#039;&amp;#039;&lt;br /&gt;
	local conjunction = frame.args.conjunction or separator&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	local func = function(value)&lt;br /&gt;
		return frame:expandTemplate{ title = template, args = {value} } -- или другой frame?&lt;br /&gt;
	end&lt;br /&gt;
	return forallImpl(args, separator, conjunction, func)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Берёт нумерованные аргументы объемлющего шаблона и склеивает их в единую строку&lt;br /&gt;
function p.join(frame)&lt;br /&gt;
	local separator = frame.args[1] or &amp;#039;&amp;#039;&lt;br /&gt;
	local conjunction = frame.args[2] or separator&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	local func = function(value)&lt;br /&gt;
		return value&lt;br /&gt;
	end&lt;br /&gt;
	return forallImpl(args, separator, conjunction, func)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Служебная функция: удаляет дубликаты из отсортированного массива с нумерованными индексами&lt;br /&gt;
local function deleteDuplicates(args)&lt;br /&gt;
	local res = {}&lt;br /&gt;
	for key, value in pairs(args) do&lt;br /&gt;
		if args[key+1] ~= value then&lt;br /&gt;
			table.insert(res, value)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Вызывает внутренний шаблон несколько раз, передавая в него блоки аргументов объемлющего шаблона&lt;br /&gt;
function p.npc(frame)&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	local templateFrame = frame:getParent()&lt;br /&gt;
	local template = frame.args[1]&lt;br /&gt;
	&lt;br /&gt;
	-- определение, блоки аргументов с какими номерами нужны:&lt;br /&gt;
	-- если в объемлющем шаблоне есть &amp;quot;параметр12&amp;quot; и в вызове модуля есть &amp;quot;параметр&amp;quot;, то вызывается 12-й блок&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	for key, _ in pairs(args) do&lt;br /&gt;
		local main, num = string.match(key, &amp;#039;^(.-)%s*(%d*)$&amp;#039;)&lt;br /&gt;
		num = tonumber(num)&lt;br /&gt;
		-- учитывать &amp;quot;параметр12&amp;quot;, только если задано &amp;quot;параметр&amp;quot;&lt;br /&gt;
		if num and frame.args[main] then&lt;br /&gt;
			table.insert(nums, num)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(nums)&lt;br /&gt;
	nums = deleteDuplicates(nums)&lt;br /&gt;
	&lt;br /&gt;
	-- проходить по нужным номерам блоков по возрастанию и однократно&lt;br /&gt;
	-- подставлять в шаблон:&lt;br /&gt;
	-- 1. общие аргументы данного модуля&lt;br /&gt;
	-- 2. аргументы объемлющего шаблона вида &amp;quot;параметр12&amp;quot; как &amp;quot;параметр&amp;quot; в 12-й блок&lt;br /&gt;
	local results = {}&lt;br /&gt;
	for _, blockNum in ipairs(nums) do&lt;br /&gt;
		-- общие аргументы модуля, которые передаются в каждый блок&lt;br /&gt;
		local blockArgs = mw.clone(frame.args)&lt;br /&gt;
		 -- metatable ломает expandTemplate&lt;br /&gt;
		setmetatable(blockArgs, nil)&lt;br /&gt;
		&lt;br /&gt;
		for key, value in pairs(args) do&lt;br /&gt;
			local main, num = string.match(key, &amp;#039;^(.-)%s*(%d*)$&amp;#039;)&lt;br /&gt;
			num = tonumber(num)&lt;br /&gt;
			-- передавать &amp;quot;параметр12&amp;quot; как &amp;quot;параметр&amp;quot; в 12-й блок, только если есть &amp;quot;параметр&amp;quot; в вызове модуля&lt;br /&gt;
			if blockNum == num and frame.args[main] then&lt;br /&gt;
				blockArgs[main] = value&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local blockText = templateFrame:expandTemplate{ title=template; args=blockArgs }&lt;br /&gt;
		table.insert(results, blockText)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
    return table.concat(results)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Действует аналогично forall по числовой переменной, изменяющейся (по умолчанию, от 1) до f.args[2].&lt;br /&gt;
function p.cycle(f)&lt;br /&gt;
    local tf,ac,op=f:getParent(), {}, f.args.output or &amp;#039;inline&amp;#039;;&lt;br /&gt;
    local sep=&amp;#039;&amp;#039;;&lt;br /&gt;
    if op == &amp;#039;newline&amp;#039; then&lt;br /&gt;
    	sep=&amp;#039;\n&amp;#039;;&lt;br /&gt;
    end&lt;br /&gt;
    for p,k in pairs(f.args) do&lt;br /&gt;
        if type(p)==&amp;#039;number&amp;#039; then&lt;br /&gt;
            if p&amp;gt;2 then ac[p-1]=k end&lt;br /&gt;
        else ac[p]=k&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local s,fh = f.args[2]:match(&amp;#039;^%s*(%-?%d+)%s*%.%.&amp;#039;) or 1,&lt;br /&gt;
        f.args[2]:match(&amp;#039;%.%.%s*(%S.*)%s*$&amp;#039;) or f.args[2] or &amp;#039;&amp;#039;;&lt;br /&gt;
    fh=tonumber(fh) or fh:match(&amp;#039;^%s*(.-)%s*$&amp;#039;);&lt;br /&gt;
	s=tonumber(s);&lt;br /&gt;
    local acr={};&lt;br /&gt;
    if not s then error(&amp;#039;Начало цикла «&amp;#039;..s..&amp;#039;» — не число&amp;#039;) end&lt;br /&gt;
    local function dc(order)&lt;br /&gt;
        local r=tf:expandTemplate{ title=f.args[1]; args={s,unpack(ac)} }&lt;br /&gt;
        if order == &amp;#039;desc&amp;#039; then&lt;br /&gt;
        	s=s-1;&lt;br /&gt;
        else&lt;br /&gt;
        	s=s+1;&lt;br /&gt;
    	end&lt;br /&gt;
        if r~=&amp;#039;&amp;#039; then table.insert(acr,r); return r end&lt;br /&gt;
    end&lt;br /&gt;
    if type(fh)==&amp;#039;number&amp;#039; then&lt;br /&gt;
    	if fh &amp;gt; s then&lt;br /&gt;
        	while s&amp;lt;=fh do dc(&amp;#039;asc&amp;#039;) end&lt;br /&gt;
    	else&lt;br /&gt;
        	while s&amp;gt;=fh do dc(&amp;#039;desc&amp;#039;) end&lt;br /&gt;
    	end&lt;br /&gt;
    elseif fh~=&amp;#039;&amp;#039; then&lt;br /&gt;
        while tf:expandTemplate{ title=fh; args={s,unpack(ac)} } do dc(&amp;#039;asc&amp;#039;) end&lt;br /&gt;
    else&lt;br /&gt;
        while dc(&amp;#039;asc&amp;#039;) do end&lt;br /&gt;
    end&lt;br /&gt;
    return table.concat(acr, sep)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Template_call_code&amp;diff=277</id>
		<title>Модуль:Template call code</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Template_call_code&amp;diff=277"/>
		<updated>2022-03-06T16:36:25Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
local ru = mw.language.new(&amp;#039;ru&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Используется для того, чтобы можно было удалять элементы из таблицы&lt;br /&gt;
local function copy(other)&lt;br /&gt;
	local res = {}&lt;br /&gt;
	for k, v in pairs(other) do&lt;br /&gt;
		res[k] = v&lt;br /&gt;
	end&lt;br /&gt;
	return res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeInvokeFunc(funcName)&lt;br /&gt;
	return function (frame)&lt;br /&gt;
		local args = copy(getArgs(frame, {&lt;br /&gt;
			trim = false,&lt;br /&gt;
			removeBlanks = false&lt;br /&gt;
		}))&lt;br /&gt;
		return p[funcName](args)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.withoutParams = makeInvokeFunc(&amp;#039;_withoutParams&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
function p._withoutParams(args)&lt;br /&gt;
	local name = args[1]&lt;br /&gt;
	table.remove(args, 1)&lt;br /&gt;
	&lt;br /&gt;
	-- Вещи типа «=» в первом параметре&lt;br /&gt;
	if not name then&lt;br /&gt;
		for k, v in pairs(args) do&lt;br /&gt;
			if not k:find(&amp;#039;^_&amp;#039;) then&lt;br /&gt;
				name = k .. &amp;#039;=&amp;#039; .. v&lt;br /&gt;
				args[k] = nil&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local flags = {}&lt;br /&gt;
	for i, v in ipairs(args) do&lt;br /&gt;
		if v == &amp;#039;nl&amp;#039; or v == &amp;#039;nolink&amp;#039; then&lt;br /&gt;
			flags.noLink = true&lt;br /&gt;
		elseif v == &amp;#039;s&amp;#039; then&lt;br /&gt;
			flags.subst = true&lt;br /&gt;
		elseif v == &amp;#039;п&amp;#039; then&lt;br /&gt;
			flags.podst = true&lt;br /&gt;
		elseif v == &amp;#039;g&amp;#039; then&lt;br /&gt;
			flags.global = true&lt;br /&gt;
		elseif v == &amp;#039;nav&amp;#039; then&lt;br /&gt;
			flags.nav = true&lt;br /&gt;
		elseif v == &amp;#039;noredir&amp;#039; then&lt;br /&gt;
			flags.noRedirect = true&lt;br /&gt;
		elseif v == &amp;#039;u&amp;#039; then&lt;br /&gt;
			flags.ucFirst = true&lt;br /&gt;
		elseif v == &amp;#039;b&amp;#039; then&lt;br /&gt;
			flags.black = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if name then&lt;br /&gt;
		local trimmedName = mw.text.trim(name)&lt;br /&gt;
		if ru:lc(mw.ustring.sub(trimmedName, 1, 6)) == &amp;#039;subst:&amp;#039; then&lt;br /&gt;
			flags.subst = true&lt;br /&gt;
			name = mw.ustring.sub(trimmedName, 7)&lt;br /&gt;
		end&lt;br /&gt;
		if ru:lc(mw.ustring.sub(trimmedName, 1, 6)) == &amp;#039;подст:&amp;#039; then&lt;br /&gt;
			flags.podst = true&lt;br /&gt;
			name = mw.ustring.sub(trimmedName, 7)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if args.text == &amp;#039;&amp;#039; then&lt;br /&gt;
		args.text = nil&lt;br /&gt;
	end&lt;br /&gt;
	if args.comment == &amp;#039;&amp;#039; then&lt;br /&gt;
		args.comment = nil&lt;br /&gt;
	end&lt;br /&gt;
	if args.lang == &amp;#039;&amp;#039; then&lt;br /&gt;
		args.lang = nil&lt;br /&gt;
	end&lt;br /&gt;
	if args.sister == &amp;#039;&amp;#039; then&lt;br /&gt;
		args.sister = nil&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local currentTitle = mw.title.getCurrentTitle()&lt;br /&gt;
	-- При опущенном первом параметре берём имя шаблона из названия страницы&lt;br /&gt;
	if name == &amp;#039;&amp;#039; or not name then&lt;br /&gt;
		local currentTitleRoot = currentTitle.rootText&lt;br /&gt;
		if not flags.ucFirst and&lt;br /&gt;
			((ru:uc(currentTitleRoot) ~= currentTitleRoot and&lt;br /&gt;
				-- Книга:Литературное наследство, TranslateDate&lt;br /&gt;
				not mw.ustring.match(currentTitleRoot, &amp;#039;^[А-Яа-яA-Za-z]+:?[А-ЯA-Z]&amp;#039;)&lt;br /&gt;
			) or&lt;br /&gt;
				#currentTitleRoot == 1&lt;br /&gt;
			)&lt;br /&gt;
		then&lt;br /&gt;
			name = ru:lcfirst(currentTitleRoot)&lt;br /&gt;
		else&lt;br /&gt;
			name = currentTitleRoot&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local global = flags.global or mw.ustring.sub(name, 1, 1) == &amp;#039;:&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	-- Начинаем собирать код&lt;br /&gt;
	local linkBody, titleObject, linkBegin, linkDivider, linkEnd&lt;br /&gt;
	&lt;br /&gt;
	local prefixes = {}&lt;br /&gt;
	if args.lang then&lt;br /&gt;
		table.insert(prefixes, args.lang)&lt;br /&gt;
	end&lt;br /&gt;
	if args.sister then&lt;br /&gt;
		table.insert(prefixes, args.sister)&lt;br /&gt;
	end&lt;br /&gt;
	linkBody = table.concat(prefixes, &amp;#039;:&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	if #linkBody ~= 0 then&lt;br /&gt;
		linkBody = &amp;#039;:&amp;#039; .. linkBody&lt;br /&gt;
	end&lt;br /&gt;
	if mw.ustring.sub(name, 1, 1) ~= &amp;#039;:&amp;#039; then&lt;br /&gt;
		linkBody = linkBody .. &amp;#039;:&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if not global then&lt;br /&gt;
		linkBody = linkBody .. &amp;#039;Template:&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	linkBody = linkBody .. name&lt;br /&gt;
	titleObject = mw.title.new(linkBody)&lt;br /&gt;
	&lt;br /&gt;
	local noLink = flags.noLink or currentTitle == titleObject&lt;br /&gt;
	local takeBracketsInLink = not noLink and&lt;br /&gt;
		mw.ustring.len(name) == 1 and&lt;br /&gt;
		not flags.black and&lt;br /&gt;
		not flags.subst and&lt;br /&gt;
		not flags.podst&lt;br /&gt;
	&lt;br /&gt;
	if not noLink then&lt;br /&gt;
		if not flags.noRedirect or (&lt;br /&gt;
			flags.noRedirect and&lt;br /&gt;
			not args.lang and&lt;br /&gt;
			not args.sister and&lt;br /&gt;
			not titleObject.exists&lt;br /&gt;
		) then&lt;br /&gt;
			linkBegin = &amp;#039;[[&amp;#039;&lt;br /&gt;
			linkEnd = &amp;#039;]]&amp;#039;&lt;br /&gt;
			linkDivider = &amp;#039;|&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			linkBegin = &amp;#039;[&amp;#039;&lt;br /&gt;
			linkEnd = &amp;#039;]&amp;#039;&lt;br /&gt;
			linkDivider = &amp;#039; &amp;#039;&lt;br /&gt;
			linkBody = titleObject:fullUrl(&amp;#039;redirect=no&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local text = &amp;#039;&amp;#039;&lt;br /&gt;
	if flags.nav and currentTitle == titleObject then&lt;br /&gt;
		text = text .. &amp;#039;\&amp;#039;\&amp;#039;\&amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if not flags.black then&lt;br /&gt;
		text = text .. &amp;#039;&amp;lt;span class=&amp;quot;wp-templatelink&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	text = text .. &amp;#039;{&amp;#039;&lt;br /&gt;
	if not takeBracketsInLink then&lt;br /&gt;
		text = text .. &amp;#039;{&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if flags.subst then&lt;br /&gt;
		text = text .. &amp;#039;subst:&amp;#039;&lt;br /&gt;
	elseif flags.podst then&lt;br /&gt;
		text = text .. &amp;#039;подст:&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if not flags.black then&lt;br /&gt;
		text = text .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	text = text .. &amp;#039;&amp;lt;span data-navboxnavigation-link=&amp;quot;0&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	local commentedLabel&lt;br /&gt;
	if args.comment then&lt;br /&gt;
		-- https://phabricator.wikimedia.org/T200704&lt;br /&gt;
		-- commentedLabel = mw.getCurrentFrame():expandTemplate({title = &amp;#039;comment&amp;#039;, args = {(args.text or name), args.comment}})&lt;br /&gt;
		commentedLabel = &amp;#039;&amp;lt;span class=&amp;quot;commentedText&amp;quot; title=&amp;quot;&amp;#039; .. args.comment .. &amp;#039;&amp;quot; style=&amp;quot;border-bottom: 1px dotted; cursor: help;&amp;quot;&amp;gt;&amp;#039; ..&lt;br /&gt;
			(args.text or name) ..&lt;br /&gt;
			&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local label = (commentedLabel or args.text or name)&lt;br /&gt;
	if not noLink then&lt;br /&gt;
		if flags.noRedirect then&lt;br /&gt;
			text = text .. &amp;#039;&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		text = text .. linkBegin .. linkBody .. linkDivider&lt;br /&gt;
		if not noLink and takeBracketsInLink then&lt;br /&gt;
			text = text .. &amp;#039;&amp;lt;span class=&amp;quot;wp-templatelink&amp;quot;&amp;gt;{&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		text = text .. label&lt;br /&gt;
		if not noLink and takeBracketsInLink then&lt;br /&gt;
			text = text .. &amp;#039;&amp;lt;span class=&amp;quot;wp-templatelink&amp;quot;&amp;gt;}&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		text = text .. linkEnd&lt;br /&gt;
		if flags.noRedirect then&lt;br /&gt;
			text = text .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		text = text .. label&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	text = text .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	if not flags.black then&lt;br /&gt;
		text = text .. &amp;#039;&amp;lt;span class=&amp;quot;wp-templatelink&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	text = text .. &amp;#039;}&amp;#039;&lt;br /&gt;
	if not takeBracketsInLink then&lt;br /&gt;
		text = text .. &amp;#039;}&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if not flags.black then&lt;br /&gt;
		text = text .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if flags.nav and currentTitle == titleObject then&lt;br /&gt;
		text = text .. &amp;#039;\&amp;#039;\&amp;#039;\&amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function addParams(args, params)&lt;br /&gt;
	local text, equals_pos, param, value = &amp;#039;&amp;#039;, 0, &amp;#039;&amp;#039;, &amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	function addPipe()&lt;br /&gt;
		if params.spaced then&lt;br /&gt;
			text = text .. &amp;#039; &amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		text = text .. &amp;#039;&amp;lt;span&amp;#039;&lt;br /&gt;
		if not params.black then&lt;br /&gt;
			text = text .. &amp;#039; class=&amp;quot;wp-templatelink&amp;quot;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		if not params.spaced then&lt;br /&gt;
			text = text .. &amp;#039; style=&amp;quot;margin:0 2px;&amp;quot;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		text = text .. &amp;#039;&amp;gt;&amp;amp;#124;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		if type(k) == &amp;#039;number&amp;#039; then  -- Неименованные параметры&lt;br /&gt;
			equals_pos = v:find(&amp;#039;=&amp;#039;)&lt;br /&gt;
			if equals_pos and v:find(&amp;#039;{{=}}&amp;#039;) == equals_pos - 2 then&lt;br /&gt;
				equals_pos = nil&lt;br /&gt;
			end&lt;br /&gt;
			if equals_pos then  -- Содержащие «=» преобразуем в именованные&lt;br /&gt;
				param = v:sub(1, equals_pos - 1)&lt;br /&gt;
				value = v:sub(equals_pos + 1)&lt;br /&gt;
				addPipe()&lt;br /&gt;
				text = text .. param .. &amp;#039;=&amp;#039; .. value&lt;br /&gt;
			else  -- Истинно неименованные&lt;br /&gt;
				addPipe()&lt;br /&gt;
				text = text .. v&lt;br /&gt;
			end&lt;br /&gt;
		elseif not k:find(&amp;#039;^_&amp;#039;) then  -- Именованные параметры, исключая модификаторы внешнего вида&lt;br /&gt;
			addPipe()&lt;br /&gt;
			text = text .. k .. &amp;#039;=&amp;#039; .. v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.withParams = makeInvokeFunc(&amp;#039;_withParams&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
function p._withParams(args)&lt;br /&gt;
	local name = args[1]&lt;br /&gt;
	table.remove(args, 1)&lt;br /&gt;
	&lt;br /&gt;
	-- Вещи типа «=» в первом параметре&lt;br /&gt;
	if not name then&lt;br /&gt;
		for k, v in pairs(args) do&lt;br /&gt;
			if not k:find(&amp;#039;^_&amp;#039;) then&lt;br /&gt;
				name = k .. &amp;#039;=&amp;#039; .. v&lt;br /&gt;
				args[k] = nil&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local optpText&lt;br /&gt;
	if name then&lt;br /&gt;
		local spanOffset = mw.ustring.find(name, &amp;#039;&amp;lt;span&amp;#039;)  -- След использования шаблона optp&lt;br /&gt;
		if spanOffset then&lt;br /&gt;
			optpText = mw.ustring.sub(name, spanOffset)&lt;br /&gt;
			name = mw.ustring.sub(name, 1, spanOffset - 1)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	local nobr = yesno(args._nobr, false)&lt;br /&gt;
	local tag = args._tag or &amp;#039;span&amp;#039;&lt;br /&gt;
	local style = args._style&lt;br /&gt;
	local spaced = yesno(args._spaced, false)&lt;br /&gt;
	local subst = yesno(args._s, false)&lt;br /&gt;
	local podst = yesno(args[&amp;#039;_п&amp;#039;], false)&lt;br /&gt;
	local global = yesno(args._g, false) or name and mw.ustring.sub(name, 1, 1) == &amp;#039;:&amp;#039;&lt;br /&gt;
	local lang = args._lang&lt;br /&gt;
	local sister = args._sister&lt;br /&gt;
	local nav = yesno(args._nav, false)&lt;br /&gt;
	local ucFirst = yesno(args._u, false)&lt;br /&gt;
	local black = yesno(args._b, false) or tag ~= &amp;#039;span&amp;#039;&lt;br /&gt;
	local noLink = yesno(args._nolink or args._nl, false) or not yesno(args._link, false)&lt;br /&gt;
	local textInPlaceOfName = args._text&lt;br /&gt;
	local comment = args._comment&lt;br /&gt;
	local noRedirect = yesno(args._noredir, false)&lt;br /&gt;
	local prefix = args._prefix&lt;br /&gt;
	local postfix = args._postfix&lt;br /&gt;
	&lt;br /&gt;
	if textInPlaceOfName == &amp;#039;&amp;#039; then&lt;br /&gt;
		textInPlaceOfName = nil&lt;br /&gt;
	end&lt;br /&gt;
	if comment == &amp;#039;&amp;#039; then&lt;br /&gt;
		comment = nil&lt;br /&gt;
	end&lt;br /&gt;
	if lang == &amp;#039;&amp;#039; then&lt;br /&gt;
		lang = nil&lt;br /&gt;
	end&lt;br /&gt;
	if sister == &amp;#039;&amp;#039; then&lt;br /&gt;
		sister = nil&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if name then&lt;br /&gt;
		local trimmedName = mw.text.trim(name)&lt;br /&gt;
		if ru:lc(mw.ustring.sub(trimmedName, 1, 6)) == &amp;#039;subst:&amp;#039; then&lt;br /&gt;
			subst = true&lt;br /&gt;
			name = mw.ustring.sub(trimmedName, 7)&lt;br /&gt;
		end&lt;br /&gt;
		if ru:lc(mw.ustring.sub(trimmedName, 1, 6)) == &amp;#039;подст:&amp;#039; then&lt;br /&gt;
			podst = true&lt;br /&gt;
			name = mw.ustring.sub(trimmedName, 7)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local currentTitle = mw.title.getCurrentTitle()&lt;br /&gt;
	-- При опущенном первом параметре берём имя шаблона из названия страницы&lt;br /&gt;
	if name == &amp;#039;&amp;#039; or not name then&lt;br /&gt;
		local currentTitleRoot = currentTitle.rootText&lt;br /&gt;
		if not ucFirst and&lt;br /&gt;
			((ru:uc(currentTitleRoot) ~= currentTitleRoot and&lt;br /&gt;
				-- Книга:Литературное наследство, TranslateDate&lt;br /&gt;
				not mw.ustring.match(currentTitleRoot, &amp;#039;^[А-Яа-яA-Za-z]+:?[А-ЯA-Z]&amp;#039;)&lt;br /&gt;
			) or&lt;br /&gt;
				#currentTitleRoot == 1&lt;br /&gt;
			)&lt;br /&gt;
		then&lt;br /&gt;
			name = ru:lcfirst(currentTitleRoot)&lt;br /&gt;
		else&lt;br /&gt;
			name = currentTitleRoot&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Начинаем собирать код&lt;br /&gt;
	local linkBody, titleObject, linkBegin, linkDivider, linkEnd&lt;br /&gt;
	&lt;br /&gt;
	local prefixes = {}&lt;br /&gt;
	if lang then&lt;br /&gt;
		table.insert(prefixes, lang)&lt;br /&gt;
	end&lt;br /&gt;
	if sister then&lt;br /&gt;
		table.insert(prefixes, sister)&lt;br /&gt;
	end&lt;br /&gt;
	linkBody = table.concat(prefixes, &amp;#039;:&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	if #linkBody ~= 0 then&lt;br /&gt;
		linkBody = &amp;#039;:&amp;#039; .. linkBody&lt;br /&gt;
	end&lt;br /&gt;
	if mw.ustring.sub(name, 1, 1) ~= &amp;#039;:&amp;#039; then&lt;br /&gt;
		linkBody = linkBody .. &amp;#039;:&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if not global then&lt;br /&gt;
		linkBody = linkBody .. &amp;#039;Template:&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	linkBody = linkBody .. name&lt;br /&gt;
	titleObject = mw.title.new(linkBody)&lt;br /&gt;
	&lt;br /&gt;
	local noLink = noLink or currentTitle == titleObject&lt;br /&gt;
	local takeBracketsInLink = not noLink and&lt;br /&gt;
		mw.ustring.len(name) == 1 and&lt;br /&gt;
		not black and&lt;br /&gt;
		not subst and&lt;br /&gt;
		not podst&lt;br /&gt;
	&lt;br /&gt;
	if not noLink then&lt;br /&gt;
		if not noRedirect or (&lt;br /&gt;
			noRedirect and&lt;br /&gt;
			not lang and&lt;br /&gt;
			not sister and&lt;br /&gt;
			not titleObject.exists&lt;br /&gt;
		) then&lt;br /&gt;
			linkBegin = &amp;#039;[[&amp;#039;&lt;br /&gt;
			linkEnd = &amp;#039;]]&amp;#039;&lt;br /&gt;
			linkDivider = &amp;#039;|&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			linkBegin = &amp;#039;[&amp;#039;&lt;br /&gt;
			linkEnd = &amp;#039;]&amp;#039;&lt;br /&gt;
			linkDivider = &amp;#039; &amp;#039;&lt;br /&gt;
			linkBody = titleObject:fullUrl(&amp;#039;redirect=no&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local text = &amp;#039;&amp;#039;&lt;br /&gt;
	if tag then&lt;br /&gt;
		text = text .. &amp;#039;&amp;lt;&amp;#039; .. tag .. &amp;#039; class=&amp;quot;templateCallCode&amp;#039;&lt;br /&gt;
		if nobr then&lt;br /&gt;
			text = text .. &amp;#039; nowrap&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		text = text .. &amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
		if style then&lt;br /&gt;
			text = text .. &amp;#039; style=&amp;quot;&amp;#039; .. style .. &amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		text = text .. &amp;#039;&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if prefix then&lt;br /&gt;
		text = text .. prefix&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not black then&lt;br /&gt;
		text = text .. &amp;#039;&amp;lt;span class=&amp;quot;wp-templatelink&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	text = text .. &amp;#039;{{&amp;#039;&lt;br /&gt;
	if subst then&lt;br /&gt;
		text = text .. &amp;#039;subst:&amp;#039;&lt;br /&gt;
	elseif podst then&lt;br /&gt;
		text = text .. &amp;#039;подст:&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if not black then&lt;br /&gt;
		text = text .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if nav and currentTitle == titleObject then&lt;br /&gt;
		text = text .. &amp;#039;\&amp;#039;\&amp;#039;\&amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local commentedLabel&lt;br /&gt;
	if comment then&lt;br /&gt;
		-- https://phabricator.wikimedia.org/T200704&lt;br /&gt;
		-- commentedLabel = mw.getCurrentFrame():expandTemplate({title = &amp;#039;comment&amp;#039;, args = {(text or name), comment}})&lt;br /&gt;
		commentedLabel = &amp;#039;&amp;lt;span class=&amp;quot;commentedText&amp;quot; title=&amp;quot;&amp;#039; .. comment .. &amp;#039;&amp;quot; style=&amp;quot;border-bottom: 1px dotted; cursor: help;&amp;quot;&amp;gt;&amp;#039; ..&lt;br /&gt;
			(textInPlaceOfName or name) ..&lt;br /&gt;
			&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local label = (commentedLabel or textInPlaceOfName or name)&lt;br /&gt;
	if not noLink then&lt;br /&gt;
		if noRedirect then&lt;br /&gt;
			text = text .. &amp;#039;&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		text = text .. linkBegin .. linkBody .. linkDivider .. label .. linkEnd&lt;br /&gt;
		if noRedirect then&lt;br /&gt;
			text = text .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		text = text .. label&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if nav and currentTitle == titleObject then&lt;br /&gt;
		text = text .. &amp;#039;\&amp;#039;\&amp;#039;\&amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if optpText then&lt;br /&gt;
		text = text .. optpText&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	text = text .. addParams(args, {&lt;br /&gt;
		spaced = spaced,&lt;br /&gt;
		black = black,&lt;br /&gt;
	})&lt;br /&gt;
	&lt;br /&gt;
	if spaced then&lt;br /&gt;
		text = text .. &amp;#039; &amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not black then&lt;br /&gt;
		text = text .. &amp;#039;&amp;lt;span class=&amp;quot;wp-templatelink&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	text = text .. &amp;#039;}}&amp;#039;&lt;br /&gt;
	if not black then&lt;br /&gt;
		text = text .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if postfix then&lt;br /&gt;
		text = text .. postfix&lt;br /&gt;
	end&lt;br /&gt;
	if tag then&lt;br /&gt;
		text = text .. &amp;#039;&amp;lt;/&amp;#039; .. tag .. &amp;#039;&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.onlyParams = makeInvokeFunc(&amp;#039;_onlyParams&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
function p._onlyParams(args)&lt;br /&gt;
	local span = mw.html.create(&amp;#039;span&amp;#039;)&lt;br /&gt;
	span:css( &amp;#039;color&amp;#039;, mw.getCurrentFrame():expandTemplate({ title = &amp;#039;optp/color&amp;#039; }) )&lt;br /&gt;
	&lt;br /&gt;
	local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	span:wikitext(addParams(args, {&lt;br /&gt;
		spaced = yesno(args._spaced, false),&lt;br /&gt;
		black = true,&lt;br /&gt;
	}))&lt;br /&gt;
&lt;br /&gt;
	return tostring(span)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableTools&amp;diff=275</id>
		<title>Модуль:TableTools</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableTools&amp;diff=275"/>
		<updated>2022-03-06T16:36:25Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
--                               TableTools                                       --&lt;br /&gt;
--                                                                                --&lt;br /&gt;
-- This module includes a number of functions for dealing with Lua tables.        --&lt;br /&gt;
-- It is a meta-module, meant to be called from other Lua modules, and should     --&lt;br /&gt;
-- not be called directly from #invoke.                                           --&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
local libraryUtil = require(&amp;#039;libraryUtil&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Define often-used variables and functions.&lt;br /&gt;
local floor = math.floor&lt;br /&gt;
local infinity = math.huge&lt;br /&gt;
local checkType = libraryUtil.checkType&lt;br /&gt;
local checkTypeMulti = libraryUtil.checkTypeMulti&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- isPositiveInteger&lt;br /&gt;
--&lt;br /&gt;
-- This function returns true if the given value is a positive integer, and false&lt;br /&gt;
-- if not. Although it doesn&amp;#039;t operate on tables, it is included here as it is&lt;br /&gt;
-- useful for determining whether a given table key is in the array part or the&lt;br /&gt;
-- hash part of a table.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
function p.isPositiveInteger(v)&lt;br /&gt;
	if type(v) == &amp;#039;number&amp;#039; and v &amp;gt;= 1 and floor(v) == v and v &amp;lt; infinity then&lt;br /&gt;
		return true&lt;br /&gt;
	else&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- isNan&lt;br /&gt;
--&lt;br /&gt;
-- This function returns true if the given number is a NaN value, and false&lt;br /&gt;
-- if not. Although it doesn&amp;#039;t operate on tables, it is included here as it is&lt;br /&gt;
-- useful for determining whether a value can be a valid table key. Lua will&lt;br /&gt;
-- generate an error if a NaN is used as a table key.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
function p.isNan(v)&lt;br /&gt;
	if type(v) == &amp;#039;number&amp;#039; and tostring(v) == &amp;#039;-nan&amp;#039; then&lt;br /&gt;
		return true&lt;br /&gt;
	else&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- shallowClone&lt;br /&gt;
--&lt;br /&gt;
-- This returns a clone of a table. The value returned is a new table, but all&lt;br /&gt;
-- subtables and functions are shared. Metamethods are respected, but the returned&lt;br /&gt;
-- table will have no metatable of its own.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
function p.shallowClone(t)&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	for k, v in pairs(t) do&lt;br /&gt;
		ret[k] = v&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- removeDuplicates&lt;br /&gt;
--&lt;br /&gt;
-- This removes duplicate values from an array. Non-positive-integer keys are&lt;br /&gt;
-- ignored. The earliest value is kept, and all subsequent duplicate values are&lt;br /&gt;
-- removed, but otherwise the array order is unchanged.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
function p.removeDuplicates(t)&lt;br /&gt;
	checkType(&amp;#039;removeDuplicates&amp;#039;, 1, t, &amp;#039;table&amp;#039;)&lt;br /&gt;
	local isNan = p.isNan&lt;br /&gt;
	local ret, exists = {}, {}&lt;br /&gt;
	for i, v in ipairs(t) do&lt;br /&gt;
		if isNan(v) then&lt;br /&gt;
			-- NaNs can&amp;#039;t be table keys, and they are also unique, so we don&amp;#039;t need to check existence.&lt;br /&gt;
			ret[#ret + 1] = v&lt;br /&gt;
		else&lt;br /&gt;
			if not exists[v] then&lt;br /&gt;
				ret[#ret + 1] = v&lt;br /&gt;
				exists[v] = true&lt;br /&gt;
			end&lt;br /&gt;
		end	&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end			&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- numKeys&lt;br /&gt;
--&lt;br /&gt;
-- This takes a table and returns an array containing the numbers of any numerical&lt;br /&gt;
-- keys that have non-nil values, sorted in numerical order.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
function p.numKeys(t)&lt;br /&gt;
	checkType(&amp;#039;numKeys&amp;#039;, 1, t, &amp;#039;table&amp;#039;)&lt;br /&gt;
	local isPositiveInteger = p.isPositiveInteger&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	for k, v in pairs(t) do&lt;br /&gt;
		if isPositiveInteger(k) then&lt;br /&gt;
			nums[#nums + 1] = k&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(nums)&lt;br /&gt;
	return nums&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- affixNums&lt;br /&gt;
--&lt;br /&gt;
-- This takes a table and returns an array containing the numbers of keys with the&lt;br /&gt;
-- specified prefix and suffix. For example, for the table&lt;br /&gt;
-- {a1 = &amp;#039;foo&amp;#039;, a3 = &amp;#039;bar&amp;#039;, a6 = &amp;#039;baz&amp;#039;} and the prefix &amp;quot;a&amp;quot;, affixNums will&lt;br /&gt;
-- return {1, 3, 6}.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
function p.affixNums(t, prefix, suffix)&lt;br /&gt;
	checkType(&amp;#039;affixNums&amp;#039;, 1, t, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;affixNums&amp;#039;, 2, prefix, &amp;#039;string&amp;#039;, true)&lt;br /&gt;
	checkType(&amp;#039;affixNums&amp;#039;, 3, suffix, &amp;#039;string&amp;#039;, true)&lt;br /&gt;
&lt;br /&gt;
	local function cleanPattern(s)&lt;br /&gt;
		-- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally.&lt;br /&gt;
		s = s:gsub(&amp;#039;([%(%)%%%.%[%]%*%+%-%?%^%$])&amp;#039;, &amp;#039;%%%1&amp;#039;)&lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	prefix = prefix or &amp;#039;&amp;#039;&lt;br /&gt;
	suffix = suffix or &amp;#039;&amp;#039;&lt;br /&gt;
	prefix = cleanPattern(prefix)&lt;br /&gt;
	suffix = cleanPattern(suffix)&lt;br /&gt;
	local pattern = &amp;#039;^&amp;#039; .. prefix .. &amp;#039;([1-9]%d*)&amp;#039; .. suffix .. &amp;#039;$&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	for k, v in pairs(t) do&lt;br /&gt;
		if type(k) == &amp;#039;string&amp;#039; then			&lt;br /&gt;
			local num = mw.ustring.match(k, pattern)&lt;br /&gt;
			if num then&lt;br /&gt;
				nums[#nums + 1] = tonumber(num)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(nums)&lt;br /&gt;
	return nums&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- numData&lt;br /&gt;
--&lt;br /&gt;
-- Given a table with keys like (&amp;quot;foo1&amp;quot;, &amp;quot;bar1&amp;quot;, &amp;quot;foo2&amp;quot;, &amp;quot;baz2&amp;quot;), returns a table&lt;br /&gt;
-- of subtables in the format &lt;br /&gt;
-- { [1] = {foo = &amp;#039;text&amp;#039;, bar = &amp;#039;text&amp;#039;}, [2] = {foo = &amp;#039;text&amp;#039;, baz = &amp;#039;text&amp;#039;} }&lt;br /&gt;
-- Keys that don&amp;#039;t end with an integer are stored in a subtable named &amp;quot;other&amp;quot;.&lt;br /&gt;
-- The compress option compresses the table so that it can be iterated over with&lt;br /&gt;
-- ipairs.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
function p.numData(t, compress)&lt;br /&gt;
	checkType(&amp;#039;numData&amp;#039;, 1, t, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;numData&amp;#039;, 2, compress, &amp;#039;boolean&amp;#039;, true)&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	for k, v in pairs(t) do&lt;br /&gt;
		local prefix, num = mw.ustring.match(tostring(k), &amp;#039;^([^0-9]*)([1-9][0-9]*)$&amp;#039;)&lt;br /&gt;
		if num then&lt;br /&gt;
			num = tonumber(num)&lt;br /&gt;
			local subtable = ret[num] or {}&lt;br /&gt;
			if prefix == &amp;#039;&amp;#039; then&lt;br /&gt;
				-- Positional parameters match the blank string; put them at the start of the subtable instead.&lt;br /&gt;
				prefix = 1&lt;br /&gt;
			end&lt;br /&gt;
			subtable[prefix] = v&lt;br /&gt;
			ret[num] = subtable&lt;br /&gt;
		else&lt;br /&gt;
			local subtable = ret.other or {}&lt;br /&gt;
			subtable[k] = v&lt;br /&gt;
			ret.other = subtable&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if compress then&lt;br /&gt;
		local other = ret.other&lt;br /&gt;
		ret = p.compressSparseArray(ret)&lt;br /&gt;
		ret.other = other&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- compressSparseArray&lt;br /&gt;
--&lt;br /&gt;
-- This takes an array with one or more nil values, and removes the nil values&lt;br /&gt;
-- while preserving the order, so that the array can be safely traversed with&lt;br /&gt;
-- ipairs.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
function p.compressSparseArray(t)&lt;br /&gt;
	checkType(&amp;#039;compressSparseArray&amp;#039;, 1, t, &amp;#039;table&amp;#039;)&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	local nums = p.numKeys(t)&lt;br /&gt;
	for _, num in ipairs(nums) do&lt;br /&gt;
		ret[#ret + 1] = t[num]&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- sparseIpairs&lt;br /&gt;
--&lt;br /&gt;
-- This is an iterator for sparse arrays. It can be used like ipairs, but can&lt;br /&gt;
-- handle nil values.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
function p.sparseIpairs(t)&lt;br /&gt;
	checkType(&amp;#039;sparseIpairs&amp;#039;, 1, t, &amp;#039;table&amp;#039;)&lt;br /&gt;
	local nums = p.numKeys(t)&lt;br /&gt;
	local i = 0&lt;br /&gt;
	local lim = #nums&lt;br /&gt;
	return function ()&lt;br /&gt;
		i = i + 1&lt;br /&gt;
		if i &amp;lt;= lim then&lt;br /&gt;
			local key = nums[i]&lt;br /&gt;
			return key, t[key]&lt;br /&gt;
		else&lt;br /&gt;
			return nil, nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- size&lt;br /&gt;
--&lt;br /&gt;
-- This returns the size of a key/value pair table. It will also work on arrays,&lt;br /&gt;
-- but for arrays it is more efficient to use the # operator.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
function p.size(t)&lt;br /&gt;
	checkType(&amp;#039;size&amp;#039;, 1, t, &amp;#039;table&amp;#039;)&lt;br /&gt;
	local i = 0&lt;br /&gt;
	for k in pairs(t) do&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
	return i&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function defaultKeySort(item1, item2)&lt;br /&gt;
	-- &amp;quot;number&amp;quot; &amp;lt; &amp;quot;string&amp;quot;, so numbers will be sorted before strings.&lt;br /&gt;
	local type1, type2 = type(item1), type(item2)&lt;br /&gt;
	if type1 ~= type2 then&lt;br /&gt;
		return type1 &amp;lt; type2&lt;br /&gt;
	else -- This will fail with table, boolean, function.&lt;br /&gt;
		return item1 &amp;lt; item2&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Returns a list of the keys in a table, sorted using either a default&lt;br /&gt;
	comparison function or a custom keySort function.&lt;br /&gt;
]]&lt;br /&gt;
function p.keysToList(t, keySort, checked)&lt;br /&gt;
	if not checked then&lt;br /&gt;
		checkType(&amp;#039;keysToList&amp;#039;, 1, t, &amp;#039;table&amp;#039;)&lt;br /&gt;
		checkTypeMulti(&amp;#039;keysToList&amp;#039;, 2, keySort, { &amp;#039;function&amp;#039;, &amp;#039;boolean&amp;#039;, &amp;#039;nil&amp;#039; })&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local list = {}&lt;br /&gt;
	local index = 1&lt;br /&gt;
	for key, value in pairs(t) do&lt;br /&gt;
		list[index] = key&lt;br /&gt;
		index = index + 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if keySort ~= false then&lt;br /&gt;
		keySort = type(keySort) == &amp;#039;function&amp;#039; and keySort or defaultKeySort&lt;br /&gt;
		&lt;br /&gt;
		table.sort(list, keySort)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return list&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Iterates through a table, with the keys sorted using the keysToList function.&lt;br /&gt;
	If there are only numerical keys, sparseIpairs is probably more efficient.&lt;br /&gt;
]]&lt;br /&gt;
function p.sortedPairs(t, keySort)&lt;br /&gt;
	checkType(&amp;#039;sortedPairs&amp;#039;, 1, t, &amp;#039;table&amp;#039;)&lt;br /&gt;
	checkType(&amp;#039;sortedPairs&amp;#039;, 2, keySort, &amp;#039;function&amp;#039;, true)&lt;br /&gt;
	&lt;br /&gt;
	local list = p.keysToList(t, keySort, true)&lt;br /&gt;
	&lt;br /&gt;
	local i = 0&lt;br /&gt;
	return function()&lt;br /&gt;
		i = i + 1&lt;br /&gt;
		local key = list[i]&lt;br /&gt;
		if key ~= nil then&lt;br /&gt;
			return key, t[key]&lt;br /&gt;
		else&lt;br /&gt;
			return nil, nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Returns true if all keys in the table are consecutive integers starting at 1.&lt;br /&gt;
--]]&lt;br /&gt;
function p.isArray(t)&lt;br /&gt;
	checkType(&amp;quot;isArray&amp;quot;, 1, t, &amp;quot;table&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	local i = 0&lt;br /&gt;
	for k, v in pairs(t) do&lt;br /&gt;
		i = i + 1&lt;br /&gt;
		if t[i] == nil then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- { &amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot; } -&amp;gt; { a = 1, b = 2, c = 3 }&lt;br /&gt;
function p.invert(array)&lt;br /&gt;
	checkType(&amp;quot;invert&amp;quot;, 1, array, &amp;quot;table&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	local map = {}&lt;br /&gt;
	for i, v in ipairs(array) do&lt;br /&gt;
		map[v] = i&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return map&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	{ &amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot; } -&amp;gt; { [&amp;quot;a&amp;quot;] = true, [&amp;quot;b&amp;quot;] = true, [&amp;quot;c&amp;quot;] = true }&lt;br /&gt;
--]]&lt;br /&gt;
function p.listToSet(t)&lt;br /&gt;
	checkType(&amp;quot;listToSet&amp;quot;, 1, t, &amp;quot;table&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	local set = {}&lt;br /&gt;
	for _, item in ipairs(t) do&lt;br /&gt;
		set[item] = true&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return set&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Recursive deep copy function.&lt;br /&gt;
	Preserves identities of subtables.&lt;br /&gt;
	&lt;br /&gt;
]]&lt;br /&gt;
local function _deepCopy(orig, includeMetatable, already_seen)&lt;br /&gt;
	-- Stores copies of tables indexed by the original table.&lt;br /&gt;
	already_seen = already_seen or {}&lt;br /&gt;
	&lt;br /&gt;
	local copy = already_seen[orig]&lt;br /&gt;
	if copy ~= nil then&lt;br /&gt;
		return copy&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if type(orig) == &amp;#039;table&amp;#039; then&lt;br /&gt;
		copy = {}&lt;br /&gt;
		for orig_key, orig_value in pairs(orig) do&lt;br /&gt;
			copy[deepcopy(orig_key, includeMetatable, already_seen)] = deepcopy(orig_value, includeMetatable, already_seen)&lt;br /&gt;
		end&lt;br /&gt;
		already_seen[orig] = copy&lt;br /&gt;
		&lt;br /&gt;
		if includeMetatable then&lt;br /&gt;
			local mt = getmetatable(orig)&lt;br /&gt;
			if mt ~= nil then&lt;br /&gt;
				local mt_copy = deepcopy(mt, includeMetatable, already_seen)&lt;br /&gt;
				setmetatable(copy, mt_copy)&lt;br /&gt;
				already_seen[mt] = mt_copy&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else -- number, string, boolean, etc&lt;br /&gt;
		copy = orig&lt;br /&gt;
	end&lt;br /&gt;
	return copy&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.deepCopy(orig, noMetatable, already_seen)&lt;br /&gt;
	checkType(&amp;quot;deepCopy&amp;quot;, 3, already_seen, &amp;quot;table&amp;quot;, true)&lt;br /&gt;
	&lt;br /&gt;
	return _deepCopy(orig, not noMetatable, already_seen)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Concatenates all values in the table that are indexed by a number, in order.&lt;br /&gt;
	sparseConcat{ a, nil, c, d }  =&amp;gt;  &amp;quot;acd&amp;quot;&lt;br /&gt;
	sparseConcat{ nil, b, c, d }  =&amp;gt;  &amp;quot;bcd&amp;quot;&lt;br /&gt;
]]&lt;br /&gt;
function p.sparseConcat(t, sep, i, j)&lt;br /&gt;
	local list = {}&lt;br /&gt;
	&lt;br /&gt;
	local list_i = 0&lt;br /&gt;
	for _, v in p.sparseIpairs(t) do&lt;br /&gt;
		list_i = list_i + 1&lt;br /&gt;
		list[list_i] = v&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(list, sep, i, j)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- This returns the length of a table, or the first integer key n counting from&lt;br /&gt;
-- 1 such that t[n + 1] is nil. It is similar to the operator #, but may return&lt;br /&gt;
-- a different value when there are gaps in the array portion of the table.&lt;br /&gt;
-- Intended to be used on data loaded with mw.loadData. For other tables, use #.&lt;br /&gt;
-- Note: #frame.args in frame object always be set to 0, regardless of &lt;br /&gt;
-- the number of unnamed template parameters, so use this function for&lt;br /&gt;
-- frame.args.&lt;br /&gt;
--]]&lt;br /&gt;
function p.length(t)&lt;br /&gt;
	local i = 1&lt;br /&gt;
	while t[i] ~= nil do&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
	return i - 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.inArray(arr, valueToFind)&lt;br /&gt;
	checkType(&amp;quot;inArray&amp;quot;, 1, arr, &amp;quot;table&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	-- if valueToFind is nil, error?&lt;br /&gt;
	&lt;br /&gt;
	for _, v in ipairs(arr) do&lt;br /&gt;
		if v == valueToFind then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:String&amp;diff=273</id>
		<title>Модуль:String</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:String&amp;diff=273"/>
		<updated>2022-03-06T16:36:25Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[  &lt;br /&gt;
&lt;br /&gt;
This module is intended to provide access to basic string functions.&lt;br /&gt;
&lt;br /&gt;
Most of the functions provided here can be invoked with named parameters, &lt;br /&gt;
unnamed parameters, or a mixture.  If named parameters are used, Mediawiki will &lt;br /&gt;
automatically remove any leading or trailing whitespace from the parameter.  &lt;br /&gt;
Depending on the intended use, it may be advantageous to either preserve or&lt;br /&gt;
remove such whitespace.&lt;br /&gt;
&lt;br /&gt;
Global options&lt;br /&gt;
    ignore_errors: If set to &amp;#039;true&amp;#039; or 1, any error condition will result in &lt;br /&gt;
        an empty string being returned rather than an error message.  &lt;br /&gt;
        &lt;br /&gt;
    error_category: If an error occurs, specifies the name of a category to &lt;br /&gt;
        include with the error message.  The default category is  &lt;br /&gt;
        [Category:Errors reported by Module String].&lt;br /&gt;
        &lt;br /&gt;
    no_category: If set to &amp;#039;true&amp;#039; or 1, no category will be added if an error&lt;br /&gt;
        is generated.&lt;br /&gt;
        &lt;br /&gt;
Unit tests for this module are available at Module:String/tests.&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local str = {}&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
subcount&lt;br /&gt;
&lt;br /&gt;
This function returns the count of substring in source string.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|subcount|source_string|substring|plain_flag}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|subcount|s=source_string|pattern=substring|plain=plain_flag}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    s: The string to search&lt;br /&gt;
    pattern: The pattern or string to find within the string&lt;br /&gt;
    plain: A flag indicating that the substring should be understood as plain&lt;br /&gt;
        text. Defaults to true.&lt;br /&gt;
&lt;br /&gt;
If invoked using named parameters, Mediawiki will automatically remove any leading or&lt;br /&gt;
trailing whitespace from the target string.  &lt;br /&gt;
]]&lt;br /&gt;
function str.subcount( frame )&lt;br /&gt;
    local new_args = str._getParameters( frame.args, {&amp;#039;s&amp;#039;, &amp;#039;pattern&amp;#039;, &amp;#039;plain&amp;#039;} );&lt;br /&gt;
    local s = new_args[&amp;#039;s&amp;#039;] or &amp;#039;&amp;#039;;&lt;br /&gt;
    local plain_flag = str._getBoolean( new_args[&amp;#039;plain&amp;#039;] or true );&lt;br /&gt;
    local pattern = new_args[&amp;#039;pattern&amp;#039;] or &amp;#039;&amp;#039;;&lt;br /&gt;
    if s == &amp;#039;&amp;#039; or pattern == &amp;#039;&amp;#039; then&lt;br /&gt;
    	return 0;&lt;br /&gt;
    end&lt;br /&gt;
    	&lt;br /&gt;
    if plain_flag then&lt;br /&gt;
        pattern = str._escapePattern( pattern );&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local _, count = mw.ustring.gsub(s, pattern, &amp;quot;&amp;quot;)&lt;br /&gt;
    return count;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
len&lt;br /&gt;
&lt;br /&gt;
This function returns the length of the target string.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|len|target_string|}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|len|s=target_string}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    s: The string whose length to report&lt;br /&gt;
&lt;br /&gt;
If invoked using named parameters, Mediawiki will automatically remove any leading or&lt;br /&gt;
trailing whitespace from the target string.  &lt;br /&gt;
]]&lt;br /&gt;
function str.len( frame )&lt;br /&gt;
    local new_args = str._getParameters( frame.args, {&amp;#039;s&amp;#039;} );&lt;br /&gt;
    local s = new_args[&amp;#039;s&amp;#039;] or &amp;#039;&amp;#039;;&lt;br /&gt;
    return mw.ustring.len( s )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
sub&lt;br /&gt;
&lt;br /&gt;
This function returns a substring of the target string at specified indices.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|sub|target_string|start_index|end_index}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|sub|s=target_string|i=start_index|j=end_index}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    s: The string to return a subset of&lt;br /&gt;
    i: The fist index of the substring to return, defaults to 1.&lt;br /&gt;
    j: The last index of the string to return, defaults to the last character.&lt;br /&gt;
    &lt;br /&gt;
The first character of the string is assigned an index of 1.  If either i or j&lt;br /&gt;
is a negative value, it is interpreted the same as selecting a character by &lt;br /&gt;
counting from the end of the string.  Hence, a value of -1 is the same as &lt;br /&gt;
selecting the last character of the string.&lt;br /&gt;
&lt;br /&gt;
If the requested indices are out of range for the given string, an error is &lt;br /&gt;
reported.&lt;br /&gt;
]]&lt;br /&gt;
function str.sub( frame )&lt;br /&gt;
    local new_args = str._getParameters( frame.args, { &amp;#039;s&amp;#039;, &amp;#039;i&amp;#039;, &amp;#039;j&amp;#039; } );&lt;br /&gt;
    local s = new_args[&amp;#039;s&amp;#039;] or &amp;#039;&amp;#039;;&lt;br /&gt;
    local i = tonumber( new_args[&amp;#039;i&amp;#039;] ) or 1;&lt;br /&gt;
    local j = tonumber( new_args[&amp;#039;j&amp;#039;] ) or -1;&lt;br /&gt;
    &lt;br /&gt;
    local len = mw.ustring.len( s );&lt;br /&gt;
&lt;br /&gt;
    -- Convert negatives for range checking&lt;br /&gt;
    if i &amp;lt; 0 then&lt;br /&gt;
        i = len + i + 1;&lt;br /&gt;
    end&lt;br /&gt;
    if j &amp;lt; 0 then&lt;br /&gt;
        j = len + j + 1;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if i &amp;gt; len or j &amp;gt; len or i &amp;lt; 1 or j &amp;lt; 1 then&lt;br /&gt;
        return str._error( &amp;#039;Значение индекса подстроки выходит за допустимые границы&amp;#039; );&lt;br /&gt;
    end&lt;br /&gt;
    if j &amp;lt; i then&lt;br /&gt;
        return str._error( &amp;#039;Неверный порядок индексов подстроки&amp;#039; );&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return mw.ustring.sub( s, i, j )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
This function implements that features of {{str sub old}} and is kept in order&lt;br /&gt;
to maintain these older templates.&lt;br /&gt;
]]&lt;br /&gt;
function str.sublength( frame )&lt;br /&gt;
    local i = tonumber( frame.args.i ) or 0&lt;br /&gt;
    local len = tonumber( frame.args.len )&lt;br /&gt;
    return mw.ustring.sub( frame.args.s, i + 1, len and ( i + len ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
match&lt;br /&gt;
&lt;br /&gt;
This function returns a substring from the source string that matches a &lt;br /&gt;
specified pattern.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|match|source_string|pattern_string|start_index|match_number|plain_flag|nomatch_output}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|pos|s=source_string|pattern=pattern_string|start=start_index&lt;br /&gt;
    |match=match_number|plain=plain_flag|nomatch=nomatch_output}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    s: The string to search&lt;br /&gt;
    pattern: The pattern or string to find within the string&lt;br /&gt;
    start: The index within the source string to start the search.  The first&lt;br /&gt;
        character of the string has index 1.  Defaults to 1.&lt;br /&gt;
    match: In some cases it may be possible to make multiple matches on a single &lt;br /&gt;
        string.  This specifies which match to return, where the first match is &lt;br /&gt;
        match= 1.  If a negative number is specified then a match is returned &lt;br /&gt;
        counting from the last match.  Hence match = -1 is the same as requesting&lt;br /&gt;
        the last match.  Defaults to 1.&lt;br /&gt;
    plain: A flag indicating that the pattern should be understood as plain&lt;br /&gt;
        text.  Defaults to false.&lt;br /&gt;
    nomatch: If no match is found, output the &amp;quot;nomatch&amp;quot; value rather than an error.&lt;br /&gt;
&lt;br /&gt;
If invoked using named parameters, Mediawiki will automatically remove any leading or&lt;br /&gt;
trailing whitespace from each string.  In some circumstances this is desirable, in &lt;br /&gt;
other cases one may want to preserve the whitespace.&lt;br /&gt;
&lt;br /&gt;
If the match_number or start_index are out of range for the string being queried, then&lt;br /&gt;
this function generates an error.  An error is also generated if no match is found.&lt;br /&gt;
If one adds the parameter ignore_errors=true, then the error will be suppressed and &lt;br /&gt;
an empty string will be returned on any failure.&lt;br /&gt;
&lt;br /&gt;
For information on constructing Lua patterns, a form of [regular expression], see:&lt;br /&gt;
&lt;br /&gt;
* http://www.lua.org/manual/5.1/manual.html#5.4.1&lt;br /&gt;
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns&lt;br /&gt;
* http://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Ustring_patterns&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
function str.match( frame )&lt;br /&gt;
    local new_args = str._getParameters( frame.args, {&amp;#039;s&amp;#039;, &amp;#039;pattern&amp;#039;, &amp;#039;start&amp;#039;, &amp;#039;match&amp;#039;, &amp;#039;plain&amp;#039;, &amp;#039;nomatch&amp;#039;} );&lt;br /&gt;
    local s = new_args[&amp;#039;s&amp;#039;] or &amp;#039;&amp;#039;;&lt;br /&gt;
    local start = tonumber( new_args[&amp;#039;start&amp;#039;] ) or 1;&lt;br /&gt;
    local plain_flag = str._getBoolean( new_args[&amp;#039;plain&amp;#039;] or false );&lt;br /&gt;
    local pattern = new_args[&amp;#039;pattern&amp;#039;] or &amp;#039;&amp;#039;;&lt;br /&gt;
    local match_index = math.floor( tonumber(new_args[&amp;#039;match&amp;#039;]) or 1 );&lt;br /&gt;
    local nomatch = new_args[&amp;#039;nomatch&amp;#039;];&lt;br /&gt;
    &lt;br /&gt;
    if s == &amp;#039;&amp;#039; then&lt;br /&gt;
        return str._error( &amp;#039;Пустая строка поиска&amp;#039; );&lt;br /&gt;
    end&lt;br /&gt;
    if pattern == &amp;#039;&amp;#039; then&lt;br /&gt;
        return str._error( &amp;#039;Пустой шаблон поиска&amp;#039; );&lt;br /&gt;
    end&lt;br /&gt;
    if math.abs(start) &amp;lt; 1 or math.abs(start) &amp;gt; mw.ustring.len( s ) then&lt;br /&gt;
        return str._error( &amp;#039;Индекс начала поиска выходит за допустимые границы&amp;#039; );&lt;br /&gt;
    end&lt;br /&gt;
    if match_index == 0 then&lt;br /&gt;
        return str._error( &amp;#039;Индекс совпадения выходит за допустимые границы&amp;#039; );&lt;br /&gt;
    end&lt;br /&gt;
    if plain_flag then&lt;br /&gt;
        pattern = str._escapePattern( pattern );&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local result&lt;br /&gt;
    if match_index == 1 then&lt;br /&gt;
        -- Find first match is simple case&lt;br /&gt;
        result = mw.ustring.match( s, pattern, start )&lt;br /&gt;
    else&lt;br /&gt;
        if start &amp;gt; 1 then&lt;br /&gt;
            s = mw.ustring.sub( s, start );&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        local iterator = mw.ustring.gmatch(s, pattern);&lt;br /&gt;
        if match_index &amp;gt; 0 then&lt;br /&gt;
            -- Forward search&lt;br /&gt;
            for w in iterator do&lt;br /&gt;
                match_index = match_index - 1;&lt;br /&gt;
                if match_index == 0 then&lt;br /&gt;
                    result = w;&lt;br /&gt;
                    break;&lt;br /&gt;
                end&lt;br /&gt;
            end    &lt;br /&gt;
        else&lt;br /&gt;
            -- Reverse search&lt;br /&gt;
            local result_table = {};&lt;br /&gt;
            local count = 1;&lt;br /&gt;
            for w in iterator do&lt;br /&gt;
                result_table[count] = w;&lt;br /&gt;
                count = count + 1;&lt;br /&gt;
            end&lt;br /&gt;
            &lt;br /&gt;
            result = result_table[ count + match_index ];            &lt;br /&gt;
        end&lt;br /&gt;
    end        &lt;br /&gt;
    &lt;br /&gt;
    if result == nil then&lt;br /&gt;
        if nomatch == nil then&lt;br /&gt;
            return str._error( &amp;#039;Совпадение не найдено&amp;#039; );&lt;br /&gt;
        else&lt;br /&gt;
            return nomatch;&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        return result;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
pos&lt;br /&gt;
&lt;br /&gt;
This function returns a single character from the target string at position pos.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|pos|target_string|index_value}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|pos|target=target_string|pos=index_value}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    target: The string to search&lt;br /&gt;
    pos: The index for the character to return&lt;br /&gt;
&lt;br /&gt;
If invoked using named parameters, Mediawiki will automatically remove any leading or&lt;br /&gt;
trailing whitespace from the target string.  In some circumstances this is desirable, in &lt;br /&gt;
other cases one may want to preserve the whitespace.&lt;br /&gt;
&lt;br /&gt;
The first character has an index value of 1.&lt;br /&gt;
&lt;br /&gt;
If one requests a negative value, this function will select a character by counting backwards &lt;br /&gt;
from the end of the string.  In other words pos = -1 is the same as asking for the last character.&lt;br /&gt;
&lt;br /&gt;
A requested value of zero, or a value greater than the length of the string returns an error.&lt;br /&gt;
]]&lt;br /&gt;
function str.pos( frame )&lt;br /&gt;
    local new_args = str._getParameters( frame.args, {&amp;#039;target&amp;#039;, &amp;#039;pos&amp;#039;} );&lt;br /&gt;
    local target_str = new_args[&amp;#039;target&amp;#039;] or &amp;#039;&amp;#039;;&lt;br /&gt;
    local pos = tonumber( new_args[&amp;#039;pos&amp;#039;] ) or 0;&lt;br /&gt;
&lt;br /&gt;
    if pos == 0 or math.abs(pos) &amp;gt; mw.ustring.len( target_str ) then&lt;br /&gt;
        return str._error( &amp;#039;Значение индекса строки выходит за допустимые границы&amp;#039; );&lt;br /&gt;
    end    &lt;br /&gt;
    &lt;br /&gt;
    return mw.ustring.sub( target_str, pos, pos );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
str_find&lt;br /&gt;
&lt;br /&gt;
This function duplicates the behavior of {{str_find}}, including all of its quirks.&lt;br /&gt;
This is provided in order to support existing templates, but is NOT RECOMMENDED for &lt;br /&gt;
new code and templates.  New code is recommended to use the &amp;quot;find&amp;quot; function instead.&lt;br /&gt;
&lt;br /&gt;
Returns the first index in &amp;quot;source&amp;quot; that is a match to &amp;quot;target&amp;quot;.  Indexing is 1-based,&lt;br /&gt;
and the function returns -1 if the &amp;quot;target&amp;quot; string is not present in &amp;quot;source&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Important Note: If the &amp;quot;target&amp;quot; string is empty / missing, this function returns a&lt;br /&gt;
value of &amp;quot;1&amp;quot;, which is generally unexpected behavior, and must be accounted for&lt;br /&gt;
separatetly.&lt;br /&gt;
]]&lt;br /&gt;
function str.str_find( frame )&lt;br /&gt;
    local new_args = str._getParameters( frame.args, {&amp;#039;source&amp;#039;, &amp;#039;target&amp;#039;} );&lt;br /&gt;
    local source_str = new_args[&amp;#039;source&amp;#039;] or &amp;#039;&amp;#039;;&lt;br /&gt;
    local target_str = new_args[&amp;#039;target&amp;#039;] or &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    if target_str == &amp;#039;&amp;#039; then&lt;br /&gt;
        return 1;&lt;br /&gt;
    end    &lt;br /&gt;
    &lt;br /&gt;
    local start = mw.ustring.find( source_str, target_str, 1, true )&lt;br /&gt;
    if start == nil then&lt;br /&gt;
        start = -1&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return start&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
find&lt;br /&gt;
&lt;br /&gt;
This function allows one to search for a target string or pattern within another&lt;br /&gt;
string.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|find|source_str|target_string|start_index|plain_flag}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|find|source=source_str|target=target_str|start=start_index|plain=plain_flag}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    source: The string to search&lt;br /&gt;
    target: The string or pattern to find within source&lt;br /&gt;
    start: The index within the source string to start the search, defaults to 1&lt;br /&gt;
    plain: Boolean flag indicating that target should be understood as plain&lt;br /&gt;
        text and not as a Lua style regular expression, defaults to true&lt;br /&gt;
&lt;br /&gt;
If invoked using named parameters, Mediawiki will automatically remove any leading or&lt;br /&gt;
trailing whitespace from the parameter.  In some circumstances this is desirable, in &lt;br /&gt;
other cases one may want to preserve the whitespace.&lt;br /&gt;
&lt;br /&gt;
This function returns the first index &amp;gt;= &amp;quot;start&amp;quot; where &amp;quot;target&amp;quot; can be found &lt;br /&gt;
within &amp;quot;source&amp;quot;.  Indices are 1-based.  If &amp;quot;target&amp;quot; is not found, then this &lt;br /&gt;
function returns 0.  If either &amp;quot;source&amp;quot; or &amp;quot;target&amp;quot; are missing / empty, this&lt;br /&gt;
function also returns 0.&lt;br /&gt;
&lt;br /&gt;
This function should be safe for UTF-8 strings.&lt;br /&gt;
]]&lt;br /&gt;
function str.find( frame )&lt;br /&gt;
    local new_args = str._getParameters( frame.args, {&amp;#039;source&amp;#039;, &amp;#039;target&amp;#039;, &amp;#039;start&amp;#039;, &amp;#039;plain&amp;#039; } ); &lt;br /&gt;
    local source_str = new_args[&amp;#039;source&amp;#039;] or &amp;#039;&amp;#039;;&lt;br /&gt;
    local pattern = new_args[&amp;#039;target&amp;#039;] or &amp;#039;&amp;#039;;&lt;br /&gt;
    local start_pos = tonumber(new_args[&amp;#039;start&amp;#039;]) or 1;&lt;br /&gt;
    local plain = new_args[&amp;#039;plain&amp;#039;] or true;&lt;br /&gt;
        &lt;br /&gt;
    if source_str == &amp;#039;&amp;#039; or pattern == &amp;#039;&amp;#039; then&lt;br /&gt;
        return 0;&lt;br /&gt;
    end    &lt;br /&gt;
    &lt;br /&gt;
    plain = str._getBoolean( plain );&lt;br /&gt;
&lt;br /&gt;
    local start = mw.ustring.find( source_str, pattern, start_pos, plain )&lt;br /&gt;
    if start == nil then&lt;br /&gt;
        start = 0&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return start&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
replace&lt;br /&gt;
&lt;br /&gt;
This function allows one to replace a target string or pattern within another&lt;br /&gt;
string.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|replace|source_str|pattern_string|replace_string|replacement_count|plain_flag}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|replace|source=source_string|pattern=pattern_string|replace=replace_string|&lt;br /&gt;
   count=replacement_count|plain=plain_flag}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    source: The string to search&lt;br /&gt;
    pattern: The string or pattern to find within source&lt;br /&gt;
    replace: The replacement text&lt;br /&gt;
    count: The number of occurences to replace, defaults to all.&lt;br /&gt;
    plain: Boolean flag indicating that pattern should be understood as plain&lt;br /&gt;
        text and not as a Lua style regular expression, defaults to true &lt;br /&gt;
]]&lt;br /&gt;
function str.replace( frame )&lt;br /&gt;
    local new_args = str._getParameters( frame.args, {&amp;#039;source&amp;#039;, &amp;#039;pattern&amp;#039;, &amp;#039;replace&amp;#039;, &amp;#039;count&amp;#039;, &amp;#039;plain&amp;#039; } ); &lt;br /&gt;
    local source_str = new_args[&amp;#039;source&amp;#039;] or &amp;#039;&amp;#039;;&lt;br /&gt;
    local pattern = new_args[&amp;#039;pattern&amp;#039;] or &amp;#039;&amp;#039;;&lt;br /&gt;
    local replace = new_args[&amp;#039;replace&amp;#039;] or &amp;#039;&amp;#039;;&lt;br /&gt;
    local count = tonumber( new_args[&amp;#039;count&amp;#039;] );&lt;br /&gt;
    local plain = new_args[&amp;#039;plain&amp;#039;] or true;&lt;br /&gt;
        &lt;br /&gt;
    if source_str == &amp;#039;&amp;#039; or pattern == &amp;#039;&amp;#039; then&lt;br /&gt;
        return source_str;&lt;br /&gt;
    end    &lt;br /&gt;
    plain = str._getBoolean( plain );&lt;br /&gt;
&lt;br /&gt;
    if plain then&lt;br /&gt;
        pattern = str._escapePattern( pattern );&lt;br /&gt;
        replace = mw.ustring.gsub( replace, &amp;quot;%%&amp;quot;, &amp;quot;%%%%&amp;quot; ); --Only need to escape replacement sequences.&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local result;&lt;br /&gt;
&lt;br /&gt;
    if count ~= nil then&lt;br /&gt;
        result = mw.ustring.gsub( source_str, pattern, replace, count );&lt;br /&gt;
    else&lt;br /&gt;
        result = mw.ustring.gsub( source_str, pattern, replace );&lt;br /&gt;
    end        &lt;br /&gt;
&lt;br /&gt;
    return result;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
This function adds support for escaping parts of the patterns when using [plain=false].&lt;br /&gt;
]]&lt;br /&gt;
function str.escape( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&amp;#039;pattern&amp;#039; } );&lt;br /&gt;
	local pattern = new_args[&amp;#039;pattern&amp;#039;] or &amp;#039;&amp;#039;;&lt;br /&gt;
	&lt;br /&gt;
	local result = &amp;#039;&amp;#039;;&lt;br /&gt;
	result = str._escapePattern( pattern );&lt;br /&gt;
	return result;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
  Internal compare string function&lt;br /&gt;
]]&lt;br /&gt;
function str._strcmp(a , b)&lt;br /&gt;
    local s1c = mw.ustring.gcodepoint( a );&lt;br /&gt;
    local s2c = mw.ustring.gcodepoint( b );&lt;br /&gt;
    while true do&lt;br /&gt;
        local c1 = s1c();&lt;br /&gt;
        local c2 = s2c();&lt;br /&gt;
        if c1 == nil then&lt;br /&gt;
            if c2 == nil then&lt;br /&gt;
                return 0&lt;br /&gt;
            else&lt;br /&gt;
                return -1&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            if c2 ~= nil then&lt;br /&gt;
                if c1 ~= c2 then&lt;br /&gt;
                  return c1 &amp;lt; c2 and -1 or 1&lt;br /&gt;
              end&lt;br /&gt;
            else&lt;br /&gt;
                return 1&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return 0&lt;br /&gt;
end&lt;br /&gt;
 &lt;br /&gt;
--[[&lt;br /&gt;
compare&lt;br /&gt;
&lt;br /&gt;
This function compare two UTF-8 strings&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|compare|str1|str2}}&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
 0 - if strings are equal&lt;br /&gt;
 1 - if st1 &amp;gt; str2&lt;br /&gt;
-1 - if str1 &amp;lt; str2&lt;br /&gt;
]]&lt;br /&gt;
function str.compare(frame)&lt;br /&gt;
    local str1 = frame.args[1] or &amp;#039;&amp;#039;;&lt;br /&gt;
    local str2 = frame.args[2] or &amp;#039;&amp;#039;;&lt;br /&gt;
    return str._strcmp(str1 , str2)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[ &lt;br /&gt;
    simple function to pipe string.rep to templates.&lt;br /&gt;
]]&lt;br /&gt;
 &lt;br /&gt;
function str.rep( frame )&lt;br /&gt;
    local repetitions = tonumber( frame.args[2] )&lt;br /&gt;
    if not repetitions then &lt;br /&gt;
        return str._error( &amp;#039;функция rep ожидает число  во втором параметре, а получено &amp;quot;&amp;#039; .. ( frame.args[2] or &amp;#039;&amp;#039; ) .. &amp;#039;&amp;quot;&amp;#039; )&lt;br /&gt;
    end&lt;br /&gt;
    return string.rep( frame.args[1] or &amp;#039;&amp;#039;, repetitions )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Helper function that populates the argument list given that user may need to use a mix of&lt;br /&gt;
named and unnamed parameters.  This is relevant because named parameters are not&lt;br /&gt;
identical to unnamed parameters due to string trimming, and when dealing with strings&lt;br /&gt;
we sometimes want to either preserve or remove that whitespace depending on the application.&lt;br /&gt;
]]&lt;br /&gt;
function str._getParameters( frame_args, arg_list )&lt;br /&gt;
    local new_args = {};&lt;br /&gt;
    local index = 1;&lt;br /&gt;
    local value;&lt;br /&gt;
    &lt;br /&gt;
    for i,arg in ipairs( arg_list ) do&lt;br /&gt;
        value = frame_args[arg]&lt;br /&gt;
        if value == nil then&lt;br /&gt;
            value = frame_args[index];&lt;br /&gt;
            index = index + 1;&lt;br /&gt;
        end&lt;br /&gt;
        new_args[arg] = value;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return new_args;&lt;br /&gt;
end        &lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Helper function to handle error messages.&lt;br /&gt;
]]&lt;br /&gt;
function str._error( error_str )&lt;br /&gt;
    local frame = mw.getCurrentFrame();&lt;br /&gt;
    local error_category = frame.args.error_category or &amp;#039;Страницы с ошибками модуля String&amp;#039;;&lt;br /&gt;
    local ignore_errors = frame.args.ignore_errors or false;&lt;br /&gt;
    local no_category = frame.args.no_category or false;&lt;br /&gt;
    &lt;br /&gt;
    if str._getBoolean(ignore_errors) then&lt;br /&gt;
        return &amp;#039;&amp;#039;;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    local error_str = &amp;#039;&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;Ошибка модуля String: &amp;#039; .. error_str .. &amp;#039;&amp;lt;/strong&amp;gt;&amp;#039;;&lt;br /&gt;
    if error_category ~= &amp;#039;&amp;#039; and not str._getBoolean( no_category ) then&lt;br /&gt;
        error_str = &amp;#039;[[Категория:&amp;#039; .. error_category .. &amp;#039;]]&amp;#039; .. error_str;&lt;br /&gt;
    end        &lt;br /&gt;
    &lt;br /&gt;
    return error_str;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Helper Function to interpret boolean strings&lt;br /&gt;
]]&lt;br /&gt;
function str._getBoolean( boolean_str )&lt;br /&gt;
    local boolean_value;&lt;br /&gt;
    &lt;br /&gt;
    if type( boolean_str ) == &amp;#039;string&amp;#039; then&lt;br /&gt;
        boolean_str = boolean_str:lower();&lt;br /&gt;
        if boolean_str == &amp;#039;false&amp;#039; or boolean_str == &amp;#039;no&amp;#039; or boolean_str == &amp;#039;0&amp;#039; &lt;br /&gt;
                or boolean_str == &amp;#039;&amp;#039; then&lt;br /&gt;
            boolean_value = false;&lt;br /&gt;
        else&lt;br /&gt;
            boolean_value = true;&lt;br /&gt;
        end    &lt;br /&gt;
    elseif type( boolean_str ) == &amp;#039;boolean&amp;#039; then&lt;br /&gt;
        boolean_value = boolean_str;&lt;br /&gt;
    else&lt;br /&gt;
        error( &amp;#039;Логическое значение не найдено&amp;#039; );&lt;br /&gt;
    end    &lt;br /&gt;
    return boolean_value&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Helper function that escapes all pattern characters so that they will be treated &lt;br /&gt;
as plain text.&lt;br /&gt;
]]&lt;br /&gt;
function str._escapePattern( pattern_str )&lt;br /&gt;
    return mw.ustring.gsub( pattern_str, &amp;quot;([%(%)%.%%%+%-%*%?%[%^%$%]])&amp;quot;, &amp;quot;%%%1&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return str&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Separated_entries&amp;diff=271</id>
		<title>Модуль:Separated entries</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Separated_entries&amp;diff=271"/>
		<updated>2022-03-06T16:36:24Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module takes positional parameters as input and concatenates them with&lt;br /&gt;
-- an optional separator. The final separator (the &amp;quot;conjunction&amp;quot;) can be&lt;br /&gt;
-- specified independently, enabling natural-language lists like&lt;br /&gt;
-- &amp;quot;foo, bar, baz and qux&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
local compressSparseArray = require(&amp;#039;Module:TableTools&amp;#039;).compressSparseArray&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	local separator = args.separator&lt;br /&gt;
		-- Decode (convert to Unicode) HTML escape sequences, such as &amp;quot;&amp;amp;#32;&amp;quot; for space.&lt;br /&gt;
		and mw.text.decode(args.separator) or &amp;#039;&amp;#039;&lt;br /&gt;
	local conjunction = args.conjunction and mw.text.decode(args.conjunction) or separator&lt;br /&gt;
	-- Discard named parameters.&lt;br /&gt;
	local values = compressSparseArray(args)&lt;br /&gt;
	return mw.text.listToText(values, separator, conjunction)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function makeInvokeFunction(separator, conjunction)&lt;br /&gt;
	return function (frame)&lt;br /&gt;
		local args = require(&amp;#039;Module:Arguments&amp;#039;).getArgs(frame)&lt;br /&gt;
		args.separator = separator or args.separator&lt;br /&gt;
		args.conjunction = conjunction or args.conjunction&lt;br /&gt;
		return p._main(args)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.main = makeInvokeFunction()&lt;br /&gt;
p.br = makeInvokeFunction(&amp;#039;&amp;lt;br /&amp;gt;&amp;#039;)&lt;br /&gt;
p.newline = makeInvokeFunction(&amp;#039;\n&amp;#039;)&lt;br /&gt;
p.comma = makeInvokeFunction(mw.message.new(&amp;#039;comma-separator&amp;#039;):plain())&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:No_globals&amp;diff=269</id>
		<title>Модуль:No globals</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:No_globals&amp;diff=269"/>
		<updated>2022-03-06T16:36:24Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local mt = getmetatable(_G) or {}&lt;br /&gt;
function mt.__index (t, k)&lt;br /&gt;
	if k ~= &amp;#039;arg&amp;#039; then&lt;br /&gt;
		error(&amp;#039;Tried to read nil global &amp;#039; .. tostring(k), 2)&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
function mt.__newindex(t, k, v)&lt;br /&gt;
	if k ~= &amp;#039;arg&amp;#039; then&lt;br /&gt;
		error(&amp;#039;Tried to write global &amp;#039; .. tostring(k), 2)&lt;br /&gt;
	end&lt;br /&gt;
	rawset(t, k, v)&lt;br /&gt;
end&lt;br /&gt;
setmetatable(_G, mt)&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Namespace_detect/data&amp;diff=267</id>
		<title>Модуль:Namespace detect/data</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Namespace_detect/data&amp;diff=267"/>
		<updated>2022-03-06T16:36:23Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--------------------------------------------------------------------------------&lt;br /&gt;
--                          Namespace detect data                             --&lt;br /&gt;
-- This module holds data for [[Module:Namespace detect]] to be loaded per    --&lt;br /&gt;
-- page, rather than per #invoke, for performance reasons.                    --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local cfg = require(&amp;#039;Module:Namespace detect/config&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local function addKey(t, key, defaultKey)&lt;br /&gt;
	if key ~= defaultKey then&lt;br /&gt;
		t[#t + 1] = key&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Get a table of parameters to query for each default parameter name.&lt;br /&gt;
-- This allows wikis to customise parameter names in the cfg table while&lt;br /&gt;
-- ensuring that default parameter names will always work. The cfg table&lt;br /&gt;
-- values can be added as a string, or as an array of strings.&lt;br /&gt;
&lt;br /&gt;
local defaultKeys = {&lt;br /&gt;
	&amp;#039;main&amp;#039;,&lt;br /&gt;
	&amp;#039;talk&amp;#039;,&lt;br /&gt;
	&amp;#039;other&amp;#039;,&lt;br /&gt;
	&amp;#039;subjectns&amp;#039;,&lt;br /&gt;
	&amp;#039;demospace&amp;#039;,&lt;br /&gt;
	&amp;#039;demopage&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local argKeys = {}&lt;br /&gt;
for i, defaultKey in ipairs(defaultKeys) do&lt;br /&gt;
	argKeys[defaultKey] = {defaultKey}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for defaultKey, t in pairs(argKeys) do&lt;br /&gt;
	local cfgValue = cfg[defaultKey]&lt;br /&gt;
	local cfgValueType = type(cfgValue)&lt;br /&gt;
	if cfgValueType == &amp;#039;string&amp;#039; then&lt;br /&gt;
		addKey(t, cfgValue, defaultKey)&lt;br /&gt;
	elseif cfgValueType == &amp;#039;table&amp;#039; then&lt;br /&gt;
		for i, key in ipairs(cfgValue) do&lt;br /&gt;
			addKey(t, key, defaultKey)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	cfg[defaultKey] = nil -- Free the cfg value as we don&amp;#039;t need it any more.&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getParamMappings()&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Returns a table of how parameter names map to namespace names. The keys&lt;br /&gt;
	-- are the actual namespace names, in lower case, and the values are the&lt;br /&gt;
	-- possible parameter names for that namespace, also in lower case. The&lt;br /&gt;
	-- table entries are structured like this:&lt;br /&gt;
	-- {&lt;br /&gt;
	--   [&amp;#039;&amp;#039;] = {&amp;#039;main&amp;#039;},&lt;br /&gt;
	--   [&amp;#039;wikipedia&amp;#039;] = {&amp;#039;wikipedia&amp;#039;, &amp;#039;project&amp;#039;, &amp;#039;wp&amp;#039;},&lt;br /&gt;
	--   ...&lt;br /&gt;
	-- }&lt;br /&gt;
	--]]&lt;br /&gt;
	local mappings = {}&lt;br /&gt;
	local mainNsName = mw.site.subjectNamespaces[0].name&lt;br /&gt;
	mainNsName = mw.ustring.lower(mainNsName)&lt;br /&gt;
	mappings[mainNsName] = mw.clone(argKeys.main)&lt;br /&gt;
	mappings[&amp;#039;talk&amp;#039;] = mw.clone(argKeys.talk)&lt;br /&gt;
	for nsid, ns in pairs(mw.site.subjectNamespaces) do&lt;br /&gt;
		if nsid ~= 0 then -- Exclude main namespace.&lt;br /&gt;
			local nsname = mw.ustring.lower(ns.name)&lt;br /&gt;
			local canonicalName = mw.ustring.lower(ns.canonicalName)&lt;br /&gt;
			mappings[nsname] = {nsname}&lt;br /&gt;
			if canonicalName ~= nsname then&lt;br /&gt;
				table.insert(mappings[nsname], canonicalName)&lt;br /&gt;
			end&lt;br /&gt;
			for _, alias in ipairs(ns.aliases) do&lt;br /&gt;
				table.insert(mappings[nsname], mw.ustring.lower(alias))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return mappings&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	argKeys = argKeys,&lt;br /&gt;
	cfg = cfg,&lt;br /&gt;
	mappings = getParamMappings()&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Namespace_detect/config&amp;diff=265</id>
		<title>Модуль:Namespace detect/config</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Namespace_detect/config&amp;diff=265"/>
		<updated>2022-03-06T16:36:23Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--------------------------------------------------------------------------------&lt;br /&gt;
--                    Namespace detect configuration data                     --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- This module stores configuration data for Module:Namespace detect. Here    --&lt;br /&gt;
-- you can localise the module to your wiki&amp;#039;s language.                       --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- To activate a configuration item, you need to uncomment it. This means     --&lt;br /&gt;
-- that you need to remove the text &amp;quot;-- &amp;quot; at the start of the line.           --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local cfg = {} -- Don&amp;#039;t edit this line.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                              Parameter names                               --&lt;br /&gt;
-- These configuration items specify custom parameter names. Values added     --&lt;br /&gt;
-- here will work in addition to the default English parameter names.         --&lt;br /&gt;
-- To add one extra name, you can use this format:                            --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- cfg.foo = &amp;#039;parameter name&amp;#039;                                                 --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- To add multiple names, you can use this format:                            --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- cfg.foo = {&amp;#039;parameter name 1&amp;#039;, &amp;#039;parameter name 2&amp;#039;, &amp;#039;parameter name 3&amp;#039;}     --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
---- This parameter displays content for the main namespace:&lt;br /&gt;
-- cfg.main = &amp;#039;main&amp;#039;&lt;br /&gt;
&lt;br /&gt;
---- This parameter displays in talk namespaces:&lt;br /&gt;
-- cfg.talk = &amp;#039;talk&amp;#039;&lt;br /&gt;
&lt;br /&gt;
---- This parameter displays content for &amp;quot;other&amp;quot; namespaces (namespaces for which&lt;br /&gt;
---- parameters have not been specified):&lt;br /&gt;
-- cfg.other = &amp;#039;other&amp;#039;&lt;br /&gt;
&lt;br /&gt;
---- This parameter makes talk pages behave as though they are the corresponding&lt;br /&gt;
---- subject namespace. Note that this parameter is used with [[Module:Yesno]].&lt;br /&gt;
---- Edit that module to change the default values of &amp;quot;yes&amp;quot;, &amp;quot;no&amp;quot;, etc.&lt;br /&gt;
-- cfg.subjectns = &amp;#039;subjectns&amp;#039;&lt;br /&gt;
&lt;br /&gt;
---- This parameter sets a demonstration namespace:&lt;br /&gt;
-- cfg.demospace = &amp;#039;demospace&amp;#039;&lt;br /&gt;
&lt;br /&gt;
---- This parameter sets a specific page to compare:&lt;br /&gt;
cfg.demopage = &amp;#039;page&amp;#039;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                           Table configuration                              --&lt;br /&gt;
-- These configuration items allow customisation of the &amp;quot;table&amp;quot; function,     --&lt;br /&gt;
-- used to generate a table of possible parameters in the module              --&lt;br /&gt;
-- documentation.                                                             --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
---- The header for the namespace column in the wikitable containing the list of&lt;br /&gt;
---- possible subject-space parameters.&lt;br /&gt;
-- cfg.wikitableNamespaceHeader = &amp;#039;Namespace&amp;#039;&lt;br /&gt;
&lt;br /&gt;
---- The header for the wikitable containing the list of possible subject-space&lt;br /&gt;
---- parameters.&lt;br /&gt;
-- cfg.wikitableAliasesHeader = &amp;#039;Aliases&amp;#039;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                        End of configuration data                           --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
return cfg -- Don&amp;#039;t edit this line.&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Message_box/configuration&amp;diff=263</id>
		<title>Модуль:Message box/configuration</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Message_box/configuration&amp;diff=263"/>
		<updated>2022-03-06T16:36:22Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--------------------------------------------------------------------------------&lt;br /&gt;
--                          Message box configuration                         --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- This module contains configuration data for [[Module:Message box]].        --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	ambox = {&lt;br /&gt;
		types = {&lt;br /&gt;
			speedy = {&lt;br /&gt;
				class = &amp;#039;ambox-speedy&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Ambox warning pn.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			delete = {&lt;br /&gt;
				class = &amp;#039;ambox-delete&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Stop hand nuvola.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			content = {&lt;br /&gt;
				class = &amp;#039;ambox-content&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Emblem-important.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			style = {&lt;br /&gt;
				class = &amp;#039;ambox-style&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Broom_icon.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			move = {&lt;br /&gt;
				class = &amp;#039;ambox-move&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Merge-split-transwiki default.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			protection = {&lt;br /&gt;
				class = &amp;#039;ambox-protection&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Padlock-silver-medium.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			notice = {&lt;br /&gt;
				class = &amp;#039;ambox-notice&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Information.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			good = {&lt;br /&gt;
				class = &amp;#039;ambox-good&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Green star boxed.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			serious = {&lt;br /&gt;
				class = &amp;#039;ambox-serious&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Stop hand nuvola.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			merge = {&lt;br /&gt;
				class = &amp;#039;ambox-merge&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Merge-split-transwiki default.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			discussion = {&lt;br /&gt;
				class = &amp;#039;ambox-discussion&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Nuvola apps ksirc.png&amp;#039;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		default                     = &amp;#039;notice&amp;#039;,&lt;br /&gt;
		allowBlankParams            = {&amp;#039;talk&amp;#039;, &amp;#039;sect&amp;#039;, &amp;#039;date&amp;#039;, &amp;#039;issue&amp;#039;, &amp;#039;fix&amp;#039;, &amp;#039;subst&amp;#039;, &amp;#039;hidden&amp;#039;, &amp;#039;image&amp;#039;},&lt;br /&gt;
		allowSmall                  = true,&lt;br /&gt;
		smallParam                  = &amp;#039;left&amp;#039;,&lt;br /&gt;
		smallClass                  = &amp;#039;mbox-small-left&amp;#039;,&lt;br /&gt;
		substCheck                  = true,&lt;br /&gt;
		classes                     = {&amp;#039;metadata&amp;#039;, &amp;#039;ambox&amp;#039;},&lt;br /&gt;
		imageEmptyCell              = true,&lt;br /&gt;
		imageCheckBlank             = true,&lt;br /&gt;
		imageSmallSize              = &amp;#039;20x20px&amp;#039;,&lt;br /&gt;
		imageCellDiv                = true,&lt;br /&gt;
		useCollapsibleTextFields    = true,&lt;br /&gt;
		imageRightNone              = true,&lt;br /&gt;
		sectionDefault              = &amp;#039;статья&amp;#039;,&lt;br /&gt;
		allowMainspaceCategories    = true,&lt;br /&gt;
		templateCategory            = &amp;#039;Шаблоны:Шаблоны-сообщения для статей&amp;#039;,&lt;br /&gt;
		templateCategoryRequireName = true,&lt;br /&gt;
		templateErrorCategory       = &amp;#039;Шаблоны:Шаблоны-сообщения для статей с пропущенными параметрами&amp;#039;,&lt;br /&gt;
		templateErrorParamsToCheck  = {&amp;#039;issue&amp;#039;, &amp;#039;fix&amp;#039;},&lt;br /&gt;
		removalNotice               = &amp;#039;[[Help:Maintenance template removal|Learn how and when to remove this template message]]&amp;#039;&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	cmbox = {&lt;br /&gt;
		types = {&lt;br /&gt;
			speedy = {&lt;br /&gt;
				class = &amp;#039;cmbox-speedy&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Ambox warning pn.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			delete = {&lt;br /&gt;
				class = &amp;#039;cmbox-delete&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Ambox warning pn.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			content = {&lt;br /&gt;
				class = &amp;#039;cmbox-content&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Ambox important.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			style = {&lt;br /&gt;
				class = &amp;#039;cmbox-style&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Edit-clear.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			move = {&lt;br /&gt;
				class = &amp;#039;cmbox-move&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Merge-split-transwiki default.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			protection = {&lt;br /&gt;
				class = &amp;#039;cmbox-protection&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Padlock-silver-medium.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			notice = {&lt;br /&gt;
				class = &amp;#039;cmbox-notice&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Information icon4.svg&amp;#039;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		default                  = &amp;#039;notice&amp;#039;,&lt;br /&gt;
		showInvalidTypeError     = true,&lt;br /&gt;
		classes                  = {&amp;#039;cmbox&amp;#039;},&lt;br /&gt;
		imageEmptyCell           = true,&lt;br /&gt;
		useCollapsibleTextFields = true&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	fmbox = {&lt;br /&gt;
		types = {&lt;br /&gt;
			warning = {&lt;br /&gt;
				class = &amp;#039;fmbox-warning&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Ambox warning pn.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			editnotice = {&lt;br /&gt;
				class = &amp;#039;fmbox-editnotice&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Information icon4.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			system = {&lt;br /&gt;
				class = &amp;#039;fmbox-system&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Information icon4.svg&amp;#039;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		default                  = &amp;#039;system&amp;#039;,&lt;br /&gt;
		showInvalidTypeError     = true,&lt;br /&gt;
		classes                  = {&amp;#039;fmbox&amp;#039;},&lt;br /&gt;
		imageEmptyCell           = false,&lt;br /&gt;
		imageRightNone           = false,&lt;br /&gt;
		useCollapsibleTextFields = true&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	imbox = {&lt;br /&gt;
		types = {&lt;br /&gt;
			speedy = {&lt;br /&gt;
				class = &amp;#039;imbox-speedy&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Ambox warning pn.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			delete = {&lt;br /&gt;
				class = &amp;#039;imbox-delete&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Ambox warning pn.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			content = {&lt;br /&gt;
				class = &amp;#039;imbox-content&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Ambox important.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			style = {&lt;br /&gt;
				class = &amp;#039;imbox-style&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Edit-clear.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			move = {&lt;br /&gt;
				class = &amp;#039;imbox-move&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Merge-split-transwiki default.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			protection = {&lt;br /&gt;
				class = &amp;#039;imbox-protection&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Padlock-silver-medium.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			license = {&lt;br /&gt;
				class = &amp;#039;imbox-license licensetpl&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Imbox license.png&amp;#039; -- @todo We need an SVG version of this&lt;br /&gt;
			},&lt;br /&gt;
			featured = {&lt;br /&gt;
				class = &amp;#039;imbox-featured&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Cscr-featured.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			notice = {&lt;br /&gt;
				class = &amp;#039;imbox-notice&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Information icon4.svg&amp;#039;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		default                  = &amp;#039;notice&amp;#039;,&lt;br /&gt;
		showInvalidTypeError     = true,&lt;br /&gt;
		classes                  = {&amp;#039;imbox&amp;#039;},&lt;br /&gt;
		imageEmptyCell           = true,&lt;br /&gt;
		below                    = true,&lt;br /&gt;
		useCollapsibleTextFields = true,&lt;br /&gt;
		templateCategory         = &amp;#039;Шаблоны:Шаблоны-сообщения для файлов&amp;#039;&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	ombox = {&lt;br /&gt;
		types = {&lt;br /&gt;
			speedy = {&lt;br /&gt;
				class = &amp;#039;ombox-speedy&amp;#039;,&lt;br /&gt;
				image = &amp;#039;OOjs UI icon alert-destructive.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			delete = {&lt;br /&gt;
				class = &amp;#039;ombox-delete&amp;#039;,&lt;br /&gt;
				image = &amp;#039;OOjs UI icon alert-destructive.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			content = {&lt;br /&gt;
				class = &amp;#039;ombox-content&amp;#039;,&lt;br /&gt;
				image = &amp;#039;OOjs UI icon notice-warning.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			style = {&lt;br /&gt;
				class = &amp;#039;ombox-style&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Edit-clear.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			move = {&lt;br /&gt;
				class = &amp;#039;ombox-move&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Imbox move.png&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			protection = {&lt;br /&gt;
				class = &amp;#039;ombox-protection&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Imbox protection.png&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			notice = {&lt;br /&gt;
				class = &amp;#039;ombox-notice&amp;#039;,&lt;br /&gt;
				image = &amp;#039;OOjs UI icon info-progressive.svg&amp;#039;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		default                  = &amp;#039;notice&amp;#039;,&lt;br /&gt;
		showInvalidTypeError     = true,&lt;br /&gt;
		classes                  = {&amp;#039;ombox&amp;#039;},&lt;br /&gt;
		allowSmall               = true,&lt;br /&gt;
		imageEmptyCell           = true,&lt;br /&gt;
		imageRightNone           = true,&lt;br /&gt;
		useCollapsibleTextFields = true&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	tmbox = {&lt;br /&gt;
		types = {&lt;br /&gt;
			speedy = {&lt;br /&gt;
				class = &amp;#039;tmbox-speedy&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Ambox warning pn.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			delete = {&lt;br /&gt;
				class = &amp;#039;tmbox-delete&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Ambox warning pn.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			content = {&lt;br /&gt;
				class = &amp;#039;tmbox-content&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Ambox important.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			style = {&lt;br /&gt;
				class = &amp;#039;tmbox-style&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Edit-clear.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			move = {&lt;br /&gt;
				class = &amp;#039;tmbox-move&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Merge-split-transwiki default.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			protection = {&lt;br /&gt;
				class = &amp;#039;tmbox-protection&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Padlock-silver-medium.svg&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			notice = {&lt;br /&gt;
				class = &amp;#039;tmbox-notice&amp;#039;,&lt;br /&gt;
				image = &amp;#039;Information icon4.svg&amp;#039;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		default                  = &amp;#039;notice&amp;#039;,&lt;br /&gt;
		showInvalidTypeError     = true,&lt;br /&gt;
		classes                  = {&amp;#039;tmbox&amp;#039;},&lt;br /&gt;
		allowSmall               = true,&lt;br /&gt;
		imageRightNone           = true,&lt;br /&gt;
		imageEmptyCell           = true,&lt;br /&gt;
		imageEmptyCellStyle      = true,&lt;br /&gt;
		useCollapsibleTextFields = true,&lt;br /&gt;
		templateCategory         = &amp;#039;Шаблоны:Шаблоны-сообщения для страниц обсуждений&amp;#039;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Message_box&amp;diff=261</id>
		<title>Модуль:Message box</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Message_box&amp;diff=261"/>
		<updated>2022-03-06T16:36:22Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This is a meta-module for producing message box templates, including&lt;br /&gt;
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.&lt;br /&gt;
&lt;br /&gt;
-- Load necessary modules.&lt;br /&gt;
require(&amp;#039;Module:No globals&amp;#039;)&lt;br /&gt;
local getArgs&lt;br /&gt;
local categoryHandler = require(&amp;#039;Module:Category handler&amp;#039;)._main&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
local boxDate = require(&amp;#039;Module:Calendar&amp;#039;).bxDate;&lt;br /&gt;
&lt;br /&gt;
-- Get a language object for formatDate and ucfirst.&lt;br /&gt;
local lang = mw.language.getContentLanguage()&lt;br /&gt;
&lt;br /&gt;
-- Define constants&lt;br /&gt;
local CONFIG_MODULE = &amp;#039;Module:Message box/configuration&amp;#039;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Helper functions&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function getTitleObject(...)&lt;br /&gt;
	-- Get the title object, passing the function through pcall&lt;br /&gt;
	-- in case we are over the expensive function count limit.&lt;br /&gt;
	local success, title = pcall(mw.title.new, ...)&lt;br /&gt;
	if success then&lt;br /&gt;
		return title&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function union(t1, t2)&lt;br /&gt;
	-- Returns the union of two arrays.&lt;br /&gt;
	local vals = {}&lt;br /&gt;
	for i, v in ipairs(t1) do&lt;br /&gt;
		vals[v] = true&lt;br /&gt;
	end&lt;br /&gt;
	for i, v in ipairs(t2) do&lt;br /&gt;
		vals[v] = true&lt;br /&gt;
	end&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	for k in pairs(vals) do&lt;br /&gt;
		table.insert(ret, k)&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(ret)&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getArgNums(args, prefix)&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		local num = mw.ustring.match(tostring(k), &amp;#039;^&amp;#039; .. prefix .. &amp;#039;([1-9]%d*)$&amp;#039;)&lt;br /&gt;
		if num then&lt;br /&gt;
			table.insert(nums, tonumber(num))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(nums)&lt;br /&gt;
	return nums&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- локальная обёртка, игнорирует таблицу с номерами дня, месяца и года&lt;br /&gt;
local function formatDate(txtDateIn, strFormat, params)&lt;br /&gt;
	local txtDateOut, date, status = boxDate(txtDateIn, strFormat, params)&lt;br /&gt;
	if status.brk then&lt;br /&gt;
		return error(status.errorText)&lt;br /&gt;
	else&lt;br /&gt;
		return txtDateOut&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Box class definition&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local MessageBox = {}&lt;br /&gt;
MessageBox.__index = MessageBox&lt;br /&gt;
&lt;br /&gt;
function MessageBox.new(boxType, args, cfg)&lt;br /&gt;
	args = args or {}&lt;br /&gt;
	local obj = {}&lt;br /&gt;
&lt;br /&gt;
	-- Set the title object and the namespace.&lt;br /&gt;
	obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
	-- Set the config for our box type.&lt;br /&gt;
	obj.cfg = cfg[boxType]&lt;br /&gt;
	if not obj.cfg then&lt;br /&gt;
		local ns = obj.title.namespace&lt;br /&gt;
		-- boxType is &amp;quot;mbox&amp;quot; or invalid input&lt;br /&gt;
		if ns == 0 then&lt;br /&gt;
			obj.cfg = cfg.ambox -- main namespace&lt;br /&gt;
		elseif ns == 6 then&lt;br /&gt;
			obj.cfg = cfg.imbox -- file namespace&lt;br /&gt;
		elseif ns == 14 then&lt;br /&gt;
			obj.cfg = cfg.cmbox -- category namespace&lt;br /&gt;
		else&lt;br /&gt;
			local nsTable = mw.site.namespaces[ns]&lt;br /&gt;
			if nsTable and nsTable.isTalk then&lt;br /&gt;
				obj.cfg = cfg.tmbox -- any talk namespace&lt;br /&gt;
			else&lt;br /&gt;
				obj.cfg = cfg.ombox -- other namespaces or invalid input&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set the arguments, and remove all blank arguments except for the ones&lt;br /&gt;
	-- listed in cfg.allowBlankParams.&lt;br /&gt;
	do&lt;br /&gt;
		local newArgs = {}&lt;br /&gt;
		for k, v in pairs(args) do&lt;br /&gt;
			if v ~= &amp;#039;&amp;#039; then&lt;br /&gt;
				newArgs[k] = v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		for i, param in ipairs(obj.cfg.allowBlankParams or {}) do&lt;br /&gt;
			newArgs[param] = args[param]&lt;br /&gt;
		end&lt;br /&gt;
		obj.args = newArgs&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Define internal data structure.&lt;br /&gt;
	obj.categories = {}&lt;br /&gt;
	obj.classes = {}&lt;br /&gt;
&lt;br /&gt;
	return setmetatable(obj, MessageBox)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:addCat(ns, cat, sort)&lt;br /&gt;
	if not cat then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if sort then&lt;br /&gt;
		cat = string.format(&amp;#039;[[Категория:%s|%s]]&amp;#039;, cat, sort)&lt;br /&gt;
	else&lt;br /&gt;
		cat = string.format(&amp;#039;[[Категория:%s]]&amp;#039;, cat)&lt;br /&gt;
	end&lt;br /&gt;
	self.categories[ns] = self.categories[ns] or {}&lt;br /&gt;
	table.insert(self.categories[ns], cat)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:addClass(class)&lt;br /&gt;
	if not class then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(self.classes, class)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setParameters()&lt;br /&gt;
	local args = self.args&lt;br /&gt;
	local cfg = self.cfg&lt;br /&gt;
&lt;br /&gt;
	-- Get type data.&lt;br /&gt;
	self.type = args.type&lt;br /&gt;
	local typeData = cfg.types[self.type]&lt;br /&gt;
	self.invalidTypeError = cfg.showInvalidTypeError&lt;br /&gt;
		and self.type&lt;br /&gt;
		and not typeData&lt;br /&gt;
	typeData = typeData or cfg.types[cfg.default]&lt;br /&gt;
	self.typeClass = typeData.class&lt;br /&gt;
	self.typeImage = typeData.image&lt;br /&gt;
&lt;br /&gt;
	-- Find if the box has been wrongly substituted.&lt;br /&gt;
	self.isSubstituted = cfg.substCheck and args.subst == &amp;#039;SUBST&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	-- Find whether we are using a small message box.&lt;br /&gt;
	self.isSmall = cfg.allowSmall and (&lt;br /&gt;
		cfg.smallParam and args.small == cfg.smallParam&lt;br /&gt;
		or not cfg.smallParam and yesno(args.small)&lt;br /&gt;
	)&lt;br /&gt;
&lt;br /&gt;
	-- Add attributes, classes and styles.&lt;br /&gt;
	self.id = args.id&lt;br /&gt;
	if yesno(args.plainlinks) ~= false then&lt;br /&gt;
		self:addClass(&amp;#039;plainlinks&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	if args.mini then&lt;br /&gt;
		self:addClass(&amp;#039;ambox-mini&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	for _, class in ipairs(cfg.classes or {}) do&lt;br /&gt;
		self:addClass(class)&lt;br /&gt;
	end&lt;br /&gt;
	if self.isSmall then&lt;br /&gt;
		self:addClass(cfg.smallClass or &amp;#039;mbox-small&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	self:addClass(self.typeClass)&lt;br /&gt;
	self:addClass(args.class)&lt;br /&gt;
	self.style = args.style&lt;br /&gt;
	self.attrs = args.attrs&lt;br /&gt;
&lt;br /&gt;
	self.dataLabel1 = args[&amp;#039;data-label-1&amp;#039;]&lt;br /&gt;
	self.dataLabel2 = args[&amp;#039;data-label-2&amp;#039;]&lt;br /&gt;
	self.dataLabel3 = args[&amp;#039;data-label-3&amp;#039;]&lt;br /&gt;
	self.dataValue1 = args[&amp;#039;data-value-1&amp;#039;]&lt;br /&gt;
	self.dataValue2 = args[&amp;#039;data-value-2&amp;#039;]&lt;br /&gt;
	self.dataValue3 = args[&amp;#039;data-value-3&amp;#039;]&lt;br /&gt;
	&lt;br /&gt;
	-- Set text style.&lt;br /&gt;
	self.textstyle = args.textstyle&lt;br /&gt;
&lt;br /&gt;
	-- Find if we are on the template page or not. This functionality is only&lt;br /&gt;
	-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory&lt;br /&gt;
	-- and cfg.templateCategoryRequireName are set.&lt;br /&gt;
	self.useCollapsibleTextFields = cfg.useCollapsibleTextFields&lt;br /&gt;
	if self.useCollapsibleTextFields&lt;br /&gt;
		or cfg.templateCategory&lt;br /&gt;
		and cfg.templateCategoryRequireName&lt;br /&gt;
	then&lt;br /&gt;
		self.name = args.name&lt;br /&gt;
		if self.name then&lt;br /&gt;
			local templateName = mw.ustring.match(&lt;br /&gt;
				self.name,&lt;br /&gt;
				&amp;#039;^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$&amp;#039;&lt;br /&gt;
			) or self.name&lt;br /&gt;
			templateName = (&amp;#039;Template:&amp;#039; .. templateName) or (&amp;#039;Шаблон:&amp;#039; .. templateName)&lt;br /&gt;
			self.templateTitle = getTitleObject(templateName)&lt;br /&gt;
		end&lt;br /&gt;
		self.isTemplatePage = self.templateTitle&lt;br /&gt;
			and mw.title.equals(self.title, self.templateTitle)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Process data for collapsible text fields. At the moment these are only&lt;br /&gt;
	-- used in {{ambox}}.&lt;br /&gt;
	if self.useCollapsibleTextFields then&lt;br /&gt;
		-- Get the self.issue value.&lt;br /&gt;
		if self.isSmall and args.smalltext then&lt;br /&gt;
			self.issue = args.smalltext&lt;br /&gt;
		else&lt;br /&gt;
			local sect&lt;br /&gt;
			if args.sect == &amp;#039;&amp;#039; then&lt;br /&gt;
				sect = &amp;#039;&amp;lt;span style=&amp;quot;font-weight:bold&amp;quot;&amp;gt;Эта &amp;#039; .. (cfg.sectionDefault or &amp;#039;статья&amp;#039;) .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
			elseif type(args.sect) == &amp;#039;string&amp;#039; then&lt;br /&gt;
				sect = &amp;#039;&amp;lt;span style=&amp;quot;font-weight:bold&amp;quot;&amp;gt;&amp;#039; .. args.sect .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
			local issue = args.issue&lt;br /&gt;
			issue = type(issue) == &amp;#039;string&amp;#039; and issue ~= &amp;#039;&amp;#039; and issue or nil&lt;br /&gt;
			local text = args.text&lt;br /&gt;
			text = type(text) == &amp;#039;string&amp;#039; and text or nil&lt;br /&gt;
			local issues = {}&lt;br /&gt;
			table.insert(issues, sect)&lt;br /&gt;
			table.insert(issues, issue)&lt;br /&gt;
			table.insert(issues, text)&lt;br /&gt;
			self.issue = table.concat(issues, &amp;#039; &amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- Get the self.talk value.&lt;br /&gt;
		local talk = args.talk&lt;br /&gt;
		-- Show talk links on the template page or template subpages if the talk&lt;br /&gt;
		-- parameter is blank.&lt;br /&gt;
		if talk == &amp;#039;&amp;#039;&lt;br /&gt;
			and self.templateTitle&lt;br /&gt;
			and (&lt;br /&gt;
				mw.title.equals(self.templateTitle, self.title)&lt;br /&gt;
				or self.title:isSubpageOf(self.templateTitle)&lt;br /&gt;
			)&lt;br /&gt;
		then&lt;br /&gt;
			talk = &amp;#039;#&amp;#039;&lt;br /&gt;
		elseif talk == &amp;#039;&amp;#039; then&lt;br /&gt;
			talk = nil&lt;br /&gt;
		end&lt;br /&gt;
		if talk then&lt;br /&gt;
			-- If the talk value is a talk page, make a link to that page. Else&lt;br /&gt;
			-- assume that it&amp;#039;s a section heading, and make a link to the talk&lt;br /&gt;
			-- page of the current page with that section heading.&lt;br /&gt;
			local talkTitle = getTitleObject(talk)&lt;br /&gt;
			local talkArgIsTalkPage = true&lt;br /&gt;
			if not talkTitle or not talkTitle.isTalkPage then&lt;br /&gt;
				talkArgIsTalkPage = false&lt;br /&gt;
				talkTitle = getTitleObject(&lt;br /&gt;
					self.title.text,&lt;br /&gt;
					mw.site.namespaces[self.title.namespace].talk.id&lt;br /&gt;
				)&lt;br /&gt;
			end&lt;br /&gt;
			if talkTitle and talkTitle.exists then&lt;br /&gt;
				local talkText = &amp;#039;Соответствующую дискуссию можно найти на&amp;#039;&lt;br /&gt;
				if talkArgIsTalkPage then&lt;br /&gt;
					talkText = string.format(&lt;br /&gt;
						&amp;#039;%s [[%s|%s]].&amp;#039;,&lt;br /&gt;
						talkText,&lt;br /&gt;
						talk,&lt;br /&gt;
						talkTitle.prefixedText&lt;br /&gt;
					)&lt;br /&gt;
				else&lt;br /&gt;
					talkText = string.format(&lt;br /&gt;
						&amp;#039;%s [[%s#%s|странице обсуждения]].&amp;#039;,&lt;br /&gt;
						talkText,&lt;br /&gt;
						talkTitle.prefixedText,&lt;br /&gt;
						talk&lt;br /&gt;
					)&lt;br /&gt;
				end&lt;br /&gt;
				self.talk = talkText&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- Get other values.&lt;br /&gt;
		self.fix = args.fix ~= &amp;#039;&amp;#039; and args.fix or nil&lt;br /&gt;
		local date&lt;br /&gt;
		if args.date and args.date ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			local status, result = pcall(formatDate, args.date)&lt;br /&gt;
			if status then&lt;br /&gt;
				date = string.format(&amp;quot;(&amp;lt;span class=&amp;#039;date&amp;#039;&amp;gt;%s&amp;lt;/span&amp;gt;)&amp;quot;, result)&lt;br /&gt;
			else &lt;br /&gt;
				date = string.format(&amp;quot;&amp;lt;span class=&amp;#039;error&amp;#039;&amp;gt;(Строка «%s» не является верной датой, пожалуйста, укажите дату в формате &amp;lt;code&amp;gt;ГГГГ-ММ-ДД&amp;lt;/code&amp;gt;)&amp;lt;/span&amp;gt;&amp;quot;, args.date)&lt;br /&gt;
			end &lt;br /&gt;
		elseif args.date == &amp;#039;&amp;#039; and self.isTemplatePage then&lt;br /&gt;
			date = string.format(&amp;quot;(&amp;lt;span class=&amp;#039;date&amp;#039;&amp;gt;%s&amp;lt;/span&amp;gt;)&amp;quot;, formatDate( lang:formatDate(&amp;#039;Y-m-d&amp;#039;) ) ) -- тут возникновения ошибки, связанной с пользовательским вводом, не будет&lt;br /&gt;
		end&lt;br /&gt;
		if date then&lt;br /&gt;
			self.date = string.format(&amp;quot; &amp;lt;span class=&amp;#039;mbox-date&amp;#039;&amp;gt;&amp;#039;&amp;#039;%s&amp;#039;&amp;#039;&amp;lt;/span&amp;gt;&amp;quot;, date)&lt;br /&gt;
		end&lt;br /&gt;
		self.info = args.info&lt;br /&gt;
		if yesno(args.removalnotice) then&lt;br /&gt;
			self.removalNotice = cfg.removalNotice&lt;br /&gt;
		end&lt;br /&gt;
		if args.shortFix then&lt;br /&gt;
			self.shortFix = args.shortFix&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set the non-collapsible text field. At the moment this is used by all box&lt;br /&gt;
	-- types other than ambox, and also by ambox when small=yes.&lt;br /&gt;
	if self.isSmall then&lt;br /&gt;
		self.text = args.smalltext or args.text&lt;br /&gt;
	else&lt;br /&gt;
		self.text = args.text&lt;br /&gt;
		self.textsmall = args[&amp;#039;text-small&amp;#039;]&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set the below row.&lt;br /&gt;
	self.below = cfg.below and args.below&lt;br /&gt;
&lt;br /&gt;
	-- General image settings.&lt;br /&gt;
	self.imageCellDiv = not self.isSmall and cfg.imageCellDiv&lt;br /&gt;
	self.imageEmptyCell = cfg.imageEmptyCell&lt;br /&gt;
	if cfg.imageEmptyCellStyle then&lt;br /&gt;
		self.imageEmptyCellStyle = &amp;#039;border:none;padding:0px;width:1px&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Left image settings.&lt;br /&gt;
	local imageLeft = self.isSmall and args.smallimage or args.image&lt;br /&gt;
	if cfg.imageCheckBlank and imageLeft ~= &amp;#039;blank&amp;#039; and imageLeft ~= &amp;#039;none&amp;#039; and imageLeft ~= &amp;#039;&amp;#039;&lt;br /&gt;
		or not cfg.imageCheckBlank and imageLeft ~= &amp;#039;none&amp;#039;&lt;br /&gt;
	then&lt;br /&gt;
		self.imageLeft = imageLeft&lt;br /&gt;
		if not imageLeft then&lt;br /&gt;
			local imageSize = self.isSmall&lt;br /&gt;
				and (cfg.imageSmallSize or &amp;#039;30x30px&amp;#039;)&lt;br /&gt;
			    or cfg.imageSize&lt;br /&gt;
				or &amp;#039;40x40px&amp;#039;&lt;br /&gt;
			self.imageLeft = string.format(&amp;#039;[[File:%s|%s|alt=]]&amp;#039;, self.typeImage&lt;br /&gt;
				or &amp;#039;Information icon4.svg&amp;#039;, imageSize)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Right image settings.&lt;br /&gt;
	local imageRight = self.isSmall and args.smallimageright or args.imageright&lt;br /&gt;
	if not (cfg.imageRightNone and imageRight == &amp;#039;none&amp;#039;) then&lt;br /&gt;
		self.imageRight = imageRight&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setMainspaceCategories()&lt;br /&gt;
	local args = self.args&lt;br /&gt;
	local cfg = self.cfg&lt;br /&gt;
    local date = nil&lt;br /&gt;
&lt;br /&gt;
	if not cfg.allowMainspaceCategories then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	for _, prefix in ipairs{&amp;#039;cat&amp;#039;, &amp;#039;category&amp;#039;, &amp;#039;all&amp;#039;} do&lt;br /&gt;
		args[prefix .. &amp;#039;1&amp;#039;] = args[prefix]&lt;br /&gt;
		nums = union(nums, getArgNums(args, prefix))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- The following is roughly equivalent to the old {{Ambox/category}}.&lt;br /&gt;
	local status, result = pcall(formatDate, args.date, &amp;#039;xg Y&amp;#039;)&lt;br /&gt;
	if status then&lt;br /&gt;
		date = result&lt;br /&gt;
	end &lt;br /&gt;
	date = type(date) == &amp;#039;string&amp;#039; and date&lt;br /&gt;
	local preposition = &amp;#039;с&amp;#039;&lt;br /&gt;
	local suffix = &amp;#039;года&amp;#039;&lt;br /&gt;
	for _, num in ipairs(nums) do&lt;br /&gt;
		local mainCat = args[&amp;#039;cat&amp;#039; .. tostring(num)]&lt;br /&gt;
			or args[&amp;#039;category&amp;#039; .. tostring(num)]&lt;br /&gt;
		local allCat = args[&amp;#039;all&amp;#039; .. tostring(num)]&lt;br /&gt;
		mainCat = type(mainCat) == &amp;#039;string&amp;#039; and mainCat&lt;br /&gt;
		allCat = type(allCat) == &amp;#039;string&amp;#039; and allCat&lt;br /&gt;
		if mainCat and date and date ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			local catTitle = string.format(&amp;#039;%s %s %s %s&amp;#039;, mainCat, preposition, date, suffix)&lt;br /&gt;
			self:addCat(0, catTitle)&lt;br /&gt;
			catTitle = getTitleObject(&amp;#039;Категория:&amp;#039; .. catTitle)&lt;br /&gt;
			local status, result = pcall(formatDate, args.date)&lt;br /&gt;
			if not status then&lt;br /&gt;
				self:addCat(0, &amp;#039;Википедия:Статьи с недопустимым параметром даты в шаблоне-сообщении&amp;#039;)&lt;br /&gt;
			end &lt;br /&gt;
		elseif mainCat and (not date or date == &amp;#039;&amp;#039;) then&lt;br /&gt;
			self:addCat(0, mainCat)&lt;br /&gt;
		end&lt;br /&gt;
		if allCat then&lt;br /&gt;
			self:addCat(0, allCat)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setTemplateCategories()&lt;br /&gt;
	local args = self.args&lt;br /&gt;
	local cfg = self.cfg&lt;br /&gt;
&lt;br /&gt;
	-- Add template categories.&lt;br /&gt;
	if cfg.templateCategory then&lt;br /&gt;
		if cfg.templateCategoryRequireName then&lt;br /&gt;
			if self.isTemplatePage then&lt;br /&gt;
				self:addCat(10, cfg.templateCategory)&lt;br /&gt;
			end&lt;br /&gt;
		elseif not self.title.isSubpage then&lt;br /&gt;
			self:addCat(10, cfg.templateCategory)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add template error categories.&lt;br /&gt;
	if cfg.templateErrorCategory then&lt;br /&gt;
		local templateErrorCategory = cfg.templateErrorCategory&lt;br /&gt;
		local templateCat, templateSort&lt;br /&gt;
		if not self.name and not self.title.isSubpage then&lt;br /&gt;
			templateCat = templateErrorCategory&lt;br /&gt;
		elseif self.isTemplatePage then&lt;br /&gt;
			local paramsToCheck = cfg.templateErrorParamsToCheck or {}&lt;br /&gt;
			local count = 0&lt;br /&gt;
			for i, param in ipairs(paramsToCheck) do&lt;br /&gt;
				if not args[param] then&lt;br /&gt;
					count = count + 1&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if count &amp;gt; 0 then&lt;br /&gt;
				templateCat = templateErrorCategory&lt;br /&gt;
				templateSort = tostring(count)&lt;br /&gt;
			end&lt;br /&gt;
			if self.categoryNums and #self.categoryNums &amp;gt; 0 then&lt;br /&gt;
				templateCat = templateErrorCategory&lt;br /&gt;
				templateSort = &amp;#039;C&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		self:addCat(10, templateCat, templateSort)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setAllNamespaceCategories()&lt;br /&gt;
	-- Set categories for all namespaces.&lt;br /&gt;
	if self.invalidTypeError then&lt;br /&gt;
		local allSort = (self.title.namespace == 0 and &amp;#039;Main:&amp;#039; or &amp;#039;&amp;#039;) .. self.title.prefixedText&lt;br /&gt;
		self:addCat(&amp;#039;all&amp;#039;, &amp;#039;Википедия:Необходимо исправить параметр в шаблоне-сообщении&amp;#039;, allSort)&lt;br /&gt;
	end&lt;br /&gt;
	if self.isSubstituted then&lt;br /&gt;
		self:addCat(&amp;#039;all&amp;#039;, &amp;#039;Википедия:Страницы с ошибочно подставленными шаблонами&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setCategories()&lt;br /&gt;
	if self.title.namespace == 0 then&lt;br /&gt;
		self:setMainspaceCategories()&lt;br /&gt;
	elseif self.title.namespace == 10 then&lt;br /&gt;
		self:setTemplateCategories()&lt;br /&gt;
	end&lt;br /&gt;
	self:setAllNamespaceCategories()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:renderCategories()&lt;br /&gt;
	-- Convert category tables to strings and pass them through&lt;br /&gt;
	-- [[Module:Category handler]].&lt;br /&gt;
	return categoryHandler{&lt;br /&gt;
		main = table.concat(self.categories[0] or {}),&lt;br /&gt;
		template = table.concat(self.categories[10] or {}),&lt;br /&gt;
		all = table.concat(self.categories.all or {}),&lt;br /&gt;
		nocat = self.args.nocat,&lt;br /&gt;
		page = self.args.page&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:export()&lt;br /&gt;
	local root = mw.html.create()&lt;br /&gt;
&lt;br /&gt;
	-- Add the subst check error.&lt;br /&gt;
	if self.isSubstituted and self.name then&lt;br /&gt;
		root:tag(&amp;#039;b&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;error&amp;#039;)&lt;br /&gt;
			:wikitext(string.format(&lt;br /&gt;
				&amp;#039;Шаблон &amp;lt;code&amp;gt;%s[[Шаблон:%s|%s]]%s&amp;lt;/code&amp;gt; был неккоректно подставлен.&amp;#039;,&lt;br /&gt;
				mw.text.nowiki(&amp;#039;{{&amp;#039;), self.name, self.name, mw.text.nowiki(&amp;#039;}}&amp;#039;)&lt;br /&gt;
			))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Create the box table.&lt;br /&gt;
	local boxTable = root:tag(&amp;#039;table&amp;#039;)&lt;br /&gt;
	boxTable:attr(&amp;#039;id&amp;#039;, self.id or nil)&lt;br /&gt;
	for i, class in ipairs(self.classes or {}) do&lt;br /&gt;
		boxTable:addClass(class or nil)&lt;br /&gt;
	end&lt;br /&gt;
	boxTable&lt;br /&gt;
		:cssText(self.style or nil)&lt;br /&gt;
		:attr(&amp;#039;role&amp;#039;, &amp;#039;presentation&amp;#039;)&lt;br /&gt;
			&lt;br /&gt;
	if self.dataLabel1 then&lt;br /&gt;
		boxTable:attr(&amp;#039;data-&amp;#039; .. self.dataLabel1, self.dataValue1)&lt;br /&gt;
	end&lt;br /&gt;
	if self.dataLabel2 then&lt;br /&gt;
		boxTable:attr(&amp;#039;data-&amp;#039; .. self.dataLabel2, self.dataValue2)&lt;br /&gt;
	end&lt;br /&gt;
	if self.dataLabel3 then&lt;br /&gt;
		boxTable:attr(&amp;#039;data-&amp;#039; .. self.dataLabel3, self.dataValue3)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if self.attrs then&lt;br /&gt;
		boxTable:attr(self.attrs)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add the left-hand image.&lt;br /&gt;
	local row = boxTable:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
	if self.imageLeft then&lt;br /&gt;
		local imageLeftCell = row:tag(&amp;#039;td&amp;#039;):addClass(&amp;#039;mbox-image&amp;#039;)&lt;br /&gt;
		if self.imageCellDiv then&lt;br /&gt;
			-- If we are using a div, redefine imageLeftCell so that the image&lt;br /&gt;
			-- is inside it. Divs use style=&amp;quot;width: 52px;&amp;quot;, which limits the&lt;br /&gt;
			-- image width to 52px. If any images in a div are wider than that,&lt;br /&gt;
			-- they may overlap with the text or cause other display problems.&lt;br /&gt;
			imageLeftCell = imageLeftCell:tag(&amp;#039;div&amp;#039;):css(&amp;#039;width&amp;#039;, &amp;#039;52px&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		imageLeftCell:wikitext(self.imageLeft or nil)&lt;br /&gt;
	elseif self.imageEmptyCell then&lt;br /&gt;
		-- Some message boxes define an empty cell if no image is specified, and&lt;br /&gt;
		-- some don&amp;#039;t. The old template code in templates where empty cells are&lt;br /&gt;
		-- specified gives the following hint: &amp;quot;No image. Cell with some width&lt;br /&gt;
		-- or padding necessary for text cell to have 100% width.&amp;quot;&lt;br /&gt;
		row:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;mbox-empty-cell&amp;#039;)&lt;br /&gt;
			:cssText(self.imageEmptyCellStyle or nil)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add the text.&lt;br /&gt;
	local textCell = row:tag(&amp;#039;td&amp;#039;):addClass(&amp;#039;mbox-text&amp;#039;)&lt;br /&gt;
	if self.useCollapsibleTextFields then&lt;br /&gt;
		-- The message box uses advanced text parameters that allow things to be&lt;br /&gt;
		-- collapsible. At the moment, only ambox uses this.&lt;br /&gt;
		textCell:cssText(self.textstyle or nil)&lt;br /&gt;
		local textCellDiv = textCell:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
		textCellDiv&lt;br /&gt;
			:addClass(&amp;#039;mbox-text-div&amp;#039;)&lt;br /&gt;
			:wikitext(self.issue or nil)&lt;br /&gt;
		local textsmallCellDiv = textCell:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
		textsmallCellDiv&lt;br /&gt;
			:addClass(&amp;#039;mbox-textsmall-div hide-when-compact&amp;#039;)&lt;br /&gt;
			:cssText(self.textsmallstyle or &amp;#039;font-size:85%&amp;#039;)&lt;br /&gt;
			:wikitext(self.textsmall or nil)	&lt;br /&gt;
		if (self.talk or self.fix) and not self.isSmall then&lt;br /&gt;
			textsmallCellDiv:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;hide-when-compact&amp;#039;)&lt;br /&gt;
				:wikitext(self.talk and (&amp;#039; &amp;#039; .. self.talk) or nil)&lt;br /&gt;
				:wikitext(self.fix and (&amp;#039; &amp;#039; .. self.fix) or nil)&lt;br /&gt;
		end&lt;br /&gt;
		textsmallCellDiv:wikitext(self.date and (&amp;#039; &amp;#039; .. self.date) or nil)&lt;br /&gt;
		if self.info and not self.isSmall then&lt;br /&gt;
			textsmallCellDiv&lt;br /&gt;
				:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;hide-when-compact&amp;#039;)&lt;br /&gt;
				:wikitext(self.info and (&amp;#039; &amp;#039; .. self.info) or nil)&lt;br /&gt;
		end&lt;br /&gt;
		if self.removalNotice then&lt;br /&gt;
			textsmallCellDiv:tag(&amp;#039;small&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;hide-when-compact&amp;#039;)&lt;br /&gt;
				:tag(&amp;#039;i&amp;#039;)&lt;br /&gt;
					:wikitext(string.format(&amp;quot; (%s)&amp;quot;, self.removalNotice))&lt;br /&gt;
		end&lt;br /&gt;
		if self.shortFix then&lt;br /&gt;
			textCell:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;mbox-multiply&amp;#039;)&lt;br /&gt;
					:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
						:wikitext(string.format(&amp;quot;%s&amp;quot;, self.shortFix))&lt;br /&gt;
					:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
						:wikitext(self.date and (&amp;#039; &amp;#039; .. self.date) or nil)&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		-- Default text formatting - anything goes.&lt;br /&gt;
		textCell&lt;br /&gt;
			:cssText(self.textstyle or nil)&lt;br /&gt;
			:wikitext(self.text or nil)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add the right-hand image.&lt;br /&gt;
	if self.imageRight then&lt;br /&gt;
		local imageRightCell = row:tag(&amp;#039;td&amp;#039;):addClass(&amp;#039;mbox-imageright&amp;#039;)&lt;br /&gt;
		if self.imageCellDiv then&lt;br /&gt;
			-- If we are using a div, redefine imageRightCell so that the image&lt;br /&gt;
			-- is inside it.&lt;br /&gt;
			imageRightCell = imageRightCell:tag(&amp;#039;div&amp;#039;):css(&amp;#039;width&amp;#039;, &amp;#039;52px&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		imageRightCell&lt;br /&gt;
			:wikitext(self.imageRight or nil)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add the below row.&lt;br /&gt;
	if self.below then&lt;br /&gt;
		boxTable:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
				:attr(&amp;#039;colspan&amp;#039;, self.imageRight and &amp;#039;3&amp;#039; or &amp;#039;2&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;mbox-text&amp;#039;)&lt;br /&gt;
				:cssText(self.textstyle or nil)&lt;br /&gt;
				:wikitext(self.below or nil)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add error message for invalid type parameters.&lt;br /&gt;
	if self.invalidTypeError then&lt;br /&gt;
		root:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
			:css(&amp;#039;text-align&amp;#039;, &amp;#039;center&amp;#039;)&lt;br /&gt;
			:wikitext(string.format(&lt;br /&gt;
				&amp;#039;Этот шаблон-сообщение использует неверный параметр &amp;quot;type=%s&amp;quot;, необходимо исправить.&amp;#039;,&lt;br /&gt;
				self.type or &amp;#039;&amp;#039;&lt;br /&gt;
			))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add categories.&lt;br /&gt;
	root:wikitext(self:renderCategories() or nil)&lt;br /&gt;
&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Exports&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local p, mt = {}, {}&lt;br /&gt;
&lt;br /&gt;
function p._exportClasses()&lt;br /&gt;
	-- For testing.&lt;br /&gt;
	return {&lt;br /&gt;
		MessageBox = MessageBox&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(boxType, args, cfgTables)&lt;br /&gt;
	local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))&lt;br /&gt;
	box:setParameters()&lt;br /&gt;
	box:setCategories()&lt;br /&gt;
	return box:export()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function mt.__index(t, k)&lt;br /&gt;
	return function (frame)&lt;br /&gt;
		if not getArgs then&lt;br /&gt;
			getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
		end&lt;br /&gt;
		return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return setmetatable(p, mt)&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Infobox&amp;diff=259</id>
		<title>Модуль:Infobox</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Infobox&amp;diff=259"/>
		<updated>2022-03-06T16:36:22Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {};&lt;br /&gt;
&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local function _renderLine( frame, args, i )&lt;br /&gt;
	if args[ &amp;#039;заголовок&amp;#039; .. i ] and args[ &amp;#039;заголовок&amp;#039; .. i ] == &amp;#039;-&amp;#039; then&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	elseif args[ &amp;#039;заголовок&amp;#039; .. i ] and args[ &amp;#039;заголовок&amp;#039; .. i ] ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		local style = ( args[ &amp;#039;стиль_заголовков&amp;#039; ] or &amp;#039;&amp;#039; ) .. ( args[ &amp;#039;стиль_заголовка&amp;#039; .. i ] or &amp;#039;&amp;#039; );&lt;br /&gt;
		local class = ( args[ &amp;#039;класс&amp;#039; .. i ] or &amp;#039;&amp;#039; );&lt;br /&gt;
		return &amp;#039;\n&amp;lt;tr&amp;gt;\n&amp;lt;th colspan=&amp;quot;2&amp;quot; scope=&amp;quot;colgroup&amp;quot; class=&amp;quot;infobox-header &amp;#039; .. class .. &amp;#039;&amp;quot; style=&amp;quot;&amp;#039; .. style .. &amp;#039;&amp;quot;&amp;gt;&amp;#039; ..&lt;br /&gt;
			args[ &amp;#039;заголовок&amp;#039; .. i ] ..&lt;br /&gt;
			&amp;#039;&amp;lt;/th&amp;gt;\n&amp;lt;/tr&amp;gt;&amp;#039;;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if args[ &amp;#039;блок&amp;#039; .. i ] and args[ &amp;#039;блок&amp;#039; .. i ] ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		return args[ &amp;#039;блок&amp;#039; .. i ];&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local text = args[ &amp;#039;текст&amp;#039; .. i ] or &amp;#039;&amp;#039;;&lt;br /&gt;
	if args[ &amp;#039;викиданные&amp;#039; .. i ] and args[ &amp;#039;викиданные&amp;#039; .. i ] ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		text = frame:expandTemplate{ title = &amp;#039;Wikidata&amp;#039;, args = {&lt;br /&gt;
			args[ &amp;#039;викиданные&amp;#039; .. i ],&lt;br /&gt;
			text,&lt;br /&gt;
			from = args[ &amp;#039;from&amp;#039; ] or &amp;#039;&amp;#039;&lt;br /&gt;
		} };&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
    if text ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		local label = args[ &amp;#039;метка&amp;#039; .. i ] or &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    	local class = args[ &amp;#039;класс&amp;#039; .. i ] or &amp;#039;&amp;#039;;&lt;br /&gt;
    	if string.find(class, &amp;#039;noplainlist&amp;#039;) == nil and string.find(class, &amp;#039;nofirstlevel&amp;#039;) == nil then&lt;br /&gt;
    		class = class .. &amp;#039; plainlist&amp;#039;;&lt;br /&gt;
    	end&lt;br /&gt;
    	if class ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			class = &amp;#039; class=&amp;quot;&amp;#039; .. class .. &amp;#039;&amp;quot;&amp;#039;;&lt;br /&gt;
    	end&lt;br /&gt;
&lt;br /&gt;
    	local style = ( args[ &amp;#039;стиль_текстов&amp;#039; ] or &amp;#039;&amp;#039; ) .. ( args[ &amp;#039;стиль_текста&amp;#039; ] or &amp;#039;&amp;#039; ) .. ( args[ &amp;#039;стиль_текста&amp;#039; .. i ] or &amp;#039;&amp;#039; );&lt;br /&gt;
		if label == &amp;#039;&amp;#039; then&lt;br /&gt;
			style = &amp;#039;text-align:center;&amp;#039; .. style;&lt;br /&gt;
		end&lt;br /&gt;
    	if style ~= &amp;#039;&amp;#039; then&lt;br /&gt;
    		style = &amp;#039; style=&amp;quot;&amp;#039; .. style .. &amp;#039;&amp;quot;&amp;#039;;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if label ~= &amp;#039;&amp;#039; then&lt;br /&gt;
	    	local labelClass = args[ &amp;#039;класс_меток&amp;#039; ] or &amp;#039;&amp;#039;;&lt;br /&gt;
	    	if string.find(labelClass, &amp;#039;noplainlist&amp;#039;) == nil and string.find(labelClass, &amp;#039;nofirstlevel&amp;#039;) == nil then&lt;br /&gt;
    			labelClass = labelClass .. &amp;#039; plainlist&amp;#039;;&lt;br /&gt;
			end&lt;br /&gt;
	    	if labelClass ~= &amp;#039;&amp;#039; then&lt;br /&gt;
	    		labelClass = &amp;#039; class=&amp;quot;&amp;#039; .. labelClass .. &amp;#039;&amp;quot;&amp;#039;;&lt;br /&gt;
			end&lt;br /&gt;
	&lt;br /&gt;
	    	local labelStyle = ( args[ &amp;#039;стиль_меток&amp;#039; ] or &amp;#039;&amp;#039; ) .. ( args[ &amp;#039;стиль_метки&amp;#039; .. i ] or &amp;#039;&amp;#039; );&lt;br /&gt;
	    	if labelStyle ~= &amp;#039;&amp;#039; then&lt;br /&gt;
	    		labelStyle = &amp;#039; style=&amp;quot;&amp;#039; .. labelStyle .. &amp;#039;&amp;quot;&amp;#039;;&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			return &amp;#039;\n&amp;lt;tr&amp;gt;\n&amp;lt;th scope=&amp;quot;row&amp;quot;&amp;#039; .. labelClass .. labelStyle .. &amp;#039;&amp;gt;&amp;#039; .. label .. &amp;#039;&amp;lt;/th&amp;gt;&amp;#039; ..&lt;br /&gt;
	    		&amp;#039;\n&amp;lt;td&amp;#039; .. class .. style .. &amp;#039;&amp;gt;\n&amp;#039; .. text .. &amp;#039;&amp;lt;/td&amp;gt;\n&amp;lt;/tr&amp;gt;&amp;#039;;&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
	    return &amp;#039;\n&amp;lt;tr&amp;gt;\n&amp;lt;td colspan=&amp;quot;2&amp;quot;&amp;#039; .. class .. style .. &amp;#039;&amp;gt;\n&amp;#039; .. text .. &amp;#039;&amp;lt;/td&amp;gt;\n&amp;lt;/tr&amp;gt;&amp;#039;;&lt;br /&gt;
	end	    &lt;br /&gt;
    &lt;br /&gt;
	return &amp;#039;&amp;#039;;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function maxNumber ( args )&lt;br /&gt;
	local maxNumber = 0&lt;br /&gt;
	for argName, _ in pairs(args) do&lt;br /&gt;
		local argNumber = mw.ustring.match(argName, &amp;#039;^[^0-9]+([0-9]+)$&amp;#039;)&lt;br /&gt;
		if argNumber and tonumber(argNumber) &amp;gt; maxNumber then&lt;br /&gt;
			maxNumber = tonumber(argNumber)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return maxNumber&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.renderLine( frame )&lt;br /&gt;
	local args = frame:getParent().args;&lt;br /&gt;
	return _renderLine(frame, args, &amp;#039;&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.renderLines( frame )&lt;br /&gt;
	local args = frame:getParent().args;&lt;br /&gt;
	&lt;br /&gt;
	local res = &amp;#039;&amp;#039;&lt;br /&gt;
	local header, text = &amp;#039;&amp;#039;, &amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	local autoHeaders = yesno(args [ &amp;#039;автозаголовки&amp;#039; ] or &amp;#039;false&amp;#039;, false)&lt;br /&gt;
	&lt;br /&gt;
	for i = 1, maxNumber(args) do&lt;br /&gt;
		if args[ &amp;#039;заголовок&amp;#039; .. i ] and args[ &amp;#039;заголовок&amp;#039; .. i ] ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			if text ~= &amp;#039;&amp;#039; or not autoHeaders then&lt;br /&gt;
				res = res .. header .. text&lt;br /&gt;
			end&lt;br /&gt;
			header, text = _renderLine(frame, args, i), &amp;#039;&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			text = text .. _renderLine(frame, args, i)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if text ~= &amp;#039;&amp;#039; or not autoHeaders then&lt;br /&gt;
		res = res .. header .. text&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p;&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Category_handler/shared&amp;diff=257</id>
		<title>Модуль:Category handler/shared</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Category_handler/shared&amp;diff=257"/>
		<updated>2022-03-06T16:36:21Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module contains shared functions used by [[Module:Category handler]]&lt;br /&gt;
-- and its submodules.&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.matchesBlacklist(page, blacklist)&lt;br /&gt;
	for i, pattern in ipairs(blacklist) do&lt;br /&gt;
		local match = mw.ustring.match(page, pattern)&lt;br /&gt;
		if match then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getParamMappings(useLoadData)&lt;br /&gt;
	local dataPage = &amp;#039;Module:Namespace detect/data&amp;#039;&lt;br /&gt;
	if useLoadData then&lt;br /&gt;
		return mw.loadData(dataPage).mappings&lt;br /&gt;
	else&lt;br /&gt;
		return require(dataPage).mappings&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getNamespaceParameters(titleObj, mappings)&lt;br /&gt;
	-- We don&amp;#039;t use title.nsText for the namespace name because it adds&lt;br /&gt;
	-- underscores.&lt;br /&gt;
	local mappingsKey&lt;br /&gt;
	if titleObj.isTalkPage then&lt;br /&gt;
		mappingsKey = &amp;#039;talk&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		mappingsKey = mw.site.namespaces[titleObj.namespace].name&lt;br /&gt;
	end&lt;br /&gt;
	mappingsKey = mw.ustring.lower(mappingsKey)&lt;br /&gt;
	return mappings[mappingsKey] or {}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Category_handler/data&amp;diff=255</id>
		<title>Модуль:Category handler/data</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Category_handler/data&amp;diff=255"/>
		<updated>2022-03-06T16:36:21Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module assembles data to be passed to [[Module:Category handler]] using&lt;br /&gt;
-- mw.loadData. This includes the configuration data and whether the current&lt;br /&gt;
-- page matches the title blacklist.&lt;br /&gt;
&lt;br /&gt;
local data = require(&amp;#039;Module:Category handler/config&amp;#039;)&lt;br /&gt;
local mShared = require(&amp;#039;Module:Category handler/shared&amp;#039;)&lt;br /&gt;
local blacklist = require(&amp;#039;Module:Category handler/blacklist&amp;#039;)&lt;br /&gt;
local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
data.currentTitleMatchesBlacklist = mShared.matchesBlacklist(&lt;br /&gt;
	title.prefixedText,&lt;br /&gt;
	blacklist&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
data.currentTitleNamespaceParameters = mShared.getNamespaceParameters(&lt;br /&gt;
	title,&lt;br /&gt;
	mShared.getParamMappings()&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
return data&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Category_handler/config&amp;diff=253</id>
		<title>Модуль:Category handler/config</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Category_handler/config&amp;diff=253"/>
		<updated>2022-03-06T16:36:20Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--------------------------------------------------------------------------------&lt;br /&gt;
--            [[Module:Category handler]] configuration data                  --&lt;br /&gt;
--       Language-specific parameter names and values can be set here.        --&lt;br /&gt;
--       For blacklist config, see [[Module:Category handler/blacklist]].     --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local cfg = {} -- Don&amp;#039;t edit this line.&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                       Start configuration data                             --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                              Parameter names                               --&lt;br /&gt;
-- These configuration items specify custom parameter names.                  --&lt;br /&gt;
-- To add one extra name, you can use this format:                            --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- foo = &amp;#039;parameter name&amp;#039;,                                                    --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- To add multiple names, you can use this format:                            --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- foo = {&amp;#039;parameter name 1&amp;#039;, &amp;#039;parameter name 2&amp;#039;, &amp;#039;parameter name 3&amp;#039;},        --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cfg.parameters = {&lt;br /&gt;
	&lt;br /&gt;
	-- The nocat and categories parameter suppress&lt;br /&gt;
	-- categorisation. They are used with Module:Yesno, and work as follows:&lt;br /&gt;
	--&lt;br /&gt;
	-- cfg.nocat:&lt;br /&gt;
	-- Result of yesno()                        Effect&lt;br /&gt;
	-- true                                     Categorisation is suppressed&lt;br /&gt;
	-- false                                    Categorisation is allowed, and&lt;br /&gt;
	--                                          the blacklist check is skipped&lt;br /&gt;
	-- nil                                      Categorisation is allowed&lt;br /&gt;
	--&lt;br /&gt;
	-- cfg.categories:&lt;br /&gt;
	-- Result of yesno()                        Effect&lt;br /&gt;
	-- true                                     Categorisation is allowed, and&lt;br /&gt;
	--                                          the blacklist check is skipped&lt;br /&gt;
	-- false                                    Categorisation is suppressed&lt;br /&gt;
	-- nil                                      Categorisation is allowed&lt;br /&gt;
	nocat = &amp;#039;nocat&amp;#039;,&lt;br /&gt;
	categories = &amp;#039;categories&amp;#039;,&lt;br /&gt;
	&lt;br /&gt;
	-- The parameter name for the legacy &amp;quot;category2&amp;quot; parameter. This skips the&lt;br /&gt;
	-- blacklist if set to the cfg.category2Yes value, and suppresses&lt;br /&gt;
	-- categorisation if present but equal to anything other than&lt;br /&gt;
	-- cfg.category2Yes or cfg.category2Negative.&lt;br /&gt;
	category2 = &amp;#039;category2&amp;#039;,&lt;br /&gt;
	&lt;br /&gt;
	-- cfg.subpage is the parameter name to specify how to behave on subpages.&lt;br /&gt;
	subpage = &amp;#039;subpage&amp;#039;,&lt;br /&gt;
	&lt;br /&gt;
	-- The parameter for data to return in all namespaces.&lt;br /&gt;
	all = &amp;#039;all&amp;#039;,&lt;br /&gt;
	&lt;br /&gt;
	-- The parameter name for data to return if no data is specified for the&lt;br /&gt;
	-- namespace that is detected.&lt;br /&gt;
	other = &amp;#039;other&amp;#039;,&lt;br /&gt;
	&lt;br /&gt;
	-- The parameter name used to specify a page other than the current page;&lt;br /&gt;
	-- used for testing and demonstration.&lt;br /&gt;
	demopage = &amp;#039;page&amp;#039;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                              Parameter values                              --&lt;br /&gt;
-- These are set values that can be used with certain parameters. Only one    --&lt;br /&gt;
-- value can be specified, like this:                                         --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- cfg.foo = &amp;#039;value name&amp;#039;                                                     --                                               --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- The following settings are used with the cfg.category2 parameter. Setting&lt;br /&gt;
-- cfg.category2 to cfg.category2Yes skips the blacklist, and if cfg.category2&lt;br /&gt;
-- is present but equal to anything other than cfg.category2Yes or&lt;br /&gt;
-- cfg.category2Negative then it supresses cateogrisation.&lt;br /&gt;
cfg.category2Yes = &amp;#039;yes&amp;#039;&lt;br /&gt;
cfg.category2Negative = &amp;#039;¬&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- The following settings are used with the cfg.subpage parameter.&lt;br /&gt;
-- cfg.subpageNo is the value to specify to not categorise on subpages;&lt;br /&gt;
-- cfg.subpageOnly is the value to specify to only categorise on subpages.&lt;br /&gt;
cfg.subpageNo = &amp;#039;no&amp;#039;&lt;br /&gt;
cfg.subpageOnly = &amp;#039;only&amp;#039;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                           Default namespaces                               --&lt;br /&gt;
-- This is a table of namespaces to categorise by default. The keys are the   --&lt;br /&gt;
-- namespace numbers.                                                         --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cfg.defaultNamespaces = {&lt;br /&gt;
	[  0] = true, -- main&lt;br /&gt;
	[  6] = true, -- file&lt;br /&gt;
	[ 12] = true, -- help&lt;br /&gt;
	[ 14] = true, -- category&lt;br /&gt;
	[100] = true, -- portal&lt;br /&gt;
	[108] = true, -- book&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                                Wrappers                                    --&lt;br /&gt;
-- This is a wrapper template or a list of wrapper templates to be passed to  --&lt;br /&gt;
-- [[Module:Arguments]].                                                      --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
cfg.wrappers = &amp;#039;Template:Category handler&amp;#039;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
--                           End configuration data                           --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
return cfg -- Don&amp;#039;t edit this line.&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Category_handler/blacklist&amp;diff=251</id>
		<title>Модуль:Category handler/blacklist</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Category_handler/blacklist&amp;diff=251"/>
		<updated>2022-03-06T16:36:20Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module contains the blacklist used by [[Module:Category handler]].&lt;br /&gt;
-- Pages that match Lua patterns in this list will not be categorised unless&lt;br /&gt;
-- categorisation is explicitly requested.&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
    &amp;#039;^Main Page$&amp;#039;, -- don&amp;#039;t categorise the main page.&lt;br /&gt;
 &lt;br /&gt;
    -- Don&amp;#039;t categorise the following pages or their subpages.&lt;br /&gt;
    -- &amp;quot;%f[/\0]&amp;quot; matches if the next character is &amp;quot;/&amp;quot; or the end of the string.&lt;br /&gt;
    &amp;#039;^Wikipedia:Cascade%-protected items%f[/\0]&amp;#039;,&lt;br /&gt;
    &amp;#039;^User:UBX%f[/\0]&amp;#039;, -- The userbox &amp;quot;template&amp;quot; space.&lt;br /&gt;
    &amp;#039;^User talk:UBX%f[/\0]&amp;#039;,&lt;br /&gt;
 &lt;br /&gt;
    -- Don&amp;#039;t categorise subpages of these pages, but allow&lt;br /&gt;
    -- categorisation of the base page.&lt;br /&gt;
    &amp;#039;^Wikipedia:Template messages/.*$&amp;#039;,&lt;br /&gt;
 &lt;br /&gt;
    &amp;#039;/[aA]rchive&amp;#039; -- Don&amp;#039;t categorise archives.&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Category_handler&amp;diff=249</id>
		<title>Модуль:Category handler</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Category_handler&amp;diff=249"/>
		<updated>2022-03-06T16:36:20Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--------------------------------------------------------------------------------&lt;br /&gt;
--                                                                            --&lt;br /&gt;
--                              CATEGORY HANDLER                              --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
--      This module implements the {{category handler}} template in Lua,      --&lt;br /&gt;
--      with a few improvements: all namespaces and all namespace aliases     --&lt;br /&gt;
--      are supported, and namespace names are detected automatically for     --&lt;br /&gt;
--      the local wiki. This module requires [[Module:Namespace detect]]      --&lt;br /&gt;
--      and [[Module:Yesno]] to be available on the local wiki. It can be     --&lt;br /&gt;
--      configured for different wikis by altering the values in              --&lt;br /&gt;
--      [[Module:Category handler/config]], and pages can be blacklisted      --&lt;br /&gt;
--      from categorisation by using [[Module:Category handler/blacklist]].   --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Load required modules&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
-- Lazily load things we don&amp;#039;t always need&lt;br /&gt;
local mShared, mappings&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Helper functions&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function trimWhitespace(s, removeBlanks)&lt;br /&gt;
	if type(s) ~= &amp;#039;string&amp;#039; then&lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
	s = s:match(&amp;#039;^%s*(.-)%s*$&amp;#039;)&lt;br /&gt;
	if removeBlanks then&lt;br /&gt;
		if s ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			return s&lt;br /&gt;
		else&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- CategoryHandler class&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local CategoryHandler = {}&lt;br /&gt;
CategoryHandler.__index = CategoryHandler&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler.new(data, args)&lt;br /&gt;
	local obj = setmetatable({ _data = data, _args = args }, CategoryHandler)&lt;br /&gt;
	&lt;br /&gt;
	-- Set the title object&lt;br /&gt;
	do&lt;br /&gt;
		local pagename = obj:parameter(&amp;#039;demopage&amp;#039;)&lt;br /&gt;
		local success, titleObj&lt;br /&gt;
		if pagename then&lt;br /&gt;
			success, titleObj = pcall(mw.title.new, pagename)&lt;br /&gt;
		end&lt;br /&gt;
		if success and titleObj then&lt;br /&gt;
			obj.title = titleObj&lt;br /&gt;
			if titleObj == mw.title.getCurrentTitle() then&lt;br /&gt;
				obj._usesCurrentTitle = true&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			obj.title = mw.title.getCurrentTitle()&lt;br /&gt;
			obj._usesCurrentTitle = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set suppression parameter values&lt;br /&gt;
	for _, key in ipairs{&amp;#039;nocat&amp;#039;, &amp;#039;categories&amp;#039;} do&lt;br /&gt;
		local value = obj:parameter(key)&lt;br /&gt;
		value = trimWhitespace(value, true)&lt;br /&gt;
		obj[&amp;#039;_&amp;#039; .. key] = yesno(value)&lt;br /&gt;
	end&lt;br /&gt;
	do&lt;br /&gt;
		local subpage = obj:parameter(&amp;#039;subpage&amp;#039;)&lt;br /&gt;
		local category2 = obj:parameter(&amp;#039;category2&amp;#039;)&lt;br /&gt;
		if type(subpage) == &amp;#039;string&amp;#039; then&lt;br /&gt;
			subpage = mw.ustring.lower(subpage)&lt;br /&gt;
		end&lt;br /&gt;
		if type(category2) == &amp;#039;string&amp;#039; then&lt;br /&gt;
			subpage = mw.ustring.lower(category2)&lt;br /&gt;
		end&lt;br /&gt;
		obj._subpage = trimWhitespace(subpage, true)&lt;br /&gt;
		obj._category2 = trimWhitespace(category2) -- don&amp;#039;t remove blank values&lt;br /&gt;
	end&lt;br /&gt;
	return obj&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:parameter(key)&lt;br /&gt;
	local parameterNames = self._data.parameters[key]&lt;br /&gt;
	local pntype = type(parameterNames)&lt;br /&gt;
	if pntype == &amp;#039;string&amp;#039; or pntype == &amp;#039;number&amp;#039; then&lt;br /&gt;
		return self._args[parameterNames]&lt;br /&gt;
	elseif pntype == &amp;#039;table&amp;#039; then&lt;br /&gt;
		for _, name in ipairs(parameterNames) do&lt;br /&gt;
			local value = self._args[name]&lt;br /&gt;
			if value ~= nil then&lt;br /&gt;
				return value&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return nil&lt;br /&gt;
	else&lt;br /&gt;
		error(string.format(&lt;br /&gt;
			&amp;#039;invalid config key &amp;quot;%s&amp;quot;&amp;#039;,&lt;br /&gt;
			tostring(key)&lt;br /&gt;
		), 2)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:isSuppressedByArguments()&lt;br /&gt;
	return&lt;br /&gt;
		-- See if a category suppression argument has been set.&lt;br /&gt;
		self._nocat == true&lt;br /&gt;
		or self._categories == false&lt;br /&gt;
		or (&lt;br /&gt;
			self._category2&lt;br /&gt;
			and self._category2 ~= self._data.category2Yes&lt;br /&gt;
			and self._category2 ~= self._data.category2Negative&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
		-- Check whether we are on a subpage, and see if categories are&lt;br /&gt;
		-- suppressed based on our subpage status.&lt;br /&gt;
		or self._subpage == self._data.subpageNo and self.title.isSubpage&lt;br /&gt;
		or self._subpage == self._data.subpageOnly and not self.title.isSubpage&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:shouldSkipBlacklistCheck()&lt;br /&gt;
	-- Check whether the category suppression arguments indicate we&lt;br /&gt;
	-- should skip the blacklist check.&lt;br /&gt;
	return self._nocat == false&lt;br /&gt;
		or self._categories == true&lt;br /&gt;
		or self._category2 == self._data.category2Yes&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:matchesBlacklist()&lt;br /&gt;
	if self._usesCurrentTitle then&lt;br /&gt;
		return self._data.currentTitleMatchesBlacklist&lt;br /&gt;
	else&lt;br /&gt;
		mShared = mShared or require(&amp;#039;Module:Category handler/shared&amp;#039;)&lt;br /&gt;
		return mShared.matchesBlacklist(&lt;br /&gt;
			self.title.prefixedText,&lt;br /&gt;
			mw.loadData(&amp;#039;Module:Category handler/blacklist&amp;#039;)&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:isSuppressed()&lt;br /&gt;
	-- Find if categories are suppressed by either the arguments or by&lt;br /&gt;
	-- matching the blacklist.&lt;br /&gt;
	return self:isSuppressedByArguments()&lt;br /&gt;
		or not self:shouldSkipBlacklistCheck() and self:matchesBlacklist()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:getNamespaceParameters()&lt;br /&gt;
	if self._usesCurrentTitle then&lt;br /&gt;
		return self._data.currentTitleNamespaceParameters&lt;br /&gt;
	else&lt;br /&gt;
		if not mappings then&lt;br /&gt;
			mShared = mShared or require(&amp;#039;Module:Category handler/shared&amp;#039;)&lt;br /&gt;
			mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData&lt;br /&gt;
		end&lt;br /&gt;
		return mShared.getNamespaceParameters(&lt;br /&gt;
			self.title,&lt;br /&gt;
			mappings&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:namespaceParametersExist()&lt;br /&gt;
	-- Find whether any namespace parameters have been specified.&lt;br /&gt;
	-- We use the order &amp;quot;all&amp;quot; --&amp;gt; namespace params --&amp;gt; &amp;quot;other&amp;quot; as this is what&lt;br /&gt;
	-- the old template did.&lt;br /&gt;
	if self:parameter(&amp;#039;all&amp;#039;) then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	if not mappings then&lt;br /&gt;
		mShared = mShared or require(&amp;#039;Module:Category handler/shared&amp;#039;)&lt;br /&gt;
		mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData&lt;br /&gt;
	end&lt;br /&gt;
	for ns, params in pairs(mappings) do&lt;br /&gt;
		for i, param in ipairs(params) do&lt;br /&gt;
			if self._args[param] then&lt;br /&gt;
				return true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if self:parameter(&amp;#039;other&amp;#039;) then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:getCategories()&lt;br /&gt;
	local params = self:getNamespaceParameters()&lt;br /&gt;
	local nsCategory&lt;br /&gt;
	for i, param in ipairs(params) do&lt;br /&gt;
		local value = self._args[param]&lt;br /&gt;
		if value ~= nil then&lt;br /&gt;
			nsCategory = value&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if nsCategory ~= nil or self:namespaceParametersExist() then&lt;br /&gt;
		-- Namespace parameters exist - advanced usage.&lt;br /&gt;
		if nsCategory == nil then&lt;br /&gt;
			nsCategory = self:parameter(&amp;#039;other&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		local ret = {self:parameter(&amp;#039;all&amp;#039;)}&lt;br /&gt;
		local numParam = tonumber(nsCategory)&lt;br /&gt;
		if numParam and numParam &amp;gt;= 1 and math.floor(numParam) == numParam then&lt;br /&gt;
			-- nsCategory is an integer&lt;br /&gt;
			ret[#ret + 1] = self._args[numParam]&lt;br /&gt;
		else&lt;br /&gt;
			ret[#ret + 1] = nsCategory&lt;br /&gt;
		end&lt;br /&gt;
		if #ret &amp;lt; 1 then&lt;br /&gt;
			return nil&lt;br /&gt;
		else&lt;br /&gt;
			return table.concat(ret)&lt;br /&gt;
		end&lt;br /&gt;
	elseif self._data.defaultNamespaces[self.title.namespace] then&lt;br /&gt;
		-- Namespace parameters don&amp;#039;t exist, simple usage.&lt;br /&gt;
		return self._args[1]&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Exports&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p._exportClasses()&lt;br /&gt;
	-- Used for testing purposes.&lt;br /&gt;
	return {&lt;br /&gt;
		CategoryHandler = CategoryHandler&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args, data)&lt;br /&gt;
	data = data or mw.loadData(&amp;#039;Module:Category handler/data&amp;#039;)&lt;br /&gt;
	local handler = CategoryHandler.new(data, args)&lt;br /&gt;
	if handler:isSuppressed() then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	return handler:getCategories()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame, data)&lt;br /&gt;
	data = data or mw.loadData(&amp;#039;Module:Category handler/data&amp;#039;)&lt;br /&gt;
	local args = require(&amp;#039;Module:Arguments&amp;#039;).getArgs(frame, {&lt;br /&gt;
		wrappers = data.wrappers,&lt;br /&gt;
		valueFunc = function (k, v)&lt;br /&gt;
			v = trimWhitespace(v)&lt;br /&gt;
			if type(k) == &amp;#039;number&amp;#039; then&lt;br /&gt;
				if v ~= &amp;#039;&amp;#039; then&lt;br /&gt;
					return v&lt;br /&gt;
				else&lt;br /&gt;
					return nil&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				return v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	})&lt;br /&gt;
	return p._main(args, data)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Calendar&amp;diff=247</id>
		<title>Модуль:Calendar</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Calendar&amp;diff=247"/>
		<updated>2022-03-06T16:36:19Z</updated>

		<summary type="html">&lt;p&gt;WerySkok: 1 версия импортирована&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
-- Необходимые модули и переменные&lt;br /&gt;
local getArgs = require(&amp;#039;Module:Arguments&amp;#039;).getArgs&lt;br /&gt;
local yesno = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
local mwlang = mw.getContentLanguage()&lt;br /&gt;
local err = &amp;quot;―&amp;quot; -- NthDay nil result&lt;br /&gt;
local tCon = table.concat&lt;br /&gt;
&lt;br /&gt;
-- 00) Блок многократно используемых списков&lt;br /&gt;
local bool_to_number={ [true]=1, [false]=0 }&lt;br /&gt;
local monthlang = {&amp;quot;января&amp;quot;,&amp;quot;февраля&amp;quot;,&amp;quot;марта&amp;quot;,&amp;quot;апреля&amp;quot;,&amp;quot;мая&amp;quot;,&amp;quot;июня&amp;quot;,&amp;quot;июля&amp;quot;,&amp;quot;августа&amp;quot;,&amp;quot;сентября&amp;quot;,&amp;quot;октября&amp;quot;,&amp;quot;ноября&amp;quot;,&amp;quot;декабря&amp;quot;}&lt;br /&gt;
local month_to_num = {[&amp;quot;января&amp;quot;]=1,[&amp;quot;февраля&amp;quot;]=2,[&amp;quot;марта&amp;quot;]=3,[&amp;quot;апреля&amp;quot;]=4,[&amp;quot;мая&amp;quot;]=5,[&amp;quot;июня&amp;quot;]=6,&lt;br /&gt;
	[&amp;quot;июля&amp;quot;]=7,[&amp;quot;августа&amp;quot;]=8,[&amp;quot;сентября&amp;quot;]=9,[&amp;quot;октября&amp;quot;]=10,[&amp;quot;ноября&amp;quot;]=11,[&amp;quot;декабря&amp;quot;]=12,[&amp;quot;-&amp;quot;]=&amp;quot;&amp;quot;}&lt;br /&gt;
local monthd = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}&lt;br /&gt;
local params = { {&amp;quot;г&amp;quot;, &amp;quot;g&amp;quot;}, {&amp;quot;ю&amp;quot;, &amp;quot;j&amp;quot;}}&lt;br /&gt;
local comment = { &amp;#039;&amp;lt;span style=&amp;quot;border-bottom: 1px dotted; cursor: help&amp;quot; title=&amp;quot;по юлианскому календарю&amp;quot;&amp;gt;&amp;#039;,&amp;#039;&amp;lt;/span&amp;gt;&amp;#039;}&lt;br /&gt;
&lt;br /&gt;
-- duplicates:&lt;br /&gt;
-- AST, BST, CST, ECT, IST, MST, PST, SST, &lt;br /&gt;
local known_tzs = {&lt;br /&gt;
   ACDT=&amp;#039;+10:30&amp;#039;, ACST=&amp;#039;+09:30&amp;#039;, ACT =&amp;#039;+08:00&amp;#039;, ADT  =&amp;#039;-03:00&amp;#039;, AEDT =&amp;#039;+11:00&amp;#039;,&lt;br /&gt;
   AEST=&amp;#039;+10:00&amp;#039;, AFT =&amp;#039;+04:30&amp;#039;, AKDT=&amp;#039;-08:00&amp;#039;, AKST =&amp;#039;-09:00&amp;#039;, AMST =&amp;#039;+05:00&amp;#039;,&lt;br /&gt;
   AMT =&amp;#039;+04:00&amp;#039;, ART =&amp;#039;-03:00&amp;#039;, AST =&amp;#039;+03:00&amp;#039;, AST  =&amp;#039;+04:00&amp;#039;, AST  =&amp;#039;+03:00&amp;#039;,&lt;br /&gt;
   AST =&amp;#039;-04:00&amp;#039;, AWDT=&amp;#039;+09:00&amp;#039;, AWST=&amp;#039;+08:00&amp;#039;, AZOST=&amp;#039;-01:00&amp;#039;, AZT  =&amp;#039;+04:00&amp;#039;,&lt;br /&gt;
   BDT =&amp;#039;+08:00&amp;#039;, BIOT=&amp;#039;+06:00&amp;#039;, BIT =&amp;#039;-12:00&amp;#039;, BOT  =&amp;#039;-04:00&amp;#039;, BRT  =&amp;#039;-03:00&amp;#039;,&lt;br /&gt;
   BST =&amp;#039;+06:00&amp;#039;, BST =&amp;#039;+01:00&amp;#039;, BTT =&amp;#039;+06:00&amp;#039;, CAT  =&amp;#039;+02:00&amp;#039;, CCT  =&amp;#039;+06:30&amp;#039;,&lt;br /&gt;
   CDT =&amp;#039;-05:00&amp;#039;, CEDT=&amp;#039;+02:00&amp;#039;, CEST=&amp;#039;+02:00&amp;#039;, CET  =&amp;#039;+01:00&amp;#039;, CHAST=&amp;#039;+12:45&amp;#039;,&lt;br /&gt;
   CIST=&amp;#039;-08:00&amp;#039;, CKT =&amp;#039;-10:00&amp;#039;, CLST=&amp;#039;-03:00&amp;#039;, CLT  =&amp;#039;-04:00&amp;#039;, COST =&amp;#039;-04:00&amp;#039;,&lt;br /&gt;
   COT =&amp;#039;-05:00&amp;#039;, CST =&amp;#039;-06:00&amp;#039;, CST =&amp;#039;+08:00&amp;#039;, CVT  =&amp;#039;-01:00&amp;#039;, CXT  =&amp;#039;+07:00&amp;#039;,&lt;br /&gt;
   CHST=&amp;#039;+10:00&amp;#039;, DFT =&amp;#039;+01:00&amp;#039;, EAST=&amp;#039;-06:00&amp;#039;, EAT  =&amp;#039;+03:00&amp;#039;, ECT  =&amp;#039;-04:00&amp;#039;,&lt;br /&gt;
   ECT =&amp;#039;-05:00&amp;#039;, EDT =&amp;#039;-04:00&amp;#039;, EEDT=&amp;#039;+03:00&amp;#039;, EEST =&amp;#039;+03:00&amp;#039;, EET  =&amp;#039;+02:00&amp;#039;,&lt;br /&gt;
   EST =&amp;#039;-05:00&amp;#039;, FJT =&amp;#039;+12:00&amp;#039;, FKST=&amp;#039;-03:00&amp;#039;, FKT  =&amp;#039;-04:00&amp;#039;, GALT =&amp;#039;-06:00&amp;#039;,&lt;br /&gt;
   GET =&amp;#039;+04:00&amp;#039;, GFT =&amp;#039;-03:00&amp;#039;, GILT=&amp;#039;+12:00&amp;#039;, GIT  =&amp;#039;-09:00&amp;#039;, GMT  =&amp;#039;+00:00&amp;#039;,&lt;br /&gt;
   GST =&amp;#039;-02:00&amp;#039;, GYT =&amp;#039;-04:00&amp;#039;, HADT=&amp;#039;-09:00&amp;#039;, HAST =&amp;#039;-10:00&amp;#039;, HKT  =&amp;#039;+08:00&amp;#039;,&lt;br /&gt;
   HMT =&amp;#039;+05:00&amp;#039;, HST =&amp;#039;-10:00&amp;#039;, IRKT=&amp;#039;+08:00&amp;#039;, IRST =&amp;#039;+03:30&amp;#039;, IST  =&amp;#039;+05:30&amp;#039;,&lt;br /&gt;
   IST =&amp;#039;+01:00&amp;#039;, IST =&amp;#039;+02:00&amp;#039;, JST =&amp;#039;+09:00&amp;#039;, KRAT =&amp;#039;+07:00&amp;#039;, KST  =&amp;#039;+09:00&amp;#039;,&lt;br /&gt;
   LHST=&amp;#039;+10:30&amp;#039;, LINT=&amp;#039;+14:00&amp;#039;, MAGT=&amp;#039;+11:00&amp;#039;, MDT  =&amp;#039;-06:00&amp;#039;, MIT  =&amp;#039;-09:30&amp;#039;,&lt;br /&gt;
   MSD =&amp;#039;+04:00&amp;#039;, MSK =&amp;#039;+03:00&amp;#039;, MST =&amp;#039;+08:00&amp;#039;, MST  =&amp;#039;-07:00&amp;#039;, MST  =&amp;#039;+06:30&amp;#039;,&lt;br /&gt;
   MUT =&amp;#039;+04:00&amp;#039;, NDT =&amp;#039;-02:30&amp;#039;, NFT =&amp;#039;+11:30&amp;#039;, NPT  =&amp;#039;+05:45&amp;#039;, NST  =&amp;#039;-03:30&amp;#039;,&lt;br /&gt;
   NT  =&amp;#039;-03:30&amp;#039;, OMST=&amp;#039;+06:00&amp;#039;, PDT =&amp;#039;-07:00&amp;#039;, PETT =&amp;#039;+12:00&amp;#039;, PHOT =&amp;#039;+13:00&amp;#039;,&lt;br /&gt;
   PKT =&amp;#039;+05:00&amp;#039;, PST =&amp;#039;-08:00&amp;#039;, PST =&amp;#039;+08:00&amp;#039;, RET  =&amp;#039;+04:00&amp;#039;, SAMT =&amp;#039;+04:00&amp;#039;,&lt;br /&gt;
   SAST=&amp;#039;+02:00&amp;#039;, SBT =&amp;#039;+11:00&amp;#039;, SCT =&amp;#039;+04:00&amp;#039;, SLT  =&amp;#039;+05:30&amp;#039;, SST  =&amp;#039;-11:00&amp;#039;,&lt;br /&gt;
   SST =&amp;#039;+08:00&amp;#039;, TAHT=&amp;#039;-10:00&amp;#039;, THA =&amp;#039;+07:00&amp;#039;, UTC  =&amp;#039;+00:00&amp;#039;, UYST =&amp;#039;-02:00&amp;#039;,&lt;br /&gt;
   UYT =&amp;#039;-03:00&amp;#039;, VET =&amp;#039;-04:30&amp;#039;, VLAT=&amp;#039;+10:00&amp;#039;, WAT  =&amp;#039;+01:00&amp;#039;, WEDT =&amp;#039;+01:00&amp;#039;,&lt;br /&gt;
   WEST=&amp;#039;+01:00&amp;#039;, WET =&amp;#039;+00:00&amp;#039;, YAKT=&amp;#039;+09:00&amp;#039;, YEKT =&amp;#039;+05:00&amp;#039;,&lt;br /&gt;
   -- US Millitary (for RFC-822)&lt;br /&gt;
   Z=&amp;#039;+00:00&amp;#039;, A=&amp;#039;-01:00&amp;#039;, M=&amp;#039;-12:00&amp;#039;, N=&amp;#039;+01:00&amp;#039;, Y=&amp;#039;+12:00&amp;#039;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local category = {&lt;br /&gt;
	[&amp;quot;no_parameters&amp;quot;]=&lt;br /&gt;
	&amp;quot;&amp;lt;!--[[Категория:Модуль:Calendar:Страницы без параметров]]--&amp;gt;&amp;quot;,&lt;br /&gt;
	[&amp;quot;incomplete_parameters&amp;quot;]=&lt;br /&gt;
	&amp;quot;&amp;lt;!--[[Категория:Модуль:Calendar:Страницы с неполными или некорректными параметрами]]--&amp;gt;&amp;quot;,&lt;br /&gt;
	[&amp;quot;without_verification&amp;quot;]=&lt;br /&gt;
	&amp;quot;&amp;lt;!--[[Категория:Модуль:Calendar:Страницы без проверки параметров]]--&amp;gt;&amp;quot;,&lt;br /&gt;
	[&amp;quot;erroneous_parameters&amp;quot;]=&lt;br /&gt;
	&amp;quot;&amp;lt;!--[[Категория:Модуль:Calendar:Страницы с ошибочными параметрами]]--&amp;gt;&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- несколько параметров передаются вместе с кодом ошибки в таблице, один может быть передан простым значением&lt;br /&gt;
local e = {&lt;br /&gt;
	[&amp;quot;start&amp;quot;]=&amp;quot;&amp;lt;span class=error&amp;gt;Ошибка: &amp;quot;,&lt;br /&gt;
	[&amp;quot;ending&amp;quot;]=&amp;quot;.&amp;lt;/span&amp;gt;&amp;quot;,&lt;br /&gt;
	[&amp;quot;no_pattern_match&amp;quot;]=&amp;quot;строка «%s» не совпадает с заданными паттернами&amp;quot;,&lt;br /&gt;
	[&amp;quot;no_valid_date&amp;quot;]=&amp;quot;дата «%s» не является корректной&amp;quot;,&lt;br /&gt;
	[&amp;quot;wrong_jd&amp;quot;]=&amp;quot;юлианская дата %s вне диапазона&amp;quot;,&lt;br /&gt;
	[&amp;quot;no_data&amp;quot;]=&amp;quot;нет входящих данных&amp;quot;,&lt;br /&gt;
	[&amp;quot;too_many_arguments&amp;quot;]=&amp;quot;ожидается менее %i аргументов&amp;quot;,&lt;br /&gt;
	[&amp;quot;too_little_arguments&amp;quot;]=&amp;quot;ожидается более %i аргументов&amp;quot;,&lt;br /&gt;
	[&amp;quot;wrong_calculation&amp;quot;]=&amp;quot;даты %s и %s не прошли проверку, %s дней разница&amp;quot;,&lt;br /&gt;
	[&amp;quot;unknown_param&amp;quot;]=&amp;quot;параметр %s неизвестен&amp;quot;,&lt;br /&gt;
	[&amp;quot;unknown_error&amp;quot;]=&amp;quot;неизвестная ошибка&amp;quot;,&lt;br /&gt;
	[&amp;quot;tech_error&amp;quot;]=&amp;quot;ошибка в функции %s&amp;quot;,&lt;br /&gt;
	[&amp;quot;box_date&amp;quot;]=&amp;quot;строка «%s» не является верной датой, пожалуйста, укажите дату в формате ГГГГ-ММ-ДД&amp;quot;&lt;br /&gt;
--	[&amp;quot;&amp;quot;]=&amp;quot;&amp;quot;,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
local tzs_names = {&amp;quot;ACDT&amp;quot;,&amp;quot;ACST&amp;quot;,&amp;quot;ACT&amp;quot;,&amp;quot;ADT&amp;quot;,&amp;quot;AEDT&amp;quot;,&amp;quot;AEST&amp;quot;,&amp;quot;AFT&amp;quot;,&amp;quot;AKDT&amp;quot;,&amp;quot;AKST&amp;quot;,&lt;br /&gt;
&amp;quot;AMST&amp;quot;,&amp;quot;AMT&amp;quot;,&amp;quot;ART&amp;quot;,&amp;quot;AST&amp;quot;,&amp;quot;AST&amp;quot;,&amp;quot;AST&amp;quot;,&amp;quot;AST&amp;quot;,&amp;quot;AWDT&amp;quot;,&amp;quot;AWST&amp;quot;,&amp;quot;AZOST&amp;quot;,&amp;quot;AZT&amp;quot;,&amp;quot;BDT&amp;quot;,&lt;br /&gt;
&amp;quot;BIOT&amp;quot;,&amp;quot;BIT&amp;quot;,&amp;quot;BOT&amp;quot;,&amp;quot;BRT&amp;quot;,&amp;quot;BST&amp;quot;,&amp;quot;BST&amp;quot;,&amp;quot;BTT&amp;quot;,&amp;quot;CAT&amp;quot;,&amp;quot;CCT&amp;quot;,&amp;quot;CDT&amp;quot;,&amp;quot;CEDT&amp;quot;,&amp;quot;CEST&amp;quot;,&lt;br /&gt;
&amp;quot;CET&amp;quot;,&amp;quot;CHAST&amp;quot;,&amp;quot;CIST&amp;quot;,&amp;quot;CKT&amp;quot;,&amp;quot;CLST&amp;quot;,&amp;quot;CLT&amp;quot;,&amp;quot;COST&amp;quot;,&amp;quot;COT&amp;quot;,&amp;quot;CST&amp;quot;,&amp;quot;CST&amp;quot;,&amp;quot;CVT&amp;quot;,&amp;quot;CXT&amp;quot;,&lt;br /&gt;
&amp;quot;CHST&amp;quot;,&amp;quot;DFT&amp;quot;,&amp;quot;EAST&amp;quot;,&amp;quot;EAT&amp;quot;,&amp;quot;ECT&amp;quot;,&amp;quot;ECT&amp;quot;,&amp;quot;EDT&amp;quot;,&amp;quot;EEDT&amp;quot;,&amp;quot;EEST&amp;quot;,&amp;quot;EET&amp;quot;,&amp;quot;EST&amp;quot;,&amp;quot;FJT&amp;quot;,&lt;br /&gt;
&amp;quot;FKST&amp;quot;,&amp;quot;FKT&amp;quot;,&amp;quot;GALT&amp;quot;,&amp;quot;GET&amp;quot;,&amp;quot;GFT&amp;quot;,&amp;quot;GILT&amp;quot;,&amp;quot;GIT&amp;quot;,&amp;quot;GMT&amp;quot;,&amp;quot;GST&amp;quot;,&amp;quot;GYT&amp;quot;,&amp;quot;HADT&amp;quot;,&amp;quot;HAST&amp;quot;,&lt;br /&gt;
&amp;quot;HKT&amp;quot;,&amp;quot;HMT&amp;quot;,&amp;quot;HST&amp;quot;,&amp;quot;IRKT&amp;quot;,&amp;quot;IRST&amp;quot;,&amp;quot;IST&amp;quot;,&amp;quot;IST&amp;quot;,&amp;quot;IST&amp;quot;,&amp;quot;JST&amp;quot;,&amp;quot;KRAT&amp;quot;,&amp;quot;KST&amp;quot;,&amp;quot;LHST&amp;quot;,&lt;br /&gt;
&amp;quot;LINT&amp;quot;,&amp;quot;MAGT&amp;quot;,&amp;quot;MDT&amp;quot;,&amp;quot;MIT&amp;quot;,&amp;quot;MSD&amp;quot;,&amp;quot;MSK&amp;quot;,&amp;quot;MST&amp;quot;,&amp;quot;MST&amp;quot;,&amp;quot;MST&amp;quot;,&amp;quot;MUT&amp;quot;,&amp;quot;NDT&amp;quot;,&amp;quot;NFT&amp;quot;,&lt;br /&gt;
&amp;quot;NPT&amp;quot;,&amp;quot;NST&amp;quot;,&amp;quot;NT&amp;quot;,&amp;quot;OMST&amp;quot;,&amp;quot;PDT&amp;quot;,&amp;quot;PETT&amp;quot;,&amp;quot;PHOT&amp;quot;,&amp;quot;PKT&amp;quot;,&amp;quot;PST&amp;quot;,&amp;quot;PST&amp;quot;,&amp;quot;RET&amp;quot;,&amp;quot;SAMT&amp;quot;,&lt;br /&gt;
&amp;quot;SAST&amp;quot;,&amp;quot;SBT&amp;quot;,&amp;quot;SCT&amp;quot;,&amp;quot;SLT&amp;quot;,&amp;quot;SST&amp;quot;,&amp;quot;SST&amp;quot;,&amp;quot;TAHT&amp;quot;,&amp;quot;THA&amp;quot;,&amp;quot;UTC&amp;quot;,&amp;quot;UYST&amp;quot;,&amp;quot;UYT&amp;quot;,&amp;quot;VET&amp;quot;,&lt;br /&gt;
&amp;quot;VLAT&amp;quot;,&amp;quot;WAT&amp;quot;,&amp;quot;WEDT&amp;quot;,&amp;quot;WEST&amp;quot;,&amp;quot;WET&amp;quot;,&amp;quot;YAKT&amp;quot;,&amp;quot;YEKT&amp;quot;,&amp;quot;Z&amp;quot;,&amp;quot;A&amp;quot;,&amp;quot;M&amp;quot;,&amp;quot;N&amp;quot;,&amp;quot;Y&amp;quot;,&amp;quot;MSK&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
local pattern = { -- для распознавания дат, переданных одним строчным параметром&lt;br /&gt;
	{&amp;quot;(-?%d%d%d%d?)[-%.%s/\\](%d%d)[-%.%s/\\](%d%d)&amp;quot;,  	[&amp;quot;order&amp;quot;] = {3,2,1} },  -- yyyy mm dd&lt;br /&gt;
	{&amp;quot;(%d+)[-%.%s/\\](%d+)[-%.%s/\\](%d%d%d%d?)&amp;quot;,	[&amp;quot;order&amp;quot;] = {1,2,3} }, 		-- dd mm yyyy&lt;br /&gt;
	{&amp;quot;(%d%d)[-%.%s/\\](%d%d%d%d?)&amp;quot;, [&amp;quot;order&amp;quot;] = {2,3} }, 	-- mm yyyy&lt;br /&gt;
	{&amp;quot;(%d%d%d%d?)[-%.%s/\\](%d%d)&amp;quot;, [&amp;quot;order&amp;quot;] = {3,2} }, 	-- yyyy mm&lt;br /&gt;
	{&amp;quot;(%d+)%s(%l+)%s(%d%d%d%d?)&amp;quot;, 	[&amp;quot;order&amp;quot;] = {1,2,3} }, 	-- d mmm y&lt;br /&gt;
	{&amp;quot;(%l+)%s(%d+),?%s(%d%d%d%d?)&amp;quot;, [&amp;quot;order&amp;quot;] = {2,1,3} }, 	-- mmm d, y&lt;br /&gt;
	{&amp;quot;(%l+)%s(%d%d%d%d?)&amp;quot;, 	[&amp;quot;order&amp;quot;] = {2,3} }, 			-- mmm y&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local time_units = {&amp;quot;year&amp;quot;,&amp;quot;month&amp;quot;,&amp;quot;day&amp;quot;} --не используется&lt;br /&gt;
--[[ local time_units = {&amp;quot;second&amp;quot;, &amp;quot;minute&amp;quot;, &amp;quot;hour&amp;quot;,&lt;br /&gt;
    &amp;quot;day_of_month&amp;quot;, &amp;quot;day_of_week&amp;quot;, &amp;quot;day_of_year&amp;quot;,&lt;br /&gt;
    &amp;quot;week&amp;quot;, &amp;quot;month&amp;quot;, &amp;quot;year&amp;quot;, &amp;quot;year_of_century&amp;quot;, &amp;quot;century&amp;quot;} ]]--&lt;br /&gt;
-- напоминание чтобы сделать более точные пересчёты - с часами / расчёт длительностей периодов&lt;br /&gt;
&lt;br /&gt;
local mnlang = {&amp;quot;ru_G&amp;quot;, &amp;quot;ru_N&amp;quot;, &amp;quot;en&amp;quot;, &amp;quot;de&amp;quot;, &amp;quot;fr&amp;quot;}&lt;br /&gt;
local month_lang = {&lt;br /&gt;
	[&amp;quot;ru_G&amp;quot;] = {&amp;quot;января&amp;quot;,&amp;quot;февраля&amp;quot;,&amp;quot;марта&amp;quot;,&amp;quot;апреля&amp;quot;,&amp;quot;мая&amp;quot;,&amp;quot;июня&amp;quot;,&lt;br /&gt;
		&amp;quot;июля&amp;quot;,&amp;quot;августа&amp;quot;,&amp;quot;сентября&amp;quot;,&amp;quot;октября&amp;quot;,&amp;quot;ноября&amp;quot;,&amp;quot;декабря&amp;quot;},&lt;br /&gt;
	[&amp;quot;ru_N&amp;quot;] = {&amp;quot;январь&amp;quot;,&amp;quot;февраль&amp;quot;,&amp;quot;март&amp;quot;,&amp;quot;апрель&amp;quot;,&amp;quot;май&amp;quot;,&amp;quot;июнь&amp;quot;,&lt;br /&gt;
		&amp;quot;июль&amp;quot;,&amp;quot;август&amp;quot;,&amp;quot;сентябрь&amp;quot;,&amp;quot;октябрь&amp;quot;,&amp;quot;ноябрь&amp;quot;,&amp;quot;декабрь&amp;quot;},&lt;br /&gt;
	[&amp;quot;en&amp;quot;] = {&amp;quot;january&amp;quot;, &amp;quot;february&amp;quot;, &amp;quot;march&amp;quot;, &amp;quot;april&amp;quot;, &amp;quot;may&amp;quot;, &amp;quot;june&amp;quot;,&lt;br /&gt;
		&amp;quot;july&amp;quot;, &amp;quot;august&amp;quot;, &amp;quot;september&amp;quot;, &amp;quot;october&amp;quot;, &amp;quot;november&amp;quot;, &amp;quot;december&amp;quot;},&lt;br /&gt;
	[&amp;quot;de&amp;quot;] = {&amp;quot;januar&amp;quot;, &amp;quot;februar&amp;quot;, &amp;quot;märz&amp;quot;, &amp;quot;april&amp;quot;, &amp;quot;mai&amp;quot;, &amp;quot;juni&amp;quot;,&lt;br /&gt;
		&amp;quot;juli&amp;quot;, &amp;quot;august&amp;quot;, &amp;quot;september&amp;quot;, &amp;quot;oktober&amp;quot;, &amp;quot;november&amp;quot;, &amp;quot;dezember&amp;quot;},&lt;br /&gt;
	[&amp;quot;fr&amp;quot;] = {&amp;quot;janvier&amp;quot;, &amp;quot;février&amp;quot;, &amp;quot;mars&amp;quot;, &amp;quot;avril&amp;quot;, &amp;quot;mai&amp;quot;, &amp;quot;juin&amp;quot;,&lt;br /&gt;
		&amp;quot;juillet&amp;quot;, &amp;quot;août&amp;quot;, &amp;quot;septembre&amp;quot;, &amp;quot;octobre&amp;quot;, &amp;quot;novembre&amp;quot;, &amp;quot;décembre&amp;quot;}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
-- заполняется автоматически&lt;br /&gt;
local reverse_month_lang = {}&lt;br /&gt;
&lt;br /&gt;
-- вспомогательная функция для обращения таблиц (смена ключей со значениями)&lt;br /&gt;
local reverse_table = function (strait_table)&lt;br /&gt;
	local reversed_table = {}&lt;br /&gt;
	for k,v in pairs(strait_table) do&lt;br /&gt;
		reversed_table[v] = k&lt;br /&gt;
	end&lt;br /&gt;
	return reversed_table&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- запуск цикла по заполнению обратных таблиц, необходимых для распознавания дат&lt;br /&gt;
local filling_months = function (mnlang, month_lang)&lt;br /&gt;
	for i=1, #mnlang do&lt;br /&gt;
		reverse_month_lang[mnlang[i]] = reverse_table(month_lang[mnlang[i]])&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- 10) Блок общих функций&lt;br /&gt;
local function trim(str)&lt;br /&gt;
	if not str then return nil&lt;br /&gt;
	else return str:match&amp;#039;^()%s*$&amp;#039; and &amp;#039;&amp;#039; or str:match&amp;#039;^%s*(.*%S)&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function purif(str)&lt;br /&gt;
    if str == &amp;quot;&amp;quot; or str == nil then&lt;br /&gt;
        return nil&lt;br /&gt;
    elseif type(tonumber(str)) == &amp;quot;number&amp;quot; then&lt;br /&gt;
        return math.floor(tonumber(str))&lt;br /&gt;
    else&lt;br /&gt;
        return nil&lt;br /&gt;
    end&lt;br /&gt;
    -- need .5 -- ,5 number format converter?&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function is(str)&lt;br /&gt;
	if (not str) or (str == &amp;quot;&amp;quot;) then return false&lt;br /&gt;
	else return yesno(str,false)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function init(num)&lt;br /&gt;
	local output = {}&lt;br /&gt;
	for i=1,num do&lt;br /&gt;
		table.insert(output, {[&amp;quot;year&amp;quot;]=&amp;quot;&amp;quot;, [&amp;quot;month&amp;quot;]=&amp;quot;&amp;quot;, [&amp;quot;day&amp;quot;]=&amp;quot;&amp;quot;})&lt;br /&gt;
	end&lt;br /&gt;
	return unpack(output)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function isyear(tbl)&lt;br /&gt;
	if type(tbl) ~= &amp;#039;table&amp;#039; then return false&lt;br /&gt;
	elseif not tbl[&amp;quot;year&amp;quot;] then return false&lt;br /&gt;
	elseif type(tbl[&amp;quot;year&amp;quot;]) == &amp;#039;number&amp;#039; then return true&lt;br /&gt;
	else return false&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function inbord(val, down, up)&lt;br /&gt;
	return not (type(up) ~= &amp;quot;number&amp;quot; or type(down) ~= &amp;quot;number&amp;quot; or type(val) ~= &amp;quot;number&amp;quot; or up &amp;lt; down or val &amp;lt; down or val &amp;gt; up)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function shallowcopy(orig)&lt;br /&gt;
    local orig_type = type(orig)&lt;br /&gt;
    local copy&lt;br /&gt;
    if orig_type == &amp;#039;table&amp;#039; then&lt;br /&gt;
        copy = {}&lt;br /&gt;
        for orig_key, orig_value in pairs(orig) do&lt;br /&gt;
            copy[orig_key] = orig_value&lt;br /&gt;
        end&lt;br /&gt;
    else -- number, string, boolean, etc&lt;br /&gt;
        copy = orig&lt;br /&gt;
    end&lt;br /&gt;
    return copy&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local inlist = function ( var, list )&lt;br /&gt;
    local n = #list&lt;br /&gt;
	local inlist = false&lt;br /&gt;
	for i=1,n do&lt;br /&gt;
		if var == list[i] then inlist = true end&lt;br /&gt;
	end&lt;br /&gt;
    return inlist&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- 20) Блок общих проверочных функций, связанных с датами&lt;br /&gt;
local function unwarp(tbl)&lt;br /&gt;
	if not tbl then return &amp;quot;&amp;quot;&lt;br /&gt;
	elseif type(tbl) ~= &amp;quot;table&amp;quot; then return tbl&lt;br /&gt;
	elseif (tbl.day or tbl.month or tbl.year) then&lt;br /&gt;
		return (tbl.year or &amp;quot;?&amp;quot;)..&amp;quot;-&amp;quot;..(tbl.month or &amp;quot;?&amp;quot;)..&amp;quot;-&amp;quot;..(tbl.day or &amp;quot;?&amp;quot;)&lt;br /&gt;
	else return (tbl[3] or &amp;quot;?&amp;quot;)..&amp;quot;-&amp;quot;..(tbl[2] or &amp;quot;?&amp;quot;)..&amp;quot;-&amp;quot;..(tbl[1] or &amp;quot;?&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function leap_year(y,jul)&lt;br /&gt;
	if (not y) or (type(y) ~= &amp;quot;number&amp;quot;)&lt;br /&gt;
		then return false&lt;br /&gt;
	elseif (y % 4) ~= 0&lt;br /&gt;
		then return false&lt;br /&gt;
	elseif not jul and (y % 100 == 0 and y % 400 ~= 0)&lt;br /&gt;
		then return false&lt;br /&gt;
	else return true&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- функция для вычисления последнего дня месяца для юлианского и григорианского календарей&lt;br /&gt;
local function month_end_day (month,year,is_julian)&lt;br /&gt;
	local month_end_day = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} -- если не задан год, дата 29 февраля считается допустимой&lt;br /&gt;
	if not month or type(month) ~= &amp;quot;number&amp;quot; or month &amp;lt; 1 or month &amp;gt; 12 then return nil&lt;br /&gt;
	elseif month ~= 2 or not year then return month_end_day[month] &lt;br /&gt;
	elseif month == 2 and (year % 4) == 0 and not ((not is_julian) and (year % 100 == 0 and year % 400 ~= 0)) then return 29&lt;br /&gt;
	elseif month == 2 then return 28&lt;br /&gt;
	else return nil -- в случае не целого значения входящих параметров или при иных непредусмотренных событиях&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function isdate ( chain , jul ) -- можно использовать для проверки таблиц с полями day, month, year&lt;br /&gt;
	if not chain then return false&lt;br /&gt;
	elseif (not type(chain) == &amp;quot;table&amp;quot;)&lt;br /&gt;
	or (not inbord(chain.year,-9999,9999))&lt;br /&gt;
	or (not inbord(chain.month,1,12))&lt;br /&gt;
	or (not inbord(chain.day,1,31))&lt;br /&gt;
	or chain.day &amp;gt; monthd[chain.month]&lt;br /&gt;
--	or chain.year == 0&lt;br /&gt;
	then return false&lt;br /&gt;
	elseif chain.month == 2 and chain.day == 29 and not leap_year(chain.year,jul)&lt;br /&gt;
		then return false&lt;br /&gt;
	else return true end&lt;br /&gt;
--  check for other calendars needed?&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function ispartdate ( chain )&lt;br /&gt;
	if not chain then return false&lt;br /&gt;
	elseif not (type(chain) == &amp;quot;table&amp;quot;) then return false&lt;br /&gt;
	elseif (inbord(chain.year,-9999,9999)&lt;br /&gt;
	or inbord(chain.month,1,12)&lt;br /&gt;
	or inbord(chain.day,1,31)) then return true&lt;br /&gt;
	else return false&lt;br /&gt;
	end&lt;br /&gt;
--	partial date&lt;br /&gt;
--  more detailed check for 31.02.0000 needed&lt;br /&gt;
--  check for other calendars needed&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- from date1 to date2 in one year (beetwen jan-dec, dec-jan needed)&lt;br /&gt;
local function partdist(date1,date2)&lt;br /&gt;
	local mont, dist = 0, 0&lt;br /&gt;
	local d1d, d1m, d2d, d2m = (date1[&amp;quot;day&amp;quot;] or &amp;quot;&amp;quot;), (date1[&amp;quot;month&amp;quot;] or &amp;quot;&amp;quot;),(date2[&amp;quot;day&amp;quot;] or &amp;quot;&amp;quot;), (date2[&amp;quot;month&amp;quot;] or &amp;quot;&amp;quot;)&lt;br /&gt;
	if not (inbord(d1d,1,31) and inbord(d2d,1,31)) then return false end&lt;br /&gt;
	-- нужна доп. проверка частичных дат на корректность&lt;br /&gt;
	if (inbord(d1m,1,12) or inbord(d2m,1,12))&lt;br /&gt;
	and (d1m == &amp;quot;&amp;quot; or d2m == &amp;quot;&amp;quot;) then&lt;br /&gt;
		mont = purif(date1[&amp;quot;month&amp;quot;] or date2[&amp;quot;month&amp;quot;])&lt;br /&gt;
		d1m, d2m = mont, mont&lt;br /&gt;
	end&lt;br /&gt;
--	mw.log(&amp;quot;📏 day: &amp;quot; ..d1d ..&amp;quot;-&amp;gt;&amp;quot;..d2d..&amp;quot; month: &amp;quot;.. d1m..&amp;quot;-&amp;gt;&amp;quot;..d2m )&lt;br /&gt;
	if (inbord(d1m,1,12) and d1d &amp;lt;= monthd[d1m])&lt;br /&gt;
	and (inbord(d2m,1,12) and d2d &amp;lt;= monthd[d2m])	then &lt;br /&gt;
		if d2m == d1m &lt;br /&gt;
		then dist = d2d - d1d&lt;br /&gt;
		else dist = monthd[d1m] - d1d + d2d&lt;br /&gt;
		end&lt;br /&gt;
		return dist&lt;br /&gt;
	else return math.huge&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function dmdist(d1,d2)&lt;br /&gt;
	local p1,p2 = math.huge,math.huge&lt;br /&gt;
	if not not partdist(d1,d2) then &lt;br /&gt;
		p1=partdist(d1,d2)&lt;br /&gt;
	end&lt;br /&gt;
	if not not partdist(d2,d1) then &lt;br /&gt;
		p1=partdist(d2,d1)&lt;br /&gt;
	end&lt;br /&gt;
--	if (not p1) or (not p2) then&lt;br /&gt;
--		return  (p1 or &amp;quot;&amp;quot;) .. (p2 or &amp;quot;&amp;quot;)&lt;br /&gt;
--	else&lt;br /&gt;
--		mw.log(&amp;quot;d1, d2 = &amp;quot; .. undate(d1) .. &amp;quot;, &amp;quot; .. undate(d2))&lt;br /&gt;
		return math.min(tonumber(partdist(d1,d2)) or math.huge,tonumber(partdist(d2,d1)) or math.huge)&lt;br /&gt;
--	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- 30) Блок функций для обработки ввода-вывода дат&lt;br /&gt;
&lt;br /&gt;
local function undate(tbl)&lt;br /&gt;
	if not tbl then return &amp;quot;&amp;quot;&lt;br /&gt;
	else return (tbl.year or &amp;quot;&amp;quot;)..&amp;quot;-&amp;quot;..(tbl.month or &amp;quot;&amp;quot;)..&amp;quot;-&amp;quot;..(tbl.day or &amp;quot;&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- функция для нормализации значений дат и перевода месяцев в числа&lt;br /&gt;
local function numerize(str)&lt;br /&gt;
    if type(str) == &amp;quot;number&amp;quot; then&lt;br /&gt;
        return math.floor(str)&lt;br /&gt;
	elseif str == &amp;quot;&amp;quot; or str == nil or type(str) ~= &amp;quot;string&amp;quot; then&lt;br /&gt;
		return nil&lt;br /&gt;
    elseif type(tonumber(str)) == &amp;quot;number&amp;quot; then&lt;br /&gt;
        return math.floor(tonumber(str))&lt;br /&gt;
    else&lt;br /&gt;
    	for i=1, #mnlang do&lt;br /&gt;
    		if inlist(mw.ustring.lower(str),month_lang[mnlang[i]]) then&lt;br /&gt;
				return reverse_month_lang[mnlang[i]][mw.ustring.lower(str)]&lt;br /&gt;
			end&lt;br /&gt;
    	end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- функция распознавания даты, переданной одной строкой&lt;br /&gt;
local function parse_date(date_string)&lt;br /&gt;
	if type(date_string) ~= &amp;quot;string&amp;quot; or date_string == &amp;quot;&amp;quot; then return nil end&lt;br /&gt;
	local out_date_str = {&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;}&lt;br /&gt;
	local error_data = {}&lt;br /&gt;
	for i=1, #pattern do&lt;br /&gt;
		local result_1, result_2, result_3 = mw.ustring.match(mw.ustring.lower(date_string),pattern[i][1])&lt;br /&gt;
		if (result_1 or &amp;quot;&amp;quot;) &amp;gt; &amp;quot;&amp;quot; then&lt;br /&gt;
			out_date_str[pattern[i].order[1]] = result_1&lt;br /&gt;
    		out_date_str[pattern[i].order[2]] = result_2&lt;br /&gt;
    		if (pattern[i].order[3]) then out_date_str[pattern[i].order[3]] = result_3 end&lt;br /&gt;
    	--	mw.log(&amp;quot;Паттерн &amp;quot; .. i .. &amp;quot;, строка: &amp;quot; .. date_string)&lt;br /&gt;
    		break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local date = {&lt;br /&gt;
		[&amp;quot;day&amp;quot;]  =numerize(out_date_str[1]),&lt;br /&gt;
		[&amp;quot;month&amp;quot;]=numerize(out_date_str[2]),&lt;br /&gt;
		[&amp;quot;year&amp;quot;] =numerize(out_date_str[3])}&lt;br /&gt;
	return date --, error_data&lt;br /&gt;
end&lt;br /&gt;
----[[ УСТАРЕЛО ]]----&lt;br /&gt;
local numstr2date = function(numstr)&lt;br /&gt;
	local format = &amp;quot;Y-m-d&amp;quot;&lt;br /&gt;
	local iso_date = mwlang:formatDate(format,numstr)&lt;br /&gt;
    local y,m,d = string.match(iso_date, &amp;quot;(%d+)-(%d+)-(%d+)&amp;quot;)&lt;br /&gt;
	local dateout = {[&amp;quot;year&amp;quot;]=purif(y), [&amp;quot;month&amp;quot;]=purif(m), [&amp;quot;day&amp;quot;]=purif(d)}&lt;br /&gt;
    return dateout&lt;br /&gt;
end&lt;br /&gt;
--local numstr2date = function(numstr)&lt;br /&gt;
--	local nums = {}&lt;br /&gt;
--    local dateout = {}&lt;br /&gt;
--    for num in string.gmatch(numstr,&amp;quot;(%d+)&amp;quot;) do&lt;br /&gt;
--        table.insert(nums,purif(num))&lt;br /&gt;
--    end&lt;br /&gt;
--    if #nums ~= 3 then error(&amp;quot;В поле даты вместо трёх чисел с разделителями указано &amp;quot; .. #nums)&lt;br /&gt;
--    elseif not inbord(nums[2],1,12) then error(&amp;quot;Месяц с номером &amp;quot; .. nums[2] .. &amp;quot; не найден&amp;quot;)&lt;br /&gt;
--    elseif not inbord(nums[3],1,31) then&lt;br /&gt;
--        dateout = {[&amp;quot;year&amp;quot;]=nums[3], [&amp;quot;month&amp;quot;]=nums[2], [&amp;quot;day&amp;quot;]=nums[1]}&lt;br /&gt;
--    elseif not inbord(nums[1],1,31) then&lt;br /&gt;
--        dateout = {[&amp;quot;year&amp;quot;]=nums[1], [&amp;quot;month&amp;quot;]=nums[2], [&amp;quot;day&amp;quot;]=nums[3]}&lt;br /&gt;
--    elseif inbord(nums[1],1,31) then&lt;br /&gt;
--        dateout = {[&amp;quot;year&amp;quot;]=nums[3], [&amp;quot;month&amp;quot;]=nums[2], [&amp;quot;day&amp;quot;]=nums[1]}&lt;br /&gt;
--    else&lt;br /&gt;
--		local mwlang = mw.getContentLanguage()&lt;br /&gt;
--		implement mwlang:formatDate(format,datein,true) here&lt;br /&gt;
--        return error(&amp;quot;Не распознано &amp;quot; .. numstr .. &amp;quot; как дата&amp;quot;)&lt;br /&gt;
--    end&lt;br /&gt;
--    return dateout&lt;br /&gt;
--end&lt;br /&gt;
&lt;br /&gt;
local function year2lang(numyear,yearmark,wiki)&lt;br /&gt;
	if not numyear then return &amp;quot;&amp;quot; end&lt;br /&gt;
	if not yearmark then yearmark = &amp;quot;&amp;quot; end&lt;br /&gt;
	local output = &amp;quot;&amp;quot;&lt;br /&gt;
	local bcmark = &amp;quot; до н. э.&amp;quot;&lt;br /&gt;
	if numyear &amp;gt; 0 then	bcmark = &amp;quot;&amp;quot;&lt;br /&gt;
	else numyear = 1 - numyear end&lt;br /&gt;
	if wiki then &lt;br /&gt;
--		output = tCon({&amp;#039;[[&amp;#039;, numyear,&amp;#039; год&amp;#039;,bcmark,&amp;#039;|&amp;#039;, numyear,&amp;#039;]]&amp;#039;, &amp;quot; &amp;quot;, yearmark, &amp;quot; &amp;quot;, bcmark})&lt;br /&gt;
		output = tCon({&amp;#039;[[&amp;#039;, numyear,&amp;#039; год&amp;#039;,bcmark,&amp;#039;|&amp;#039;, trim(numyear .. &amp;quot; &amp;quot; .. yearmark .. &amp;quot; &amp;quot; .. bcmark), &amp;#039;]]&amp;#039;})&lt;br /&gt;
	else&lt;br /&gt;
		output = tCon({numyear, &amp;quot; &amp;quot;, yearmark, bcmark})&lt;br /&gt;
	end&lt;br /&gt;
	return trim(output)&lt;br /&gt;
end&lt;br /&gt;
	&lt;br /&gt;
local function day2lang(datein,wikidate,wiki,inner_brt)&lt;br /&gt;
--	if not isdate(wikidate) then wiki = false end&lt;br /&gt;
	if not ispartdate(datein) then return &amp;quot;&amp;quot; end&lt;br /&gt;
	local dm_separ, output = &amp;quot;&amp;quot;, nil&lt;br /&gt;
	if (not (not datein.day)) and (not (not datein.month)) then dm_separ = &amp;quot; &amp;quot; end&lt;br /&gt;
	if (not datein.month) then datein.month = &amp;quot;&amp;quot; end&lt;br /&gt;
	if (not datein.day) then datein.day = &amp;quot;&amp;quot; end&lt;br /&gt;
	local monlan = monthlang[datein.month] or &amp;quot;&amp;quot;&lt;br /&gt;
	if wiki and not inner_brt then&lt;br /&gt;
		output = tCon({&amp;quot;[[&amp;quot;, wikidate.day, &amp;quot; &amp;quot;, monthlang[wikidate.month] or &amp;quot;&amp;quot;,&lt;br /&gt;
			&amp;quot;|&amp;quot;, (datein.day or &amp;quot;&amp;quot;), dm_separ, monlan, &amp;quot;]]&amp;quot;})&lt;br /&gt;
	elseif wiki then&lt;br /&gt;
		output = tCon({&amp;quot;[[&amp;quot;, wikidate.day, &amp;quot; &amp;quot;, monthlang[wikidate.month] or &amp;quot;&amp;quot;,&lt;br /&gt;
			&amp;quot;|&amp;quot;, (datein.day or &amp;quot;&amp;quot;), dm_separ, monlan})&lt;br /&gt;
	else&lt;br /&gt;
		output = tCon({datein.day, dm_separ, monlan})&lt;br /&gt;
	end&lt;br /&gt;
    return trim(output)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function triple_txt2date(d,m,y)&lt;br /&gt;
	-- добавить (args[1]:match(&amp;quot;(%a+)&amp;quot;) or &amp;quot;-&amp;quot;) для нестандартной записи&lt;br /&gt;
	-- mw.ustring.match((m or &amp;quot;&amp;quot;),&amp;quot;(%a+)&amp;quot;)&lt;br /&gt;
	local msg = &amp;quot;&amp;quot;&lt;br /&gt;
	local year = purif((y or &amp;quot;-&amp;quot;):match(&amp;quot;(%d+)&amp;quot;))&lt;br /&gt;
	local month = purif(month_to_num[string.lower(mw.ustring.match((m or &amp;quot;&amp;quot;),&amp;quot;(%a+)&amp;quot;))])&lt;br /&gt;
	local day = purif((d or &amp;quot;-&amp;quot;):match(&amp;quot;(%d+)&amp;quot;))&lt;br /&gt;
	if not month then &lt;br /&gt;
		msg = category.incomplete_parameters&lt;br /&gt;
		month = purif(month_to_num[string.lower(mw.ustring.match((d or &amp;quot;&amp;quot;),&amp;quot;(%a+)&amp;quot;) or &amp;quot;-&amp;quot;)]) &lt;br /&gt;
	end&lt;br /&gt;
	if (not day) and ((purif(string.match(m or &amp;quot;&amp;quot;,&amp;quot;(%d+)&amp;quot;) or &amp;quot;&amp;quot;) or 32) &amp;lt;= (monthd[month] or 31)) then &lt;br /&gt;
		msg = category.incomplete_parameters&lt;br /&gt;
		day = purif(m:match(&amp;quot;(%d+)&amp;quot;) or &amp;quot;&amp;quot;) &lt;br /&gt;
	end&lt;br /&gt;
	if not year then &lt;br /&gt;
		msg = category.incomplete_parameters&lt;br /&gt;
		year = purif(string.match(m or &amp;quot;&amp;quot;,&amp;quot;(%d+)&amp;quot;) or &amp;quot;&amp;quot;) &lt;br /&gt;
	end&lt;br /&gt;
	local dateout = {[&amp;quot;year&amp;quot;]=year, [&amp;quot;month&amp;quot;]=month, [&amp;quot;day&amp;quot;]=day, [&amp;quot;msg&amp;quot;]=msg}&lt;br /&gt;
	return dateout&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function glue(d1,m1,y1,d2,m2,y2)&lt;br /&gt;
	if (not d1) and (not m1) and (not y1) and (not d2) and (not m2) and (not y2) then&lt;br /&gt;
		return category.incomplete_parameters end&lt;br /&gt;
	local gd,gm,gy,jd,jm,jy = &lt;br /&gt;
		(d1 or &amp;quot;&amp;quot;),&lt;br /&gt;
		(m1 or &amp;quot;&amp;quot;),&lt;br /&gt;
		(y1 or &amp;quot;&amp;quot;),&lt;br /&gt;
		(d2 or &amp;quot;&amp;quot;),&lt;br /&gt;
		(m2 or &amp;quot;&amp;quot;),&lt;br /&gt;
		(y2 or &amp;quot;&amp;quot;)&lt;br /&gt;
	--mw.log(tCon({gd,gm,gy,jd,jm,jy}))&lt;br /&gt;
	local gm_sep = {&amp;quot; [[&amp;quot;,&amp;quot; год|&amp;quot;,&amp;quot;]]&amp;quot;}&lt;br /&gt;
	if (not gy) or (gy == &amp;quot;&amp;quot;) then gm_sep = {&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;} end&lt;br /&gt;
	return tCon({comment[1],trim(trim(jd .. &amp;quot; &amp;quot; .. jm) .. &amp;quot; &amp;quot; .. jy ),&lt;br /&gt;
		comment[2],&amp;quot; ([[&amp;quot;,trim(gd .. &amp;quot; &amp;quot; .. gm),&amp;quot;]]&amp;quot;,gm_sep[1],(gy:match(&amp;quot;(%d+)&amp;quot;) or &amp;quot;&amp;quot;),&lt;br /&gt;
		gm_sep[2],gy,gm_sep[3],&amp;quot;)&amp;quot;,category.incomplete_parameters})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- добавить отображение без года&lt;br /&gt;
local function double_couple(jdate, gdate, wd, wm, wy, sq_brts, yearmark)&lt;br /&gt;
	local msg = &amp;quot;&amp;quot;&lt;br /&gt;
	msg = (jdate.msg or &amp;quot;&amp;quot;) .. (gdate.msg or &amp;quot;&amp;quot;)&lt;br /&gt;
	local cd = {}&lt;br /&gt;
	local jd = shallowcopy(jdate)&lt;br /&gt;
	local gd = shallowcopy(gdate)&lt;br /&gt;
	local left = &amp;quot;(&amp;quot;&lt;br /&gt;
	local right = &amp;quot;)&amp;quot;&lt;br /&gt;
	if sq_brts then &lt;br /&gt;
		left = &amp;quot;&amp;amp;#091;&amp;quot;&lt;br /&gt;
		right = &amp;quot;&amp;amp;#093;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if (not isdate(jdate,true)) then return error((jdate.day or &amp;quot;&amp;quot;) .. &amp;quot;.&amp;quot; .. (jdate.month or &amp;quot;&amp;quot;) ..&amp;quot;.&amp;quot; .. (jdate.year or &amp;quot;&amp;quot;) .. &amp;quot; неподходящая дата&amp;quot;)&lt;br /&gt;
	elseif (not isdate(gdate)) then return error((gdate.day or &amp;quot;&amp;quot;) .. &amp;quot;.&amp;quot; .. (gdate.month or &amp;quot;&amp;quot;) ..&amp;quot;.&amp;quot; .. (gdate.year or &amp;quot;&amp;quot;) .. &amp;quot; неподходящая дата&amp;quot;) end&lt;br /&gt;
	if jd.year == gd.year then&lt;br /&gt;
		cd.year = gd.year&lt;br /&gt;
		gd.year, jd.year = nil, nil&lt;br /&gt;
	end&lt;br /&gt;
	if jd.month == gd.month then&lt;br /&gt;
		cd.month = gd.month&lt;br /&gt;
		gd.month, jd.month = nil, nil&lt;br /&gt;
	end	&lt;br /&gt;
	if (not not cd.month) and wm then &lt;br /&gt;
		return tCon({comment[1] .. trim(day2lang(jd,jdate,false) .. &amp;quot; &amp;quot; .. year2lang(jd.year,yearmark,false)) .. comment[2], &lt;br /&gt;
		trim(left .. day2lang(gd,gdate,wd,wm) .. &amp;quot; &amp;quot; .. year2lang(gd.year,yearmark,wy)) .. right, &lt;br /&gt;
		day2lang(cd,gdate,false) .. &amp;quot;]]&amp;quot;, trim(year2lang(cd.year,yearmark,wy)..msg)}, &amp;quot; &amp;quot;)&lt;br /&gt;
	end &lt;br /&gt;
	return tCon({comment[1] .. trim(day2lang(jd,jdate,false) .. &amp;quot; &amp;quot; .. year2lang(jd.year,yearmark,false)) .. comment[2], &lt;br /&gt;
		trim(left .. day2lang(gd,gdate,wd) .. &amp;quot; &amp;quot; .. year2lang(gd.year,yearmark,wy)) .. right, &lt;br /&gt;
		trim(day2lang(cd,gdate,false)), trim(year2lang(cd.year,yearmark,wy)..msg)}, &amp;quot; &amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- 40) Блок функций для перевода дат с использованием [[Юлианская дата]]&lt;br /&gt;
&lt;br /&gt;
local function gri2jd( datein )&lt;br /&gt;
	if not isdate(datein) then return error((datein.day or &amp;quot;&amp;quot;) .. &amp;quot;.&amp;quot; .. (datein.month or &amp;quot;&amp;quot;) ..&amp;quot;.&amp;quot; .. (datein.year or &amp;quot;&amp;quot;) .. &amp;quot; неподходящая дата&amp;quot;) end&lt;br /&gt;
    local year = datein.year&lt;br /&gt;
    local month = datein.month&lt;br /&gt;
    local day = datein.day&lt;br /&gt;
    -- jd calculation&lt;br /&gt;
    local a = math.floor((14 - month)/12)&lt;br /&gt;
    local y = year + 4800 - a&lt;br /&gt;
    local m = month + 12*a - 3&lt;br /&gt;
    local offset = math.floor(y/4) - math.floor(y/100) + math.floor(y/400) - 32045&lt;br /&gt;
    local jd = day + math.floor((153*m + 2)/5) + 365*y + offset&lt;br /&gt;
    -- jd validation&lt;br /&gt;
    local low, high = -1931076.5, 5373557.49999&lt;br /&gt;
    if not (low &amp;lt;= jd and jd &amp;lt;= high) then&lt;br /&gt;
        return error((datein.day or &amp;quot;&amp;quot;) .. &amp;quot;.&amp;quot; .. (datein.month or &amp;quot;&amp;quot;) .. &amp;quot;.&amp;quot; .. (datein.year or &amp;quot;&amp;quot;) .. &amp;quot; выходит за пределы разрешённого диапазона&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
	return jd&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function jd2jul( jd )&lt;br /&gt;
	if type(jd) ~= &amp;quot;number&amp;quot; then return error(&amp;quot;Промежуточная переменная &amp;quot; .. (jd or &amp;quot;&amp;quot;) .. &amp;quot; не является числом&amp;quot;) end&lt;br /&gt;
    -- calendar date calculation&lt;br /&gt;
    local c = jd + 32082&lt;br /&gt;
    local d = math.floor((4*c + 3)/1461)&lt;br /&gt;
    local e = c - math.floor(1461*d/4)&lt;br /&gt;
    local m = math.floor((5*e + 2)/153)&lt;br /&gt;
    local year_out = d - 4800 + math.floor(m/10)&lt;br /&gt;
    local month_out = m + 3 - 12*math.floor(m/10)&lt;br /&gt;
    local day_out = e - math.floor((153*m + 2)/5) + 1&lt;br /&gt;
    -- output&lt;br /&gt;
    local dateout = {[&amp;quot;year&amp;quot;]=year_out, [&amp;quot;month&amp;quot;]=month_out, [&amp;quot;day&amp;quot;]=day_out}&lt;br /&gt;
    return dateout&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function jul2jd( datein )&lt;br /&gt;
	if not isdate(datein,true) then return error((datein.day or &amp;quot;&amp;quot;) .. &amp;quot;.&amp;quot; .. (datein.month or &amp;quot;&amp;quot;) ..&amp;quot;.&amp;quot;.. (datein.year or &amp;quot;&amp;quot;) .. &amp;quot; неподходящая дата&amp;quot;) end&lt;br /&gt;
    local year = datein.year&lt;br /&gt;
    local month = datein.month&lt;br /&gt;
    local day = datein.day&lt;br /&gt;
    -- jd calculation&lt;br /&gt;
    local a = math.floor((14 - month)/12)&lt;br /&gt;
    local y = year + 4800 - a&lt;br /&gt;
    local m = month + 12*a - 3&lt;br /&gt;
    local offset = math.floor(y/4) - 32083&lt;br /&gt;
    local jd = day + math.floor((153*m + 2)/5) + 365*y + offset&lt;br /&gt;
    -- jd validation&lt;br /&gt;
    local low, high = -1930999.5, 5373484.49999&lt;br /&gt;
    if not (low &amp;lt;= jd and jd &amp;lt;= high) then&lt;br /&gt;
        return error((datein.day or &amp;quot;&amp;quot;) .. &amp;quot;.&amp;quot; .. (datein.month or &amp;quot;&amp;quot;) ..&amp;quot;.&amp;quot; .. (datein.year or &amp;quot;&amp;quot;) .. &amp;quot; выходит за пределы разрешённого диапазона&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
	return jd&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function jd2gri( jd )&lt;br /&gt;
	if type(jd) ~= &amp;quot;number&amp;quot; then return error(&amp;quot;Промежуточная переменная &amp;quot; .. (jd or &amp;quot;&amp;quot;) .. &amp;quot; не является числом&amp;quot;) end&lt;br /&gt;
    -- calendar date calculation&lt;br /&gt;
    local a = jd + 32044&lt;br /&gt;
    local b = math.floor((4*a + 3) / 146097)&lt;br /&gt;
    local c = a - math.floor(146097*b/4)&lt;br /&gt;
    local d = math.floor((4*c+3)/1461)&lt;br /&gt;
    local e = c - math.floor(1461*d/4)&lt;br /&gt;
    local m = math.floor((5*e+2)/153)&lt;br /&gt;
    local day_out =  e - math.floor((153*m+2)/5)+1&lt;br /&gt;
    local month_out = m + 3 - 12*math.floor(m/10)&lt;br /&gt;
    local year_out = 100*b + d - 4800 + math.floor(m/10)&lt;br /&gt;
    -- output&lt;br /&gt;
    local dateout = {[&amp;quot;year&amp;quot;]=year_out, [&amp;quot;month&amp;quot;]=month_out, [&amp;quot;day&amp;quot;]=day_out}&lt;br /&gt;
    return dateout&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function astroyear(num, bc)&lt;br /&gt;
	if not num then return error()&lt;br /&gt;
	elseif type(num) ~= &amp;quot;number&amp;quot; then return error()&lt;br /&gt;
	end&lt;br /&gt;
	if num &amp;lt; 1 then return num end&lt;br /&gt;
	if not bc then return num&lt;br /&gt;
	else return 1 - num&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function recalc(datein,calend)&lt;br /&gt;
	if inlist(calend,params[1]) then &lt;br /&gt;
		return jd2jul(gri2jd(datein)), datein&lt;br /&gt;
   	elseif inlist(calend,params[2]) then&lt;br /&gt;
		return datein, jd2gri(jul2jd(datein))&lt;br /&gt;
   	else error(&amp;quot;Параметр &amp;quot; .. (calend or &amp;quot;&amp;quot;) .. &amp;quot; не опознан, разрешённые: &amp;quot; .. tCon(params[1],&amp;quot; &amp;quot;) .. &amp;quot; и &amp;quot; .. tCon(params[2],&amp;quot; &amp;quot;))&lt;br /&gt;
   	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- 50) Функции для обработки UTC&lt;br /&gt;
&lt;br /&gt;
local function utc(str,margin)&lt;br /&gt;
	local d = 1&lt;br /&gt;
	local dchar = &amp;quot;+&amp;quot;&lt;br /&gt;
	local beginning = &amp;quot;[[UTC&amp;quot;&lt;br /&gt;
	local ending = &amp;quot;]]&amp;quot;&lt;br /&gt;
	local cat = &amp;quot;&amp;quot;&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	local hmarg, timedec = 0, 0&lt;br /&gt;
	local mmarg = &amp;quot;00&amp;quot;&lt;br /&gt;
	local output = &amp;quot;&amp;quot;&lt;br /&gt;
-- checking type of input&lt;br /&gt;
	if not margin then margin = 0&lt;br /&gt;
	elseif type(tonumber(margin)) ~= &amp;#039;number&amp;#039; then&lt;br /&gt;
		output = &amp;quot;Can&amp;#039;t shift by &amp;quot; .. margin&lt;br /&gt;
		error(output)&lt;br /&gt;
	end&lt;br /&gt;
	if type(str) ~= &amp;#039;string&amp;#039; then&lt;br /&gt;
		error(&amp;quot;Нет входящей строки&amp;quot;)&lt;br /&gt;
	elseif str:byte(1) == 43 then&lt;br /&gt;
	elseif inbord(str:byte(1),48,57) then cat = &amp;quot;[[Категория:Википедия:Ошибка в часовом поясе НП]]&amp;quot;&lt;br /&gt;
	elseif str:byte(1) == 45 or string.sub(str,1,3) == &amp;quot;−&amp;quot; or string.sub(str,1,1)==&amp;quot;-&amp;quot; then d = -1&lt;br /&gt;
	else&lt;br /&gt;
		error(string.char(str:byte(1)) .. &amp;quot; недопустимый первый символ&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
-- parsing input&lt;br /&gt;
	for num in string.gmatch(str,&amp;quot;(%d+)&amp;quot;) do&lt;br /&gt;
        table.insert(nums,purif(num))&lt;br /&gt;
    end&lt;br /&gt;
	if #nums &amp;gt; 2 then error(&amp;quot;Ожидается всего 2 числа, а не &amp;quot; .. #nums)&lt;br /&gt;
	elseif #nums == 0 then error(&amp;quot;Необходимо что-то ввести&amp;quot;)&lt;br /&gt;
	elseif #nums == 1 then&lt;br /&gt;
		if inbord(nums[1],0,14) then timedec = d*nums[1] + margin&lt;br /&gt;
		else error(&amp;quot;Только часы от -14 до 14&amp;quot;) end&lt;br /&gt;
	elseif #nums == 2 then&lt;br /&gt;
		if not inbord(nums[1],0,14) then error(&amp;quot;Только часы от -14 до 14&amp;quot;)&lt;br /&gt;
		elseif not inbord(nums[2],0,59) then error(&amp;quot;Минуты только от 0 до 59&amp;quot;)&lt;br /&gt;
		else&lt;br /&gt;
			timedec = d*(nums[1] + nums[2]/60) + margin&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if tonumber(timedec) == purif(timedec) then hmarg = timedec&lt;br /&gt;
	else&lt;br /&gt;
		local h, m = math.modf(math.abs(timedec))&lt;br /&gt;
		hmarg = h&lt;br /&gt;
		mmarg = math.floor(m*60)&lt;br /&gt;
	end&lt;br /&gt;
	if timedec == 0 then&lt;br /&gt;
		dchar = &amp;quot;±&amp;quot;&lt;br /&gt;
	elseif timedec &amp;gt; 0 then&lt;br /&gt;
	elseif timedec &amp;lt; 0 then&lt;br /&gt;
		dchar = &amp;quot;&amp;amp;minus;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
-- output&lt;br /&gt;
	output = beginning .. dchar .. math.abs(hmarg) .. &amp;quot;:&amp;quot; .. string.format(&amp;quot;%02d&amp;quot;,mmarg) .. ending .. cat&lt;br /&gt;
	return output&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- 60) Блок функций ввода-вывода&lt;br /&gt;
&lt;br /&gt;
function p.NthDay( frame )&lt;br /&gt;
    local args = getArgs(frame, { frameOnly = true })&lt;br /&gt;
    local num, wday, mont, yea, format = &lt;br /&gt;
    	purif(args[1]), purif(args[2]), purif(args[3]), purif(args[4]), args[5]&lt;br /&gt;
	if not format then format = &amp;quot;%d.%m.%y&amp;quot; end&lt;br /&gt;
    if not inbord(num,-5,5) then &lt;br /&gt;
    	return error(&amp;quot;The number must be between -5 and 5&amp;quot;)&lt;br /&gt;
    elseif num == 0 then &lt;br /&gt;
    	return error(&amp;quot;The number must not be zero&amp;quot;) end&lt;br /&gt;
    if not inbord(wday,0,6) then &lt;br /&gt;
    	return error(&amp;quot;The day of the week must be between 0 and 6&amp;quot;) end&lt;br /&gt;
    if not inbord(mont,1,12) then &lt;br /&gt;
    	return error(&amp;quot;The month must be between 1 and 12&amp;quot;) end&lt;br /&gt;
    if not inbord(yea,0,9999) then &lt;br /&gt;
    	return error(&amp;quot;Wrong year number&amp;quot;) end&lt;br /&gt;
    if inbord(num,1,5) then&lt;br /&gt;
        local m_start = os.time{year=yea, month=mont, day=1, hour=0}&lt;br /&gt;
        local m_wds = tonumber(os.date(&amp;quot;%w&amp;quot;, m_start)) &lt;br /&gt;
        local start_shift = (&lt;br /&gt;
            (num - bool_to_number[wday &amp;gt;= m_wds]) * 7 &lt;br /&gt;
            - (m_wds - wday)&lt;br /&gt;
            ) * 24 * 60 * 60&lt;br /&gt;
        local tim = m_start + start_shift&lt;br /&gt;
        if tonumber(os.date(&amp;quot;%m&amp;quot;, tim)) == mont then&lt;br /&gt;
            return (os.date(format, tim))&lt;br /&gt;
        else&lt;br /&gt;
            return (err)&lt;br /&gt;
        end&lt;br /&gt;
    elseif inbord(num,-5,-1) then&lt;br /&gt;
        local m_end = os.time{year = yea, month = mont + 1, day = 1, hour = 0} - 24 * 60 * 60&lt;br /&gt;
        local m_wde = tonumber(os.date(&amp;quot;%w&amp;quot;, m_end))&lt;br /&gt;
        local end_shift = ((math.abs(num + 1) + bool_to_number[wday &amp;gt; m_wde]) * 7 &lt;br /&gt;
            + (m_wde - wday)) * 24 * 60 * 60&lt;br /&gt;
        local tim = m_end - end_shift&lt;br /&gt;
        if tonumber(os.date(&amp;quot;%m&amp;quot;, tim)) == mont then&lt;br /&gt;
            return (os.date(format, tim))&lt;br /&gt;
        else&lt;br /&gt;
            return (err)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =p.ToIso(mw.getCurrentFrame():newChild{title=&amp;quot;smth&amp;quot;,args={&amp;quot;12 декабря 2020&amp;quot;}})&lt;br /&gt;
-- =p.ToIso(mw.getCurrentFrame():newChild{title=&amp;quot;smth&amp;quot;,args={&amp;quot;1.2.1602&amp;quot;}})&lt;br /&gt;
-- =p.ToIso(mw.getCurrentFrame():newChild{title=&amp;quot;smth&amp;quot;,args={&amp;quot;12.12.2021&amp;quot;}})&lt;br /&gt;
-- =p.ToIso(mw.getCurrentFrame():newChild{title=&amp;quot;smth&amp;quot;,args={&amp;quot;2021.12.12&amp;quot;}})&lt;br /&gt;
function p.ToIso( frame ) &lt;br /&gt;
    local args = getArgs(frame, { frameOnly = true })&lt;br /&gt;
    local datein = args[1]&lt;br /&gt;
    -- инициализация, заполнение обратных таблиц, копирование параметров&lt;br /&gt;
	filling_months(mnlang, month_lang)&lt;br /&gt;
    -- парсинг входящей даты по шаблону&lt;br /&gt;
    local date = parse_date(datein)&lt;br /&gt;
    if not (type(date.year) == &amp;#039;number&amp;#039;) then &lt;br /&gt;
        return (&amp;quot;Wrong year: &amp;quot; .. unwarp(date))&lt;br /&gt;
    end&lt;br /&gt;
    if not (1 &amp;lt;= date.month and date.month &amp;lt;= 12) then &lt;br /&gt;
        return (&amp;quot;Wrong month: &amp;quot; .. unwarp(date))&lt;br /&gt;
    end&lt;br /&gt;
    if not date.day or not (1 &amp;lt;= date.day and date.day &amp;lt;= month_end_day(date.month,date.year)) then &lt;br /&gt;
        return (&amp;quot;Wrong day: &amp;quot; .. unwarp(date))&lt;br /&gt;
    end&lt;br /&gt;
    local timedate = os.time{year=date.year, month=date.month, day=date.day}&lt;br /&gt;
    local date = os.date(&amp;quot;%Y-%m-%d&amp;quot;, timedate)&lt;br /&gt;
    return date&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =p.BoxDate(mw.getCurrentFrame():newChild{title=&amp;quot;smth&amp;quot;,args={&amp;quot;12 декабря 2020&amp;quot;}})&lt;br /&gt;
-- =p.BoxDate(mw.getCurrentFrame():newChild{title=&amp;quot;smth&amp;quot;,args={&amp;quot;1.2.1602&amp;quot;}})&lt;br /&gt;
-- =p.BoxDate(mw.getCurrentFrame():newChild{title=&amp;quot;smth&amp;quot;,args={&amp;quot;декабрь 2020&amp;quot;}})&lt;br /&gt;
-- =p.BoxDate(mw.getCurrentFrame():newChild{title=&amp;quot;smth&amp;quot;,args={&amp;quot;12-2020&amp;quot;}})&lt;br /&gt;
-- =p.BoxDate(mw.getCurrentFrame():newChild{title=&amp;quot;smth&amp;quot;,args={&amp;quot;12.12.2021&amp;quot;}})&lt;br /&gt;
-- =p.BoxDate(mw.getCurrentFrame():newChild{title=&amp;quot;smth&amp;quot;,args={&amp;quot;2021.12.12&amp;quot;}})&lt;br /&gt;
-- =p.BoxDate(mw.getCurrentFrame():newChild{title=&amp;quot;smth&amp;quot;,args={&amp;quot;2021.11&amp;quot;}})&lt;br /&gt;
-- =p.BoxDate(mw.getCurrentFrame():newChild{title=&amp;quot;smth&amp;quot;,args={&amp;quot;11.2021&amp;quot;}})&lt;br /&gt;
function p.BoxDate( frame ) &lt;br /&gt;
    local args = getArgs(frame, { frameOnly = true })&lt;br /&gt;
    local txtDateIn, strFormat  = args[1], args[2]&lt;br /&gt;
    local txtDateOut, date, status = p.bxDate(txtDateIn, strFormat, params)&lt;br /&gt;
	if status.brk then&lt;br /&gt;
		return error(status.errorText)&lt;br /&gt;
	else&lt;br /&gt;
		return txtDateOut&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.bxDate( txtDateIn , strFormat, params ) -- к отладке&lt;br /&gt;
	local txtDateOut, date, status = &amp;quot;&amp;quot;, {}, {brk = false, errorCat = &amp;quot;&amp;quot;, errorText = &amp;quot;&amp;quot;}&lt;br /&gt;
	strFormat = strFormat or &amp;quot;j xg Y&amp;quot;&lt;br /&gt;
	-- заглушка - таблица параметров на будущее&lt;br /&gt;
	params = params or {}&lt;br /&gt;
	if not txtDateIn then &lt;br /&gt;
		status.errorText = e.no_data&lt;br /&gt;
		status.errorCat = category.no_parameters&lt;br /&gt;
		status.brk = true&lt;br /&gt;
	else&lt;br /&gt;
		-- заполнение служебных таблиц&lt;br /&gt;
		filling_months(mnlang, month_lang)&lt;br /&gt;
	end&lt;br /&gt;
	if not status.brk then&lt;br /&gt;
		-- парсинг входящей даты по шаблону&lt;br /&gt;
		date = parse_date(txtDateIn)&lt;br /&gt;
	    -- заменить сообщения об ошибках на списочные&lt;br /&gt;
	    if not (date.year and type(date.year) == &amp;#039;number&amp;#039;) then &lt;br /&gt;
	    	status.errorText = string.format(e.box_date,txtDateIn)&lt;br /&gt;
	    	status.errorCat = category.incomplete_parameters&lt;br /&gt;
	    	status.brk = true&lt;br /&gt;
	    end&lt;br /&gt;
	    if not inbord(date.month,1,12) then &lt;br /&gt;
	    	status.errorText = string.format(e.box_date,txtDateIn)&lt;br /&gt;
	    	status.errorCat = category.incomplete_parameters&lt;br /&gt;
	    	status.brk = true&lt;br /&gt;
	    end&lt;br /&gt;
	    if not date.day and string.find(strFormat,&amp;quot;[dDjlNwzW]&amp;quot;) then&lt;br /&gt;
	    	strFormat = trim(string.gsub(string.gsub(strFormat,&amp;quot;xg&amp;quot;,&amp;quot;F&amp;quot;),&amp;quot;[dDjlNwzW]&amp;quot;,&amp;quot;&amp;quot;))&lt;br /&gt;
	    elseif not date.day then&lt;br /&gt;
	    elseif not inbord(date.day,1,month_end_day(date.month,date.year)) then &lt;br /&gt;
	    	status.errorText = string.format(e.box_date,txtDateIn)&lt;br /&gt;
	    	status.errorCat = category.incomplete_parameters&lt;br /&gt;
	    	status.brk = true&lt;br /&gt;
	    end&lt;br /&gt;
	end&lt;br /&gt;
	if not status.brk then&lt;br /&gt;
		txtDateOut = mwlang:formatDate(strFormat,tCon({date.year,date.month,date.day},&amp;quot;-&amp;quot;),true)&lt;br /&gt;
	end&lt;br /&gt;
    return txtDateOut, date, status&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.ToDate( frame ) -- возможно неиспользуемая&lt;br /&gt;
    local args = getArgs(frame, { frameOnly = true })&lt;br /&gt;
    local mwlang = mw.getContentLanguage()&lt;br /&gt;
    local datein = args[1]&lt;br /&gt;
    local format = &amp;quot;j xg Y&amp;quot;&lt;br /&gt;
    if not string.match(datein, &amp;quot;%p&amp;quot;) then return datein&lt;br /&gt;
    elseif not args[2] then&lt;br /&gt;
    else format = args[2]&lt;br /&gt;
    end&lt;br /&gt;
    return mwlang:formatDate(format,datein,true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =p.unitime(mw.getCurrentFrame():newChild{title=&amp;quot;smth&amp;quot;,args={&amp;quot;−1:30&amp;quot;,&amp;quot;1&amp;quot;}})&lt;br /&gt;
&lt;br /&gt;
function p.unitime( frame )&lt;br /&gt;
    local args = getArgs(frame, { frameOnly = true })&lt;br /&gt;
    local DST = 0&lt;br /&gt;
    if not args[2] then &lt;br /&gt;
    else DST = 1 end&lt;br /&gt;
    local utcin = &amp;quot;&amp;quot;&lt;br /&gt;
    local input = args[1]&lt;br /&gt;
    if not input then return &amp;quot;&amp;quot; end&lt;br /&gt;
    if inlist(input:upper(),tzs_names) then &lt;br /&gt;
    	utcin = known_tzs[input:upper()] &lt;br /&gt;
    elseif (string.sub(input:upper(),1,3) == &amp;#039;UTC&amp;#039;) and (string.len(input) &amp;lt; 10) then&lt;br /&gt;
    	utcin = string.sub(input,4)&lt;br /&gt;
    else &lt;br /&gt;
    	if string.sub(input,1,1) == &amp;#039;[&amp;#039; &lt;br /&gt;
        or string.sub(input,1,1) == &amp;#039;{&amp;#039; &lt;br /&gt;
        or string.sub(input,1,1):upper() == &amp;#039;U&amp;#039; &lt;br /&gt;
        or string.sub(input,1,1):upper() == &amp;#039;M&amp;#039; then&lt;br /&gt;
    	    return input &lt;br /&gt;
--      elseif not string.find(string.upper(string.sub(input,1,1)),&amp;quot;[\65-\90]&amp;quot;) or&lt;br /&gt;
--      not string.find(string.upper(string.sub(input,1,1)),&amp;quot;[\192-\223]&amp;quot;) then&lt;br /&gt;
--    	return input&lt;br /&gt;
    	else utcin = input end &lt;br /&gt;
    end&lt;br /&gt;
--  elseif string.sub(input,1,3) ~= &amp;quot;−&amp;quot; then utcin = input&lt;br /&gt;
--  or not (not input:find(&amp;quot;[А-я]&amp;quot;)) при наличии в строке юникода не работает&lt;br /&gt;
    local output = &amp;quot;&amp;quot;&lt;br /&gt;
    if DST == 0 then output = utc(utcin)&lt;br /&gt;
    else output = utc(utcin) .. &amp;quot;, [[летнее время|летом]] &amp;quot; .. utc(utcin,DST)&lt;br /&gt;
    end&lt;br /&gt;
    return output&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- УСТАРЕЛО&lt;br /&gt;
-- =p.OldDate(mw.getCurrentFrame():newChild{title=&amp;quot;smth&amp;quot;,args={&amp;quot;20.02.2020&amp;quot;,&amp;quot;ю&amp;quot;,[&amp;quot;bc&amp;quot;]=&amp;quot;1&amp;quot;,[&amp;quot;wd&amp;quot;]=&amp;quot;1&amp;quot;,[&amp;quot;wy&amp;quot;]=&amp;quot;1&amp;quot;,[&amp;quot;sq_brts&amp;quot;]=&amp;quot;1&amp;quot;,[&amp;quot;yearmark&amp;quot;]=&amp;quot;г.&amp;quot;}})&lt;br /&gt;
function p.OldDate( frame )&lt;br /&gt;
    local args = getArgs(frame, { frameOnly = true })&lt;br /&gt;
    if not args[1] then return err end&lt;br /&gt;
    local gdate, jdate = {}, {}&lt;br /&gt;
    local strin = args[1] &lt;br /&gt;
    local cal = args[2]:lower() or &amp;quot;г&amp;quot;&lt;br /&gt;
    local bc = is(args[&amp;quot;bc&amp;quot;])&lt;br /&gt;
    local wd = is(args[&amp;quot;wd&amp;quot;])&lt;br /&gt;
    local wm = is(args[&amp;quot;wm&amp;quot;])&lt;br /&gt;
    local wy = is(args[&amp;quot;wy&amp;quot;])&lt;br /&gt;
    if not wd then wm = false end&lt;br /&gt;
    local sq_brts = is(args[&amp;quot;sq_brts&amp;quot;])&lt;br /&gt;
    local yearmark = &amp;quot;года&amp;quot;&lt;br /&gt;
    if yesno(args[&amp;quot;yearmark&amp;quot;]) then&lt;br /&gt;
    elseif yesno(args[&amp;quot;yearmark&amp;quot;]) == false then yearmark = &amp;quot;&amp;quot;&lt;br /&gt;
    else yearmark = trim(args[&amp;quot;yearmark&amp;quot;]) or &amp;quot;года&amp;quot; end&lt;br /&gt;
--  local infocard = is(args[&amp;quot;infocard&amp;quot;])&lt;br /&gt;
--  local catName = args[&amp;quot;catName&amp;quot;] or false&lt;br /&gt;
    local datein = numstr2date(strin)&lt;br /&gt;
    datein.year = astroyear(datein.year, bc)&lt;br /&gt;
    jdate, gdate = recalc(datein,cal)&lt;br /&gt;
	return double_couple(jdate, gdate, wd, wm, wy, sq_brts, yearmark)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =p.NewDate(mw.getCurrentFrame():newChild{title=&amp;quot;Salt&amp;quot;,args={&amp;quot;2020-02-20&amp;quot;}})&lt;br /&gt;
-- =p.NewDate(mw.getCurrentFrame():newChild{title=&amp;quot;smth&amp;quot;,args={&amp;quot;20.02.2020&amp;quot;,&amp;quot;ю&amp;quot;,[&amp;quot;bc&amp;quot;]=&amp;quot;1&amp;quot;,[&amp;quot;wd&amp;quot;]=&amp;quot;1&amp;quot;,[&amp;quot;wy&amp;quot;]=&amp;quot;1&amp;quot;,[&amp;quot;sq_brts&amp;quot;]=&amp;quot;1&amp;quot;,[&amp;quot;yearmark&amp;quot;]=&amp;quot;г.&amp;quot;}})&lt;br /&gt;
-- =p.NewDate(mw.getCurrentFrame():newChild{title=&amp;quot;smth&amp;quot;,args={&amp;quot;20.02.2020&amp;quot;,[&amp;quot;bc&amp;quot;]=&amp;quot;0&amp;quot;,[&amp;quot;wd&amp;quot;]=&amp;quot;1&amp;quot;,[&amp;quot;wy&amp;quot;]=&amp;quot;1&amp;quot;,[&amp;quot;sq_brts&amp;quot;]=&amp;quot;0&amp;quot;,[&amp;quot;yearmark&amp;quot;]=&amp;quot;&amp;quot;}})&lt;br /&gt;
function p.NewDate( frame )&lt;br /&gt;
    local args = getArgs(frame, { frameOnly = true })&lt;br /&gt;
    if not args[1] then return err end&lt;br /&gt;
	local strin = args[1] &lt;br /&gt;
    local year, month, day&lt;br /&gt;
    if     not not strin:match( &amp;quot;(-?%d%d%d%d%d)-(%d%d)-(%d%d)&amp;quot; ) then&lt;br /&gt;
    	year, month, day = strin:match( &amp;quot;(-?%d%d%d%d%d)-(%d%d)-(%d%d)&amp;quot; )&lt;br /&gt;
    elseif not not strin:match( &amp;quot;(-?%d+)-(%d+)-(%d+)&amp;quot; ) then&lt;br /&gt;
    	year, month, day = strin:match( &amp;quot;(-?%d+)-(%d+)-(%d+)&amp;quot; )&lt;br /&gt;
    elseif not not strin:match( &amp;quot;(%d%d)%.(%d%d)%.(-?%d%d%d%d%d)&amp;quot; ) then&lt;br /&gt;
    	day, month, year = strin:match( &amp;quot;(%d%d)%.(%d%d)%.(-?%d%d%d%d%d)&amp;quot; )&lt;br /&gt;
    elseif not not strin:match( &amp;quot;(%d+)%.(%d+)%.(-?%d+)&amp;quot; ) then&lt;br /&gt;
    	day, month, year = strin:match( &amp;quot;(%d+)%.(%d+)%.(-?%d+)&amp;quot; )&lt;br /&gt;
	end&lt;br /&gt;
	if not year then return error(args[1] .. &amp;quot; не подходит под форматы yyyy-mm-dd или dd.mm.yyyy&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local cal = &amp;quot;г&amp;quot;&lt;br /&gt;
	if (not args[2]) or (args[2] == &amp;quot;&amp;quot;) then cal = &amp;quot;г&amp;quot;&lt;br /&gt;
	else cal = args[2]:lower() end&lt;br /&gt;
&lt;br /&gt;
	local bc,wd,wm,wy,sq_brts = &lt;br /&gt;
		is(args[&amp;quot;bc&amp;quot;]),&lt;br /&gt;
		is(args[&amp;quot;wd&amp;quot;]),&lt;br /&gt;
		is(args[&amp;quot;wd&amp;quot;]) and is(args[&amp;quot;wm&amp;quot;]),&lt;br /&gt;
		is(args[&amp;quot;wy&amp;quot;]),&lt;br /&gt;
		is(args[&amp;quot;sq_brts&amp;quot;])&lt;br /&gt;
		&lt;br /&gt;
	year = astroyear(purif(year),bc)&lt;br /&gt;
	local datein = {[&amp;quot;year&amp;quot;]=purif(year), [&amp;quot;month&amp;quot;]=purif(month), [&amp;quot;day&amp;quot;]=purif(day)}&lt;br /&gt;
&lt;br /&gt;
	local jdate, gdate = recalc(datein,cal)&lt;br /&gt;
&lt;br /&gt;
    local yearmark = &amp;quot;года&amp;quot;&lt;br /&gt;
    local ym = args[&amp;quot;yearmark&amp;quot;] or &amp;quot;&amp;quot;&lt;br /&gt;
    if yesno(ym) then&lt;br /&gt;
    elseif yesno(ym) == false then yearmark = &amp;quot;&amp;quot; &lt;br /&gt;
    else&lt;br /&gt;
    	if not not ym:match(&amp;quot;(%d+)&amp;quot;) then &lt;br /&gt;
    		error(&amp;quot;Цифры в обозначении года: &amp;quot; .. ym)&lt;br /&gt;
    	else yearmark = trim(ym) or &amp;quot;года&amp;quot; end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
	return double_couple(jdate, gdate, wd, wm, wy, sq_brts, yearmark)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- =p.Test(mw.getCurrentFrame():newChild{title=&amp;quot;smth&amp;quot;,args={}})&lt;br /&gt;
-- =p.Test(mw.getCurrentFrame():newChild{title=&amp;quot;smth&amp;quot;,args={&amp;quot;3&amp;quot;,&amp;quot;июня&amp;quot;,nil,&amp;quot;21&amp;quot;,&amp;quot;мая&amp;quot;}})&lt;br /&gt;
-- =p.Test(mw.getCurrentFrame():newChild{title=&amp;quot;smth&amp;quot;,args={&amp;quot;28 августа&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;1916 года&amp;quot;,&amp;quot;15&amp;quot;}})&lt;br /&gt;
-- =p.Test(mw.getCurrentFrame():newChild{title=&amp;quot;smth&amp;quot;,args={&amp;quot;3&amp;quot;,&amp;quot;июня&amp;quot;,&amp;quot;1900&amp;quot;,&amp;quot;21&amp;quot;,&amp;quot;мая&amp;quot;}})&lt;br /&gt;
-- =p.Test(mw.getCurrentFrame():newChild{title=&amp;quot;smth&amp;quot;,args={&amp;quot;6&amp;quot;,&amp;quot;июня&amp;quot;,&amp;quot;1889 год&amp;quot;,&amp;quot;25&amp;quot;,&amp;quot;мая&amp;quot;}}) &lt;br /&gt;
-- =p.Test(mw.getCurrentFrame():newChild{title=&amp;quot;smth&amp;quot;,args={&amp;quot;28&amp;quot;,&amp;quot;ноября&amp;quot;,&amp;quot;1917&amp;quot;,&amp;quot;15&amp;quot;}})&lt;br /&gt;
-- =p.Test(mw.getCurrentFrame():newChild{title=&amp;quot;smth&amp;quot;,args={&amp;quot;28 августа&amp;quot;,&amp;quot;nil&amp;quot;,&amp;quot;1916 года&amp;quot;,&amp;quot;15&amp;quot;}}) &lt;br /&gt;
-- =p.Test(mw.getCurrentFrame():newChild{title=&amp;quot;smth&amp;quot;,args={&amp;quot;4&amp;quot;,&amp;quot;января&amp;quot;,&amp;quot;1915&amp;quot;,&amp;quot;22&amp;quot;,&amp;quot;декабря&amp;quot;,&amp;quot;1914 года&amp;quot;}}) &lt;br /&gt;
-- {{OldStyleDate|день (НС)|месяц (НС)|год (НС)|день (СС)|месяц (СС)|год (СС)}}&lt;br /&gt;
&lt;br /&gt;
function p.Test( frame )&lt;br /&gt;
	local args = getArgs(frame, { frameOnly = true })&lt;br /&gt;
	-- необходима проверка и замена nil на &amp;quot; &amp;quot;&lt;br /&gt;
--[[mw.log((args[1] or &amp;quot;&amp;quot;) .. &amp;quot; &amp;quot; .. &lt;br /&gt;
		(args[2] or &amp;quot;&amp;quot;) .. &amp;quot; &amp;quot; .. &lt;br /&gt;
		(args[3] or &amp;quot;&amp;quot;) .. &amp;quot; &amp;quot; .. &lt;br /&gt;
		(args[4] or &amp;quot;&amp;quot;) .. &amp;quot; &amp;quot; .. &lt;br /&gt;
		(args[5] or &amp;quot;&amp;quot;) .. &amp;quot; &amp;quot; .. &lt;br /&gt;
		(args[6] or &amp;quot;&amp;quot;)) ]]--&lt;br /&gt;
	local ingdate = triple_txt2date(args[1],args[2],args[3])&lt;br /&gt;
	local injdate = triple_txt2date(args[4],args[5],args[6])&lt;br /&gt;
	local j1date, g1date, j2date, g2date = init(4)&lt;br /&gt;
		mw.log(&amp;quot;ingdate-&amp;quot;.. (undate(ingdate) or &amp;quot;&amp;quot;))&lt;br /&gt;
		mw.log(&amp;quot;injdate-&amp;quot;.. (undate(injdate) or &amp;quot;&amp;quot;))&lt;br /&gt;
	local bc,wd,wm,wy,sq_brts,ny = &lt;br /&gt;
		is(args[&amp;quot;bc&amp;quot;]),&lt;br /&gt;
		is(args[&amp;quot;wd&amp;quot;]),&lt;br /&gt;
		is(args[&amp;quot;wd&amp;quot;]) and is(args[&amp;quot;wm&amp;quot;]),&lt;br /&gt;
		is(args[&amp;quot;wy&amp;quot;]),&lt;br /&gt;
		is(args[&amp;quot;sq_brts&amp;quot;]),&lt;br /&gt;
		is(args[&amp;quot;ny&amp;quot;])&lt;br /&gt;
	-- подавление формата для локальных тестов&lt;br /&gt;
    local wd, wm, wy = true, true, true&lt;br /&gt;
    &lt;br /&gt;
    local yearmark = &amp;quot;года&amp;quot; &lt;br /&gt;
    local ym = args[&amp;quot;yearmark&amp;quot;] or ((mw.ustring.match((args[3] or &amp;quot;&amp;quot;),&amp;quot;(%a+)&amp;quot;) or mw.ustring.match((args[6] or &amp;quot;&amp;quot;),&amp;quot;(%a+)&amp;quot;)) or &amp;quot;&amp;quot;)&lt;br /&gt;
    -- mw.log(&amp;quot;ym &amp;quot; .. ym)&lt;br /&gt;
    if yesno(ym) then&lt;br /&gt;
    elseif yesno(ym) == false then yearmark = &amp;quot;&amp;quot; &lt;br /&gt;
    else&lt;br /&gt;
    	if not not ym:match(&amp;quot;(%d+)&amp;quot;) then &lt;br /&gt;
    		error(&amp;quot;Цифры в обозначении года: &amp;quot; .. ym)&lt;br /&gt;
    	else yearmark = trim(ym) or &amp;quot;года&amp;quot; end&lt;br /&gt;
    end&lt;br /&gt;
    if isdate(ingdate) or isdate(injdate) then&lt;br /&gt;
		if isdate(ingdate) then&lt;br /&gt;
			j1date, g1date = recalc(ingdate,&amp;quot;g&amp;quot;)&lt;br /&gt;
			ingdate[&amp;quot;full&amp;quot;] = true&lt;br /&gt;
		end&lt;br /&gt;
		if isdate(injdate) then&lt;br /&gt;
			j2date, g2date = recalc(injdate,&amp;quot;j&amp;quot;)&lt;br /&gt;
			injdate[&amp;quot;full&amp;quot;] = true&lt;br /&gt;
		end&lt;br /&gt;
		if ispartdate(ingdate) and ispartdate(injdate) then&lt;br /&gt;
			mw.log(&amp;quot;📏 &amp;quot; .. dmdist(ingdate,injdate))&lt;br /&gt;
			mw.log(&amp;quot;📏 &amp;quot; .. dmdist(j1date,g1date))&lt;br /&gt;
			mw.log(&amp;quot;📏 &amp;quot; .. dmdist(j2date,g2date))&lt;br /&gt;
			mw.log(&amp;quot;📏 &amp;quot; .. dmdist(ingdate,g1date))&lt;br /&gt;
			mw.log(&amp;quot;📏 &amp;quot; .. dmdist(injdate,j2date))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if ny then &lt;br /&gt;
		if isyear(j1date) then&lt;br /&gt;
		else j1date[&amp;quot;year&amp;quot;] = &amp;quot;&amp;quot; end&lt;br /&gt;
		if isyear(j2date) == nil then&lt;br /&gt;
		else j2date[&amp;quot;year&amp;quot;] = &amp;quot;&amp;quot; end&lt;br /&gt;
		if isyear(g1date) == nil then&lt;br /&gt;
		else g1date[&amp;quot;year&amp;quot;] = &amp;quot;&amp;quot; end&lt;br /&gt;
		if isyear(g2date) == nil then&lt;br /&gt;
		else g2date[&amp;quot;year&amp;quot;] = &amp;quot;&amp;quot; end&lt;br /&gt;
	end&lt;br /&gt;
	if (isdate(j1date) and isdate(g1date) and isdate(j2date) and isdate(g2date)) then&lt;br /&gt;
		if ((j1date.year == j2date.year)&lt;br /&gt;
		and (j1date.month == j2date.month)&lt;br /&gt;
		and (j1date.day == j2date.day)) then&lt;br /&gt;
			return double_couple(j1date, g1date, wd, wm, wy, sq_brts, yearmark)&lt;br /&gt;
		else &lt;br /&gt;
			mw.log(&amp;quot;📏 &amp;quot; .. (tostring(dmdist(ingdate,injdate)) or &amp;quot;&amp;quot;))&lt;br /&gt;
			return glue(args[1],args[2],args[3],args[4],args[5],args[6])  &lt;br /&gt;
			-- категория (предположительная разница в днях) и частичный вывод&lt;br /&gt;
		end&lt;br /&gt;
	elseif isdate(j1date) and isdate(g1date) then&lt;br /&gt;
		return double_couple(j1date, g1date, wd, wm, wy, sq_brts, yearmark) -- категория плюс частичная проверка&lt;br /&gt;
	elseif isdate(j2date) and isdate(g2date) then&lt;br /&gt;
		return double_couple(j2date, g2date, wd, wm, wy, sq_brts, yearmark) -- категория плюс частичная проверка&lt;br /&gt;
	elseif (ispartdate(ingdate) and ispartdate(injdate)) then&lt;br /&gt;
		mw.log(&amp;quot;ingdate &amp;quot;.. (undate(ingdate) or &amp;quot;&amp;quot;))&lt;br /&gt;
		mw.log(&amp;quot;injdate &amp;quot;.. (undate(injdate) or &amp;quot;&amp;quot;))&lt;br /&gt;
		mw.log(&amp;quot;j1date &amp;quot; .. (undate(j1date ) or &amp;quot;&amp;quot;))&lt;br /&gt;
		mw.log(&amp;quot;j2date &amp;quot; .. (undate(j2date ) or &amp;quot;&amp;quot;))&lt;br /&gt;
		mw.log(&amp;quot;g1date &amp;quot; .. (undate(g1date ) or &amp;quot;&amp;quot;))&lt;br /&gt;
		mw.log(&amp;quot;g2date &amp;quot; .. (undate(g2date ) or &amp;quot;&amp;quot;))&lt;br /&gt;
		mw.log(&amp;quot;📏 &amp;quot; .. (tostring(partdist(ingdate,injdate)) or &amp;quot;&amp;quot;).. &amp;quot; — &amp;quot; .. (tostring(partdist(injdate,ingdate)) or &amp;quot;&amp;quot;))&lt;br /&gt;
		return glue(args[1],args[2],args[3],args[4],args[5],args[6]) &lt;br /&gt;
		-- частичный или полный вывод, категория&lt;br /&gt;
	else &lt;br /&gt;
		mw.log(&amp;quot;ingdate &amp;quot;.. (undate(ingdate) or &amp;quot;&amp;quot;))&lt;br /&gt;
		mw.log(&amp;quot;injdate &amp;quot;.. (undate(injdate) or &amp;quot;&amp;quot;))&lt;br /&gt;
		mw.log(&amp;quot;j1date &amp;quot; .. (undate(j1date ) or &amp;quot;&amp;quot;))&lt;br /&gt;
		mw.log(&amp;quot;j2date &amp;quot; .. (undate(j2date ) or &amp;quot;&amp;quot;))&lt;br /&gt;
		mw.log(&amp;quot;g1date &amp;quot; .. (undate(g1date ) or &amp;quot;&amp;quot;))&lt;br /&gt;
		mw.log(&amp;quot;g2date &amp;quot; .. (undate(g2date ) or &amp;quot;&amp;quot;))&lt;br /&gt;
		return err .. category.incomplete_parameters&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
</feed>