<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.chemsoft.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sonikku</id>
	<title>Химсофт Вики - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.chemsoft.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sonikku"/>
	<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php/%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/Sonikku"/>
	<updated>2026-04-17T21:24:13Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0&amp;diff=1226</id>
		<title>Заглавная страница</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0&amp;diff=1226"/>
		<updated>2026-02-20T04:12:52Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==[[Справочник разработчика ЛИС]]==&lt;br /&gt;
&lt;br /&gt;
==[[Руководство по настройке шаблонов WEB ЛИМС Тритея]]==&lt;br /&gt;
&lt;br /&gt;
==[[Основные управляющие функции в дизайнере документов ЛИС 1.5]]==&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Lis_icon.png&amp;diff=554</id>
		<title>Файл:Lis icon.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Lis_icon.png&amp;diff=554"/>
		<updated>2026-01-20T05:55:08Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Логотип «Тритеи»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Краткое описание ==&lt;br /&gt;
Логотип «Тритеи»&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0&amp;diff=553</id>
		<title>Заглавная страница</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0&amp;diff=553"/>
		<updated>2026-01-20T04:56:32Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Защитил страницу Заглавная страница ([Редактирование=Разрешено только администраторам] (бессрочно) [Переименование=Разрешено только администраторам] (бессрочно)) [каскадная]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==[[Справочник разработчика ЛИС]]==&lt;br /&gt;
&lt;br /&gt;
==[[Справочник WEB ЛИМС Тритея]]==&lt;br /&gt;
&lt;br /&gt;
===Сервисная информация===&lt;br /&gt;
*Информацию по работе с этой вики можно найти в [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents справочном руководстве].&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Список возможных настроек];&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Manual:FAQ/ru Часто задаваемые вопросы и ответы по MediaWiki];&lt;br /&gt;
* [https://lists.wikimedia.org/postorius/lists/mediawiki-announce.lists.wikimedia.org/ Рассылка уведомлений о выходе новых версий MediaWiki].&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Перевод MediaWiki на свой язык]&lt;br /&gt;
* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Узнайте, как бороться со спамом в вашей вики]&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:Navbox&amp;diff=552</id>
		<title>Шаблон:Navbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:Navbox&amp;diff=552"/>
		<updated>2026-01-20T04:48:22Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Защитил страницу Шаблон:Navbox ([Редактирование=Разрешено только администраторам] (бессрочно) [Переименование=Разрешено только администраторам] (бессрочно)) [каскадная]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{#invoke:Navbox|navbox}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:Hlist&amp;diff=551</id>
		<title>Шаблон:Hlist</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:Hlist&amp;diff=551"/>
		<updated>2026-01-20T04:48:10Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Защитил страницу Шаблон:Hlist ([Редактирование=Разрешено только администраторам] (бессрочно) [Переименование=Разрешено только администраторам] (бессрочно)) [каскадная]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{&amp;lt;includeonly&amp;gt;safesubst:&amp;lt;/includeonly&amp;gt;#invoke:list|horizontal}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%91%D0%BB%D0%BE%D0%BA_%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%92%D0%B5%D0%B1%D0%9B%D0%98%D0%9C%D0%A1_%C2%AB%D0%A2%D1%80%D0%B8%D1%82%D0%B5%D1%8F%C2%BB&amp;diff=550</id>
		<title>Шаблон:Блок документов ВебЛИМС «Тритея»</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%91%D0%BB%D0%BE%D0%BA_%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%92%D0%B5%D0%B1%D0%9B%D0%98%D0%9C%D0%A1_%C2%AB%D0%A2%D1%80%D0%B8%D1%82%D0%B5%D1%8F%C2%BB&amp;diff=550"/>
		<updated>2026-01-20T04:47:36Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Защитил страницу Шаблон:Блок документов ВебЛИМС «Тритея» ([Редактирование=Разрешено только администраторам] (бессрочно) [Переименование=Разрешено только администраторам] (бессрочно)) [каскадная]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Navbox&lt;br /&gt;
|name = Блок документов&lt;br /&gt;
|state = collapsed&lt;br /&gt;
|title = Блок документов&lt;br /&gt;
|bodyclass = hlist&lt;br /&gt;
&lt;br /&gt;
|group1 = Дизайнер документов&lt;br /&gt;
&lt;br /&gt;
|list1 = child&lt;br /&gt;
| 1_group1 = Контролы&lt;br /&gt;
| 1_list1 = &lt;br /&gt;
* [[Текстовое поле|Текстовое поле]]&lt;br /&gt;
* [[Форматированный текст|Форматированный текст]]&lt;br /&gt;
* [[Таблица|Таблица]]&lt;br /&gt;
* [[Табликс|Табликс]]&lt;br /&gt;
&lt;br /&gt;
| 1_group2 = Стандартные формы&lt;br /&gt;
| 1_list2 = {{Navbox|subgroup&lt;br /&gt;
| group1 = Персонал (картотека)&lt;br /&gt;
| list1 =&lt;br /&gt;
* [[Сведения о работниках лаборатории|Сведения о работниках лаборатории]]&lt;br /&gt;
* [[Общая информация о сотрудниках|Общая информация о сотрудниках]]&lt;br /&gt;
* [[Карточка персонального учета сотрудника|Карточка персонального учета сотрудника]]&lt;br /&gt;
* [[Информация об уволенных сотрудниках|Информация об уволенных сотрудниках]]&lt;br /&gt;
| group2 = Объекты анализа&lt;br /&gt;
| list2 = &lt;br /&gt;
* [[Информация по спискам показателей объектов и нормативов|Информация по спискам показателей объектов и нормативов]]&lt;br /&gt;
* [[Информация о нормах показателей|Информация о нормах показателей]]&lt;br /&gt;
| group3 = Методики анализа&lt;br /&gt;
| list3 = &lt;br /&gt;
* [[Приложение к аттестату аккредитации|Приложение к аттестату аккредитации]]&lt;br /&gt;
* [[Общая информация о методиках анализа|Общая информация о методиках анализа]]&lt;br /&gt;
* [[Полная информация о методике анализа|Полная информация о методике анализа]]&lt;br /&gt;
* [[Информация об использовании методик анализа в ЛЖ|Информация об использовании методик анализа в ЛЖ]]&lt;br /&gt;
| group4 = Формулы&lt;br /&gt;
| list4 = &lt;br /&gt;
* [[Полная информация по методам анализа (формулы)|Полная информация по методам анализа (формулы)]]&lt;br /&gt;
| group5 = Структура предприятия (лаборатории)&lt;br /&gt;
| list5 = &lt;br /&gt;
* [[Структура предприятия (всё дерево)|Структура предприятия (всё дерево)]]&lt;br /&gt;
* [[Карточка предприятия|Карточка предприятия]]&lt;br /&gt;
| group6 = Источники проб&lt;br /&gt;
| list6 = &lt;br /&gt;
* [[Структура источников (с выбором уровня)|Структура источников (с выбором уровня)]]&lt;br /&gt;
* [[Список мест выбранного типа|Список мест выбранного типа]]&lt;br /&gt;
* [[Информация о нормах в источниках проб|Информация о нормах в источниках проб]]&lt;br /&gt;
| group7 = Администрирование&lt;br /&gt;
| list7 = &lt;br /&gt;
* [[Информация о ролях и пользователях|Информация о ролях и пользователях]]&lt;br /&gt;
| group8 = Статистика&lt;br /&gt;
| list8 =&lt;br /&gt;
* [[Общая информация по БД|Общая информация по БД]]&lt;br /&gt;
* [[Расширенная статистика запусков|Расширенная статистика запусков]]&lt;br /&gt;
| group9 = Лабораторные журналы&lt;br /&gt;
| list9 = &lt;br /&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;
}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Color_contrast/colors&amp;diff=549</id>
		<title>Модуль:Color contrast/colors</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Color_contrast/colors&amp;diff=549"/>
		<updated>2026-01-20T04:46:51Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Защитил страницу Модуль:Color contrast/colors ([Редактирование=Разрешено только администраторам] (бессрочно) [Переименование=Разрешено только администраторам] (бессрочно)) [каскадная]&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>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Color_contrast&amp;diff=548</id>
		<title>Модуль:Color contrast</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Color_contrast&amp;diff=548"/>
		<updated>2026-01-20T04:46:44Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Защитил страницу Модуль:Color contrast ([Редактирование=Разрешено только администраторам] (бессрочно) [Переименование=Разрешено только администраторам] (бессрочно)) [каскадная]&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( &#039;Module:Color contrast/colors&#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 &#039;&#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 &#039;&#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 &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- html &#039;#&#039; entity&lt;br /&gt;
	c = c:gsub(&amp;quot;&amp;amp;#35;&amp;quot;, &amp;quot;#&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	-- whitespace&lt;br /&gt;
	c = c:match( &#039;^%s*(.-)[%s;]*$&#039; )&lt;br /&gt;
&lt;br /&gt;
	-- unstrip nowiki strip markers&lt;br /&gt;
	c = mw.text.unstripNoWiki(c)&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,&#039;^hsl%([%s]*[0-9][0-9%.]*[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*%)$&#039;) then&lt;br /&gt;
		local h, s, l = mw.ustring.match(c,&#039;^hsl%([%s]*([0-9][0-9%.]*)[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*%)$&#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,&#039;^rgb%([%s]*[0-9][0-9]*[%s]*,[%s]*[0-9][0-9]*[%s]*,[%s]*[0-9][0-9]*[%s]*%)$&#039;) then&lt;br /&gt;
		local R, G, B = mw.ustring.match(c,&#039;^rgb%([%s]*([0-9][0-9]*)[%s]*,[%s]*([0-9][0-9]*)[%s]*,[%s]*([0-9][0-9]*)[%s]*%)$&#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,&#039;^rgb%([%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*%)$&#039;) then&lt;br /&gt;
		local R, G, B = mw.ustring.match(c,&#039;^rgb%([%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*%)$&#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, &#039;^[%s#]*([a-f0-9]*)[%s]*$&#039;)&lt;br /&gt;
&lt;br /&gt;
	-- split into rgb&lt;br /&gt;
	local cs = mw.text.split(c or &#039;&#039;, &#039;&#039;)&lt;br /&gt;
	if( #cs == 6 ) then&lt;br /&gt;
		local R = 16*tonumber(&#039;0x&#039; .. cs[1]) + tonumber(&#039;0x&#039; .. cs[2])&lt;br /&gt;
		local G = 16*tonumber(&#039;0x&#039; .. cs[3]) + tonumber(&#039;0x&#039; .. cs[4])&lt;br /&gt;
		local B = 16*tonumber(&#039;0x&#039; .. cs[5]) + tonumber(&#039;0x&#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(&#039;0x&#039; .. cs[1]) + tonumber(&#039;0x&#039; .. cs[1])&lt;br /&gt;
		local G = 16*tonumber(&#039;0x&#039; .. cs[2]) + tonumber(&#039;0x&#039; .. cs[2])&lt;br /&gt;
		local B = 16*tonumber(&#039;0x&#039; .. cs[3]) + tonumber(&#039;0x&#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 &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- This exports the function for use in other modules.&lt;br /&gt;
-- The colour is passed as a string.&lt;br /&gt;
function p._lum(color)&lt;br /&gt;
	return color2lum(color)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._greatercontrast(args)&lt;br /&gt;
	local bias = tonumber(args[&#039;bias&#039;] or &#039;0&#039;) or 0&lt;br /&gt;
	local css = (args[&#039;css&#039;] and args[&#039;css&#039;] ~= &#039;&#039;) and true or false&lt;br /&gt;
	local v1 = color2lum(args[1] or &#039;&#039;)&lt;br /&gt;
	local c2 = args[2] or &#039;white&#039;&lt;br /&gt;
	local v2 = color2lum(c2)&lt;br /&gt;
	local c3 = args[3] or &#039;black&#039;&lt;br /&gt;
	local v3 = color2lum(c3)&lt;br /&gt;
	local ratio1 = -1;&lt;br /&gt;
	local ratio2 = -1;&lt;br /&gt;
	if (type(v1) == &#039;number&#039; and type(v2) == &#039;number&#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) == &#039;number&#039; and type(v3) == &#039;number&#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;
&lt;br /&gt;
	if css then&lt;br /&gt;
		local c1 = args[1] or &#039;&#039;&lt;br /&gt;
		if mw.ustring.match(c1, &#039;^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$&#039;) or&lt;br /&gt;
			mw.ustring.match(c1, &#039;^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$&#039;) then&lt;br /&gt;
				c1 = &#039;#&#039; .. c1&lt;br /&gt;
		end&lt;br /&gt;
		if mw.ustring.match(c2, &#039;^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$&#039;) or&lt;br /&gt;
			mw.ustring.match(c2, &#039;^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$&#039;) then&lt;br /&gt;
				c2 = &#039;#&#039; .. c2&lt;br /&gt;
		end&lt;br /&gt;
		if mw.ustring.match(v3, &#039;^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$&#039;) or&lt;br /&gt;
			mw.ustring.match(v3, &#039;^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$&#039;) then&lt;br /&gt;
				c3 = &#039;#&#039; .. c3&lt;br /&gt;
		end&lt;br /&gt;
		return &#039;background-color:&#039; .. c1 .. &#039;; color:&#039; .. ((ratio1 &amp;gt; 0) and (ratio2 &amp;gt; 0) and ((ratio1 + bias &amp;gt; ratio2) and c2 or c3) or &#039;&#039;) .. &#039;;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return (ratio1 &amp;gt; 0) and (ratio2 &amp;gt; 0) and ((ratio1 + bias &amp;gt; ratio2) and c2 or c3) or &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._ratio(args)&lt;br /&gt;
	local v1 = color2lum(args[1])&lt;br /&gt;
	local v2 = color2lum(args[2])&lt;br /&gt;
	if (type(v1) == &#039;number&#039; and type(v2) == &#039;number&#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[&#039;error&#039;] or &#039;?&#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 &#039;&#039;):lower()&lt;br /&gt;
	local bg, fg = &#039;white&#039;, &#039;black&#039;&lt;br /&gt;
	local lum_bg, lum_fg = 1, 0&lt;br /&gt;
&lt;br /&gt;
	if args[2] then&lt;br /&gt;
		local lum = color2lum(args[2])&lt;br /&gt;
		if lum ~= &#039;&#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 ~= &#039;&#039; then fg, lum_fg = args[3], lum end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local slist = mw.text.split(mw.ustring.gsub(mw.ustring.gsub(style or &#039;&#039;, &#039;&amp;amp;#[Xx]23;&#039;, &#039;#&#039;), &#039;&amp;amp;#35;&#039;, &#039;#&#039;), &#039;;&#039;)&lt;br /&gt;
	for k = 1,#slist do&lt;br /&gt;
		local s = slist[k]&lt;br /&gt;
		local k,v = s:match( &#039;^[%s]*([^:]-):([^:]-)[%s;]*$&#039; )&lt;br /&gt;
		k = k or &#039;&#039;&lt;br /&gt;
		v = v or &#039;&#039;&lt;br /&gt;
		if (k:match(&#039;^[%s]*(background)[%s]*$&#039;) or k:match(&#039;^[%s]*(background%-color)[%s]*$&#039;)) then&lt;br /&gt;
			local lum = color2lum(v)&lt;br /&gt;
			if( lum ~= &#039;&#039; ) then bg, lum_bg = v, lum end&lt;br /&gt;
		elseif (k:match(&#039;^[%s]*(color)[%s]*$&#039;)) then&lt;br /&gt;
			local lum = color2lum(v)&lt;br /&gt;
			if( lum ~= &#039;&#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;
--[[&lt;br /&gt;
Use {{#invoke:Color contrast|somecolor}} directly or&lt;br /&gt;
{{#invoke:Color contrast}} from a wrapper template.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
	-- |1=	— required; A color to check.&lt;br /&gt;
--]]&lt;br /&gt;
function p.lum(frame)&lt;br /&gt;
	local color = frame.args[1] or frame:getParent().args[1]&lt;br /&gt;
	return p._lum(color)&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>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Arguments&amp;diff=547</id>
		<title>Модуль:Arguments</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Arguments&amp;diff=547"/>
		<updated>2026-01-20T04:46:36Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Защитил страницу Модуль:Arguments ([Редактирование=Разрешено только администраторам] (бессрочно) [Переименование=Разрешено только администраторам] (бессрочно)) [каскадная]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module provides easy processing of arguments passed to Scribunto from&lt;br /&gt;
-- #invoke. It is intended for use by other Lua modules, and should not be&lt;br /&gt;
-- called from #invoke directly.&lt;br /&gt;
&lt;br /&gt;
local libraryUtil = require(&#039;libraryUtil&#039;)&lt;br /&gt;
local checkType = libraryUtil.checkType&lt;br /&gt;
&lt;br /&gt;
local arguments = {}&lt;br /&gt;
&lt;br /&gt;
-- Generate four different tidyVal functions, so that we don&#039;t have to check the&lt;br /&gt;
-- options every time we call it.&lt;br /&gt;
&lt;br /&gt;
local function tidyValDefault(key, val)&lt;br /&gt;
	if type(val) == &#039;string&#039; then&lt;br /&gt;
		val = val:match(&#039;^%s*(.-)%s*$&#039;)&lt;br /&gt;
		if val == &#039;&#039; then&lt;br /&gt;
			return nil&lt;br /&gt;
		else&lt;br /&gt;
			return val&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValTrimOnly(key, val)&lt;br /&gt;
	if type(val) == &#039;string&#039; then&lt;br /&gt;
		return val:match(&#039;^%s*(.-)%s*$&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValRemoveBlanksOnly(key, val)&lt;br /&gt;
	if type(val) == &#039;string&#039; then&lt;br /&gt;
		if val:find(&#039;%S&#039;) then&lt;br /&gt;
			return val&lt;br /&gt;
		else&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValNoChange(key, val)&lt;br /&gt;
	return val&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function matchesTitle(given, title)&lt;br /&gt;
	local tp = type( given )&lt;br /&gt;
	return (tp == &#039;string&#039; or tp == &#039;number&#039;) and mw.title.new( given ).prefixedText == title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local translate_mt = { __index = function(t, k) return k end }&lt;br /&gt;
&lt;br /&gt;
function arguments.getArgs(frame, options)&lt;br /&gt;
	checkType(&#039;getArgs&#039;, 1, frame, &#039;table&#039;, true)&lt;br /&gt;
	checkType(&#039;getArgs&#039;, 2, options, &#039;table&#039;, true)&lt;br /&gt;
	frame = frame or {}&lt;br /&gt;
	options = options or {}&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Set up argument translation.&lt;br /&gt;
	--]]&lt;br /&gt;
	options.translate = options.translate or {}&lt;br /&gt;
	if getmetatable(options.translate) == nil then&lt;br /&gt;
		setmetatable(options.translate, translate_mt)&lt;br /&gt;
	end&lt;br /&gt;
	if options.backtranslate == nil then&lt;br /&gt;
		options.backtranslate = {}&lt;br /&gt;
		for k,v in pairs(options.translate) do&lt;br /&gt;
			options.backtranslate[v] = k&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if options.backtranslate and getmetatable(options.backtranslate) == nil then&lt;br /&gt;
		setmetatable(options.backtranslate, {&lt;br /&gt;
			__index = function(t, k)&lt;br /&gt;
				if options.translate[k] ~= k then&lt;br /&gt;
					return nil&lt;br /&gt;
				else&lt;br /&gt;
					return k&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Get the argument tables. If we were passed a valid frame object, get the&lt;br /&gt;
	-- frame arguments (fargs) and the parent frame arguments (pargs), depending&lt;br /&gt;
	-- on the options set and on the parent frame&#039;s availability. If we weren&#039;t&lt;br /&gt;
	-- passed a valid frame object, we are being called from another Lua module&lt;br /&gt;
	-- or from the debug console, so assume that we were passed a table of args&lt;br /&gt;
	-- directly, and assign it to a new variable (luaArgs).&lt;br /&gt;
	--]]&lt;br /&gt;
	local fargs, pargs, luaArgs&lt;br /&gt;
	if type(frame.args) == &#039;table&#039; and type(frame.getParent) == &#039;function&#039; then&lt;br /&gt;
		if options.wrappers then&lt;br /&gt;
			--[[&lt;br /&gt;
			-- The wrappers option makes Module:Arguments look up arguments in&lt;br /&gt;
			-- either the frame argument table or the parent argument table, but&lt;br /&gt;
			-- not both. This means that users can use either the #invoke syntax&lt;br /&gt;
			-- or a wrapper template without the loss of performance associated&lt;br /&gt;
			-- with looking arguments up in both the frame and the parent frame.&lt;br /&gt;
			-- Module:Arguments will look up arguments in the parent frame&lt;br /&gt;
			-- if it finds the parent frame&#039;s title in options.wrapper;&lt;br /&gt;
			-- otherwise it will look up arguments in the frame object passed&lt;br /&gt;
			-- to getArgs.&lt;br /&gt;
			--]]&lt;br /&gt;
			local parent = frame:getParent()&lt;br /&gt;
			if not parent then&lt;br /&gt;
				fargs = frame.args&lt;br /&gt;
			else&lt;br /&gt;
				local title = parent:getTitle():gsub(&#039;/sandbox$&#039;, &#039;&#039;)&lt;br /&gt;
				local found = false&lt;br /&gt;
				if matchesTitle(options.wrappers, title) then&lt;br /&gt;
					found = true&lt;br /&gt;
				elseif type(options.wrappers) == &#039;table&#039; then&lt;br /&gt;
					for _,v in pairs(options.wrappers) do&lt;br /&gt;
						if matchesTitle(v, title) then&lt;br /&gt;
							found = true&lt;br /&gt;
							break&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				-- We test for false specifically here so that nil (the default) acts like true.&lt;br /&gt;
				if found or options.frameOnly == false then&lt;br /&gt;
					pargs = parent.args&lt;br /&gt;
				end&lt;br /&gt;
				if not found or options.parentOnly == false then&lt;br /&gt;
					fargs = frame.args&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			-- options.wrapper isn&#039;t set, so check the other options.&lt;br /&gt;
			if not options.parentOnly then&lt;br /&gt;
				fargs = frame.args&lt;br /&gt;
			end&lt;br /&gt;
			if not options.frameOnly then&lt;br /&gt;
				local parent = frame:getParent()&lt;br /&gt;
				pargs = parent and parent.args or nil&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if options.parentFirst then&lt;br /&gt;
			fargs, pargs = pargs, fargs&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		luaArgs = frame&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set the order of precedence of the argument tables. If the variables are&lt;br /&gt;
	-- nil, nothing will be added to the table, which is how we avoid clashes&lt;br /&gt;
	-- between the frame/parent args and the Lua args.&lt;br /&gt;
	local argTables = {fargs}&lt;br /&gt;
	argTables[#argTables + 1] = pargs&lt;br /&gt;
	argTables[#argTables + 1] = luaArgs&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Generate the tidyVal function. If it has been specified by the user, we&lt;br /&gt;
	-- use that; if not, we choose one of four functions depending on the&lt;br /&gt;
	-- options chosen. This is so that we don&#039;t have to call the options table&lt;br /&gt;
	-- every time the function is called.&lt;br /&gt;
	--]]&lt;br /&gt;
	local tidyVal = options.valueFunc&lt;br /&gt;
	if tidyVal then&lt;br /&gt;
		if type(tidyVal) ~= &#039;function&#039; then&lt;br /&gt;
			error(&lt;br /&gt;
				&amp;quot;bad value assigned to option &#039;valueFunc&#039;&amp;quot;&lt;br /&gt;
					.. &#039;(function expected, got &#039;&lt;br /&gt;
					.. type(tidyVal)&lt;br /&gt;
					.. &#039;)&#039;,&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		end&lt;br /&gt;
	elseif options.trim ~= false then&lt;br /&gt;
		if options.removeBlanks ~= false then&lt;br /&gt;
			tidyVal = tidyValDefault&lt;br /&gt;
		else&lt;br /&gt;
			tidyVal = tidyValTrimOnly&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		if options.removeBlanks ~= false then&lt;br /&gt;
			tidyVal = tidyValRemoveBlanksOnly&lt;br /&gt;
		else&lt;br /&gt;
			tidyVal = tidyValNoChange&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Set up the args, metaArgs and nilArgs tables. args will be the one&lt;br /&gt;
	-- accessed from functions, and metaArgs will hold the actual arguments. Nil&lt;br /&gt;
	-- arguments are memoized in nilArgs, and the metatable connects all of them&lt;br /&gt;
	-- together.&lt;br /&gt;
	--]]&lt;br /&gt;
	local args, metaArgs, nilArgs, metatable = {}, {}, {}, {}&lt;br /&gt;
	setmetatable(args, metatable)&lt;br /&gt;
&lt;br /&gt;
	local function mergeArgs(tables)&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Accepts multiple tables as input and merges their keys and values&lt;br /&gt;
		-- into one table. If a value is already present it is not overwritten;&lt;br /&gt;
		-- tables listed earlier have precedence. We are also memoizing nil&lt;br /&gt;
		-- values, which can be overwritten if they are &#039;s&#039; (soft).&lt;br /&gt;
		--]]&lt;br /&gt;
		for _, t in ipairs(tables) do&lt;br /&gt;
			for key, val in pairs(t) do&lt;br /&gt;
				if metaArgs[key] == nil and nilArgs[key] ~= &#039;h&#039; then&lt;br /&gt;
					local tidiedVal = tidyVal(key, val)&lt;br /&gt;
					if tidiedVal == nil then&lt;br /&gt;
						nilArgs[key] = &#039;s&#039;&lt;br /&gt;
					else&lt;br /&gt;
						metaArgs[key] = tidiedVal&lt;br /&gt;
					end&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;
	-- Define metatable behaviour. Arguments are memoized in the metaArgs table,&lt;br /&gt;
	-- and are only fetched from the argument tables once. Fetching arguments&lt;br /&gt;
	-- from the argument tables is the most resource-intensive step in this&lt;br /&gt;
	-- module, so we try and avoid it where possible. For this reason, nil&lt;br /&gt;
	-- arguments are also memoized, in the nilArgs table. Also, we keep a record&lt;br /&gt;
	-- in the metatable of when pairs and ipairs have been called, so we do not&lt;br /&gt;
	-- run pairs and ipairs on the argument tables more than once. We also do&lt;br /&gt;
	-- not run ipairs on fargs and pargs if pairs has already been run, as all&lt;br /&gt;
	-- the arguments will already have been copied over.&lt;br /&gt;
	--]]&lt;br /&gt;
&lt;br /&gt;
	metatable.__index = function (t, key)&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Fetches an argument when the args table is indexed. First we check&lt;br /&gt;
		-- to see if the value is memoized, and if not we try and fetch it from&lt;br /&gt;
		-- the argument tables. When we check memoization, we need to check&lt;br /&gt;
		-- metaArgs before nilArgs, as both can be non-nil at the same time.&lt;br /&gt;
		-- If the argument is not present in metaArgs, we also check whether&lt;br /&gt;
		-- pairs has been run yet. If pairs has already been run, we return nil.&lt;br /&gt;
		-- This is because all the arguments will have already been copied into&lt;br /&gt;
		-- metaArgs by the mergeArgs function, meaning that any other arguments&lt;br /&gt;
		-- must be nil.&lt;br /&gt;
		--]]&lt;br /&gt;
		if type(key) == &#039;string&#039; then&lt;br /&gt;
			key = options.translate[key]&lt;br /&gt;
		end&lt;br /&gt;
		local val = metaArgs[key]&lt;br /&gt;
		if val ~= nil then&lt;br /&gt;
			return val&lt;br /&gt;
		elseif metatable.donePairs or nilArgs[key] then&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
		for _, argTable in ipairs(argTables) do&lt;br /&gt;
			local argTableVal = tidyVal(key, argTable[key])&lt;br /&gt;
			if argTableVal ~= nil then&lt;br /&gt;
				metaArgs[key] = argTableVal&lt;br /&gt;
				return argTableVal&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		nilArgs[key] = &#039;h&#039;&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__newindex = function (t, key, val)&lt;br /&gt;
		-- This function is called when a module tries to add a new value to the&lt;br /&gt;
		-- args table, or tries to change an existing value.&lt;br /&gt;
		if type(key) == &#039;string&#039; then&lt;br /&gt;
			key = options.translate[key]&lt;br /&gt;
		end&lt;br /&gt;
		if options.readOnly then&lt;br /&gt;
			error(&lt;br /&gt;
				&#039;could not write to argument table key &amp;quot;&#039;&lt;br /&gt;
					.. tostring(key)&lt;br /&gt;
					.. &#039;&amp;quot;; the table is read-only&#039;,&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		elseif options.noOverwrite and args[key] ~= nil then&lt;br /&gt;
			error(&lt;br /&gt;
				&#039;could not write to argument table key &amp;quot;&#039;&lt;br /&gt;
					.. tostring(key)&lt;br /&gt;
					.. &#039;&amp;quot;; overwriting existing arguments is not permitted&#039;,&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		elseif val == nil then&lt;br /&gt;
			--[[&lt;br /&gt;
			-- If the argument is to be overwritten with nil, we need to erase&lt;br /&gt;
			-- the value in metaArgs, so that __index, __pairs and __ipairs do&lt;br /&gt;
			-- not use a previous existing value, if present; and we also need&lt;br /&gt;
			-- to memoize the nil in nilArgs, so that the value isn&#039;t looked&lt;br /&gt;
			-- up in the argument tables if it is accessed again.&lt;br /&gt;
			--]]&lt;br /&gt;
			metaArgs[key] = nil&lt;br /&gt;
			nilArgs[key] = &#039;h&#039;&lt;br /&gt;
		else&lt;br /&gt;
			metaArgs[key] = val&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function translatenext(invariant)&lt;br /&gt;
		local k, v = next(invariant.t, invariant.k)&lt;br /&gt;
		invariant.k = k&lt;br /&gt;
		if k == nil then&lt;br /&gt;
			return nil&lt;br /&gt;
		elseif type(k) ~= &#039;string&#039; or not options.backtranslate then&lt;br /&gt;
			return k, v&lt;br /&gt;
		else&lt;br /&gt;
			local backtranslate = options.backtranslate[k]&lt;br /&gt;
			if backtranslate == nil then&lt;br /&gt;
				-- Skip this one. This is a tail call, so this won&#039;t cause stack overflow&lt;br /&gt;
				return translatenext(invariant)&lt;br /&gt;
			else&lt;br /&gt;
				return backtranslate, v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__pairs = function ()&lt;br /&gt;
		-- Called when pairs is run on the args table.&lt;br /&gt;
		if not metatable.donePairs then&lt;br /&gt;
			mergeArgs(argTables)&lt;br /&gt;
			metatable.donePairs = true&lt;br /&gt;
		end&lt;br /&gt;
		return translatenext, { t = metaArgs }&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function inext(t, i)&lt;br /&gt;
		-- This uses our __index metamethod&lt;br /&gt;
		local v = t[i + 1]&lt;br /&gt;
		if v ~= nil then&lt;br /&gt;
			return i + 1, v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__ipairs = function (t)&lt;br /&gt;
		-- Called when ipairs is run on the args table.&lt;br /&gt;
		return inext, t, 0&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return arguments&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Yesno&amp;diff=546</id>
		<title>Модуль:Yesno</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Yesno&amp;diff=546"/>
		<updated>2026-01-20T04:44:13Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Защитил страницу Модуль:Yesno ([Редактирование=Разрешено только администраторам] (бессрочно) [Переименование=Разрешено только администраторам] (бессрочно)) [каскадная]&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) == &#039;string&#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 == &#039;yes&#039;&lt;br /&gt;
		or val == &#039;y&#039;&lt;br /&gt;
		or val == &#039;true&#039;&lt;br /&gt;
		or val == &#039;t&#039;&lt;br /&gt;
		or val == &#039;on&#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 == &#039;no&#039;&lt;br /&gt;
		or val == &#039;n&#039;&lt;br /&gt;
		or val == &#039;false&#039;&lt;br /&gt;
		or val == &#039;f&#039;&lt;br /&gt;
		or val == &#039;off&#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>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:List&amp;diff=545</id>
		<title>Модуль:List</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:List&amp;diff=545"/>
		<updated>2026-01-20T04:43:56Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Защитил страницу Модуль:List ([Редактирование=Разрешено только администраторам] (бессрочно) [Переименование=Разрешено только администраторам] (бессрочно)) [каскадная]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local libUtil = require(&#039;libraryUtil&#039;)&lt;br /&gt;
local checkType = libUtil.checkType&lt;br /&gt;
local mTableTools = require(&#039;Module:TableTools&#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local listTypes = {&lt;br /&gt;
	[&#039;bulleted&#039;] = true,&lt;br /&gt;
	[&#039;unbulleted&#039;] = true,&lt;br /&gt;
	[&#039;horizontal&#039;] = true,&lt;br /&gt;
	[&#039;ordered&#039;] = true,&lt;br /&gt;
	[&#039;horizontal_ordered&#039;] = true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.makeListData(listType, args)&lt;br /&gt;
	-- Constructs a data table to be passed to p.renderList.&lt;br /&gt;
	local data = {}&lt;br /&gt;
&lt;br /&gt;
	-- Classes and TemplateStyles&lt;br /&gt;
	data.classes = {}&lt;br /&gt;
	data.templatestyles = &#039;&#039;&lt;br /&gt;
	if listType == &#039;horizontal&#039; or listType == &#039;horizontal_ordered&#039; then&lt;br /&gt;
		table.insert(data.classes, &#039;hlist&#039;)&lt;br /&gt;
		data.templatestyles = mw.getCurrentFrame():extensionTag{&lt;br /&gt;
			name = &#039;templatestyles&#039;, args = { src = &#039;Hlist/styles.css&#039; }&lt;br /&gt;
		}&lt;br /&gt;
	elseif listType == &#039;unbulleted&#039; then&lt;br /&gt;
		table.insert(data.classes, &#039;plainlist&#039;)&lt;br /&gt;
		data.templatestyles = mw.getCurrentFrame():extensionTag{&lt;br /&gt;
			name = &#039;templatestyles&#039;, args = { src = &#039;Plainlist/styles.css&#039; }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(data.classes, args.class)&lt;br /&gt;
&lt;br /&gt;
	-- Main div style&lt;br /&gt;
	data.style = args.style&lt;br /&gt;
&lt;br /&gt;
	-- Indent for horizontal lists&lt;br /&gt;
	if listType == &#039;horizontal&#039; or listType == &#039;horizontal_ordered&#039; then&lt;br /&gt;
		local indent = tonumber(args.indent)&lt;br /&gt;
		indent = indent and indent * 1.6 or 0&lt;br /&gt;
		if indent &amp;gt; 0 then&lt;br /&gt;
			data.marginLeft = indent .. &#039;em&#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- List style types for ordered lists&lt;br /&gt;
	-- This could be &amp;quot;1, 2, 3&amp;quot;, &amp;quot;a, b, c&amp;quot;, or a number of others. The list style&lt;br /&gt;
	-- type is either set by the &amp;quot;type&amp;quot; attribute or the &amp;quot;list-style-type&amp;quot; CSS&lt;br /&gt;
	-- property.&lt;br /&gt;
	if listType == &#039;ordered&#039; or listType == &#039;horizontal_ordered&#039; then &lt;br /&gt;
		data.listStyleType = args.list_style_type or args[&#039;list-style-type&#039;]&lt;br /&gt;
		data.type = args[&#039;type&#039;]&lt;br /&gt;
&lt;br /&gt;
		-- Detect invalid type attributes and attempt to convert them to&lt;br /&gt;
		-- list-style-type CSS properties.&lt;br /&gt;
		if data.type &lt;br /&gt;
			and not data.listStyleType&lt;br /&gt;
			and not tostring(data.type):find(&#039;^%s*[1AaIi]%s*$&#039;)&lt;br /&gt;
		then&lt;br /&gt;
			data.listStyleType = data.type&lt;br /&gt;
			data.type = nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- List tag type&lt;br /&gt;
	if listType == &#039;ordered&#039; or listType == &#039;horizontal_ordered&#039; then&lt;br /&gt;
		data.listTag = &#039;ol&#039;&lt;br /&gt;
	else&lt;br /&gt;
		data.listTag = &#039;ul&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Start number for ordered lists&lt;br /&gt;
	data.start = args.start&lt;br /&gt;
	if listType == &#039;horizontal_ordered&#039; then&lt;br /&gt;
		-- Apply fix to get start numbers working with horizontal ordered lists.&lt;br /&gt;
		local startNum = tonumber(data.start)&lt;br /&gt;
		if startNum then&lt;br /&gt;
			data.counterReset = &#039;listitem &#039; .. tostring(startNum - 1)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- List style&lt;br /&gt;
	 -- ul_style and ol_style are included for backwards compatibility. No&lt;br /&gt;
	 -- distinction is made for ordered or unordered lists.&lt;br /&gt;
	data.listStyle = args.list_style&lt;br /&gt;
&lt;br /&gt;
	-- List items&lt;br /&gt;
	-- li_style is included for backwards compatibility. item_style was included&lt;br /&gt;
	-- to be easier to understand for non-coders.&lt;br /&gt;
	data.itemStyle = args.item_style or args.li_style&lt;br /&gt;
	data.items = {}&lt;br /&gt;
	for _, num in ipairs(mTableTools.numKeys(args)) do&lt;br /&gt;
		local item = {}&lt;br /&gt;
		item.content = args[num]&lt;br /&gt;
		item.style = args[&#039;item&#039; .. tostring(num) .. &#039;_style&#039;]&lt;br /&gt;
			or args[&#039;item_style&#039; .. tostring(num)]&lt;br /&gt;
		item.value = args[&#039;item&#039; .. tostring(num) .. &#039;_value&#039;]&lt;br /&gt;
			or args[&#039;item_value&#039; .. tostring(num)]&lt;br /&gt;
		table.insert(data.items, item)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return data&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.renderList(data)&lt;br /&gt;
	-- Renders the list HTML.&lt;br /&gt;
	&lt;br /&gt;
	-- Return the blank string if there are no list items.&lt;br /&gt;
	if type(data.items) ~= &#039;table&#039; or #data.items &amp;lt; 1 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Render the main div tag.&lt;br /&gt;
	local root = mw.html.create(&#039;div&#039;)&lt;br /&gt;
	for _, class in ipairs(data.classes or {}) do&lt;br /&gt;
		root:addClass(class)&lt;br /&gt;
	end&lt;br /&gt;
	root:css{[&#039;margin-left&#039;] = data.marginLeft}&lt;br /&gt;
	if data.style then&lt;br /&gt;
		root:cssText(data.style)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Render the list tag.&lt;br /&gt;
	local list = root:tag(data.listTag or &#039;ul&#039;)&lt;br /&gt;
	list&lt;br /&gt;
		:attr{start = data.start, type = data.type}&lt;br /&gt;
		:css{&lt;br /&gt;
			[&#039;counter-reset&#039;] = data.counterReset,&lt;br /&gt;
			[&#039;list-style-type&#039;] = data.listStyleType&lt;br /&gt;
		}&lt;br /&gt;
	if data.listStyle then&lt;br /&gt;
		list:cssText(data.listStyle)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Render the list items&lt;br /&gt;
	for _, t in ipairs(data.items or {}) do&lt;br /&gt;
		local item = list:tag(&#039;li&#039;)&lt;br /&gt;
		if data.itemStyle then&lt;br /&gt;
			item:cssText(data.itemStyle)&lt;br /&gt;
		end&lt;br /&gt;
		if t.style then&lt;br /&gt;
			item:cssText(t.style)&lt;br /&gt;
		end&lt;br /&gt;
		item&lt;br /&gt;
			:attr{value = t.value}&lt;br /&gt;
			:wikitext(t.content)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return data.templatestyles .. tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.renderTrackingCategories(args)&lt;br /&gt;
	local isDeprecated = false -- Tracks deprecated parameters.&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		k = tostring(k)&lt;br /&gt;
		if k:find(&#039;^item_style%d+$&#039;) or k:find(&#039;^item_value%d+$&#039;) then&lt;br /&gt;
			isDeprecated = true&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local ret = &#039;&#039;&lt;br /&gt;
	if isDeprecated then&lt;br /&gt;
		ret = ret .. &#039;[[Category:List templates with deprecated parameters]]&#039;&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeList(listType, args)&lt;br /&gt;
	if not listType or not listTypes[listType] then&lt;br /&gt;
		error(string.format(&lt;br /&gt;
			&amp;quot;bad argument #1 to &#039;makeList&#039; (&#039;%s&#039; is not a valid list type)&amp;quot;,&lt;br /&gt;
			tostring(listType)&lt;br /&gt;
		), 2)&lt;br /&gt;
	end&lt;br /&gt;
	checkType(&#039;makeList&#039;, 2, args, &#039;table&#039;)&lt;br /&gt;
	local data = p.makeListData(listType, args)&lt;br /&gt;
	local list = p.renderList(data)&lt;br /&gt;
	local trackingCategories = p.renderTrackingCategories(args)&lt;br /&gt;
	return list .. trackingCategories&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for listType in pairs(listTypes) do&lt;br /&gt;
	p[listType] = function (frame)&lt;br /&gt;
		local mArguments = require(&#039;Module:Arguments&#039;)&lt;br /&gt;
		local origArgs = mArguments.getArgs(frame, {&lt;br /&gt;
			frameOnly = ((frame and frame.args and frame.args.frameonly or &#039;&#039;) ~= &#039;&#039;),&lt;br /&gt;
			valueFunc = function (key, value)&lt;br /&gt;
			if not value or not mw.ustring.find(value, &#039;%S&#039;) then return nil end&lt;br /&gt;
			if mw.ustring.find(value, &#039;^%s*[%*#;:]&#039;) then&lt;br /&gt;
				return value&lt;br /&gt;
			else&lt;br /&gt;
				return value:match(&#039;^%s*(.-)%s*$&#039;)&lt;br /&gt;
			end&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
		})&lt;br /&gt;
		-- Copy all the arguments to a new table, for faster indexing.&lt;br /&gt;
		local args = {}&lt;br /&gt;
		for k, v in pairs(origArgs) do&lt;br /&gt;
			args[k] = v&lt;br /&gt;
		end&lt;br /&gt;
		return p.makeList(listType, args)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Navbar/configuration&amp;diff=544</id>
		<title>Модуль:Navbar/configuration</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Navbar/configuration&amp;diff=544"/>
		<updated>2026-01-20T04:43:38Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Защитил страницу Модуль:Navbar/configuration ([Редактирование=Разрешено только администраторам] (бессрочно) [Переименование=Разрешено только администраторам] (бессрочно)) [каскадная]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;return {&lt;br /&gt;
	[&#039;templatestyles&#039;] = &#039;Module:Navbar/styles.css&#039;,&lt;br /&gt;
	[&#039;hlist_templatestyles&#039;] = &#039;Hlist/styles.css&#039;,&lt;br /&gt;
	[&#039;box_text&#039;] = &#039;This box: &#039;,			-- default text box when not plain or mini&lt;br /&gt;
	[&#039;title_namespace&#039;] = &#039;Template&#039;,		-- namespace to default to for title&lt;br /&gt;
	[&#039;invalid_title&#039;] = &#039;Invalid title &#039;,&lt;br /&gt;
	[&#039;classes&#039;] = { -- set a line to nil if you don&#039;t want it&lt;br /&gt;
		[&#039;navbar&#039;] = &#039;navbar&#039;,&lt;br /&gt;
		[&#039;plainlinks&#039;] = &#039;plainlinks&#039;, -- plainlinks&lt;br /&gt;
		[&#039;horizontal_list&#039;] = &#039;hlist&#039;, -- horizontal list class&lt;br /&gt;
		[&#039;mini&#039;] = &#039;navbar-mini&#039;, -- class indicating small links in the navbar&lt;br /&gt;
		[&#039;this_box&#039;] = &#039;navbar-boxtext&#039;,&lt;br /&gt;
		[&#039;brackets&#039;] = &#039;navbar-brackets&#039;,&lt;br /&gt;
		-- &#039;collapsible&#039; is the key for a class to indicate the navbar is&lt;br /&gt;
		-- setting up the collapsible element in addition to the normal&lt;br /&gt;
		-- navbar.&lt;br /&gt;
		[&#039;collapsible&#039;] = &#039;navbar-collapse&#039;,&lt;br /&gt;
		[&#039;collapsible_title_mini&#039;] = &#039;navbar-ct-mini&#039;,&lt;br /&gt;
		[&#039;collapsible_title_full&#039;] = &#039;navbar-ct-full&#039;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Navbar/styles.css&amp;diff=543</id>
		<title>Модуль:Navbar/styles.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Navbar/styles.css&amp;diff=543"/>
		<updated>2026-01-20T04:43:27Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Защитил страницу Модуль:Navbar/styles.css ([Редактирование=Разрешено только администраторам] (бессрочно) [Переименование=Разрешено только администраторам] (бессрочно)) [каскадная]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* {{pp|small=yes}} */&lt;br /&gt;
.navbar {&lt;br /&gt;
	display: inline;&lt;br /&gt;
	font-size: 88%;&lt;br /&gt;
	font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar-collapse {&lt;br /&gt;
	float: left;&lt;br /&gt;
	text-align: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar-boxtext {&lt;br /&gt;
	word-spacing: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar ul {&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	white-space: nowrap;&lt;br /&gt;
	line-height: inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar-brackets::before {&lt;br /&gt;
	margin-right: -0.125em;&lt;br /&gt;
	content: &#039;[ &#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar-brackets::after {&lt;br /&gt;
	margin-left: -0.125em;&lt;br /&gt;
	content: &#039; ]&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar li {&lt;br /&gt;
	word-spacing: -0.125em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar a &amp;gt; span,&lt;br /&gt;
.navbar a &amp;gt; abbr {&lt;br /&gt;
	text-decoration: inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar-mini abbr {&lt;br /&gt;
	font-variant: small-caps;&lt;br /&gt;
	border-bottom: none;&lt;br /&gt;
	text-decoration: none;&lt;br /&gt;
	cursor: inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar-ct-full {&lt;br /&gt;
	font-size: 114%;&lt;br /&gt;
	margin: 0 7em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar-ct-mini {&lt;br /&gt;
	font-size: 114%;&lt;br /&gt;
	margin: 0 4em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* not the usual @media screen, we simply remove navbar in @media print */&lt;br /&gt;
html.skin-theme-clientpref-night .navbar li a abbr {&lt;br /&gt;
	color: var(--color-base) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (prefers-color-scheme: dark) {&lt;br /&gt;
	html.skin-theme-clientpref-os .navbar li a abbr {&lt;br /&gt;
		color: var(--color-base) !important;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media print {&lt;br /&gt;
	.navbar {&lt;br /&gt;
		display: none !important;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Navbar&amp;diff=542</id>
		<title>Модуль:Navbar</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Navbar&amp;diff=542"/>
		<updated>2026-01-20T04:43:14Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Защитил страницу Модуль:Navbar ([Редактирование=Разрешено только администраторам] (бессрочно) [Переименование=Разрешено только администраторам] (бессрочно)) [каскадная]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
local cfg = mw.loadData(&#039;Module:Navbar/configuration&#039;)&lt;br /&gt;
&lt;br /&gt;
local function get_title_arg(is_collapsible, template)&lt;br /&gt;
	local title_arg = 1&lt;br /&gt;
	if is_collapsible then title_arg = 2 end&lt;br /&gt;
	if template then title_arg = &#039;template&#039; end&lt;br /&gt;
	return title_arg&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function choose_links(template, args)&lt;br /&gt;
	-- The show table indicates the default displayed items.&lt;br /&gt;
	-- view, talk, edit, hist, move, watch&lt;br /&gt;
	-- TODO: Move to configuration.&lt;br /&gt;
	local show = {true, true, true, false, false, false}&lt;br /&gt;
	if template then&lt;br /&gt;
		show[2] = false&lt;br /&gt;
		show[3] = false&lt;br /&gt;
		local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6,&lt;br /&gt;
			talk = 2, edit = 3, hist = 4, move = 5, watch = 6}&lt;br /&gt;
		-- TODO: Consider removing TableTools dependency.&lt;br /&gt;
		for _, v in ipairs(require (&#039;Module:TableTools&#039;).compressSparseArray(args)) do&lt;br /&gt;
			local num = index[v]&lt;br /&gt;
			if num then show[num] = true end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local remove_edit_link = args.noedit&lt;br /&gt;
	if remove_edit_link then show[3] = false end&lt;br /&gt;
	&lt;br /&gt;
	return show&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function add_link(link_description, ul, is_mini, font_style)&lt;br /&gt;
	local l&lt;br /&gt;
	if link_description.url then&lt;br /&gt;
		l = {&#039;[&#039;, &#039;&#039;, &#039;]&#039;}&lt;br /&gt;
	else&lt;br /&gt;
		l = {&#039;[[&#039;, &#039;|&#039;, &#039;]]&#039;}&lt;br /&gt;
	end&lt;br /&gt;
	ul:tag(&#039;li&#039;)&lt;br /&gt;
		:addClass(&#039;nv-&#039; .. link_description.full)&lt;br /&gt;
		:wikitext(l[1] .. link_description.link .. l[2])&lt;br /&gt;
		:tag(is_mini and &#039;abbr&#039; or &#039;span&#039;)&lt;br /&gt;
			:attr(&#039;title&#039;, link_description.html_title)&lt;br /&gt;
			:cssText(font_style)&lt;br /&gt;
			:wikitext(is_mini and link_description.mini or link_description.full)&lt;br /&gt;
			:done()&lt;br /&gt;
		:wikitext(l[3])&lt;br /&gt;
		:done()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style)&lt;br /&gt;
	&lt;br /&gt;
	local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace)&lt;br /&gt;
	if not title then&lt;br /&gt;
		error(cfg.invalid_title .. title_text)&lt;br /&gt;
	end&lt;br /&gt;
	local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or &#039;&#039;&lt;br /&gt;
	&lt;br /&gt;
	-- TODO: Get link_descriptions and show into the configuration module.&lt;br /&gt;
	-- link_descriptions should be easier...&lt;br /&gt;
	local link_descriptions = {&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;v&#039;, [&#039;full&#039;] = &#039;view&#039;, [&#039;html_title&#039;] = &#039;View this template&#039;,&lt;br /&gt;
			[&#039;link&#039;] = title.fullText, [&#039;url&#039;] = false },&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;t&#039;, [&#039;full&#039;] = &#039;talk&#039;, [&#039;html_title&#039;] = &#039;Discuss this template&#039;,&lt;br /&gt;
			[&#039;link&#039;] = talkpage, [&#039;url&#039;] = false },&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;e&#039;, [&#039;full&#039;] = &#039;edit&#039;, [&#039;html_title&#039;] = &#039;Edit this template&#039;,&lt;br /&gt;
			[&#039;link&#039;] = &#039;Special:EditPage/&#039; .. title.fullText, [&#039;url&#039;] = false },&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;h&#039;, [&#039;full&#039;] = &#039;hist&#039;, [&#039;html_title&#039;] = &#039;History of this template&#039;,&lt;br /&gt;
			[&#039;link&#039;] = &#039;Special:PageHistory/&#039; .. title.fullText, [&#039;url&#039;] = false },&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;m&#039;, [&#039;full&#039;] = &#039;move&#039;, [&#039;html_title&#039;] = &#039;Move this template&#039;,&lt;br /&gt;
			[&#039;link&#039;] = mw.title.new(&#039;Special:Movepage&#039;):fullUrl(&#039;target=&#039;..title.fullText), [&#039;url&#039;] = true },&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;w&#039;, [&#039;full&#039;] = &#039;watch&#039;, [&#039;html_title&#039;] = &#039;Watch this template&#039;, &lt;br /&gt;
			[&#039;link&#039;] = title:fullUrl(&#039;action=watch&#039;), [&#039;url&#039;] = true }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local ul = mw.html.create(&#039;ul&#039;)&lt;br /&gt;
	if has_brackets then&lt;br /&gt;
		ul:addClass(cfg.classes.brackets)&lt;br /&gt;
			:cssText(font_style)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for i, _ in ipairs(displayed_links) do&lt;br /&gt;
		if displayed_links[i] then add_link(link_descriptions[i], ul, is_mini, font_style) end&lt;br /&gt;
	end&lt;br /&gt;
	return ul:done()&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._navbar(args)&lt;br /&gt;
	&lt;br /&gt;
	-- TODO: We probably don&#039;t need both fontstyle and fontcolor...&lt;br /&gt;
	local font_style = args.fontstyle&lt;br /&gt;
	local font_color = args.fontcolor&lt;br /&gt;
	local is_collapsible = args.collapsible&lt;br /&gt;
	local is_mini = args.mini&lt;br /&gt;
	local is_plain = args.plain&lt;br /&gt;
	&lt;br /&gt;
	local collapsible_class = nil&lt;br /&gt;
	if is_collapsible then&lt;br /&gt;
		collapsible_class = cfg.classes.collapsible&lt;br /&gt;
		if not is_plain then is_mini = 1 end&lt;br /&gt;
		if font_color then&lt;br /&gt;
			font_style = (font_style or &#039;&#039;) .. &#039;; color: &#039; .. font_color .. &#039;;&#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local navbar_style = args.style&lt;br /&gt;
	local div = mw.html.create():tag(&#039;div&#039;)&lt;br /&gt;
	div&lt;br /&gt;
		:addClass(cfg.classes.navbar)&lt;br /&gt;
		:addClass(cfg.classes.plainlinks)&lt;br /&gt;
		:addClass(cfg.classes.horizontal_list)&lt;br /&gt;
		:addClass(collapsible_class) -- we made the determination earlier&lt;br /&gt;
		:cssText(navbar_style)&lt;br /&gt;
&lt;br /&gt;
	if is_mini then div:addClass(cfg.classes.mini) end&lt;br /&gt;
&lt;br /&gt;
	local box_text = (args.text or cfg.box_text) .. &#039; &#039;&lt;br /&gt;
	 -- the concatenated space guarantees the box text is separated&lt;br /&gt;
	if not (is_mini or is_plain) then&lt;br /&gt;
		div&lt;br /&gt;
			:tag(&#039;span&#039;)&lt;br /&gt;
				:addClass(cfg.classes.box_text)&lt;br /&gt;
				:cssText(font_style)&lt;br /&gt;
				:wikitext(box_text)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local template = args.template&lt;br /&gt;
	local displayed_links = choose_links(template, args)&lt;br /&gt;
	local has_brackets = args.brackets&lt;br /&gt;
	local title_arg = get_title_arg(is_collapsible, template)&lt;br /&gt;
	local title_text = args[title_arg] or (&#039;:&#039; .. mw.getCurrentFrame():getParent():getTitle())&lt;br /&gt;
	local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style)&lt;br /&gt;
	div:node(list)&lt;br /&gt;
&lt;br /&gt;
	if is_collapsible then&lt;br /&gt;
		local title_text_class&lt;br /&gt;
		if is_mini then&lt;br /&gt;
			title_text_class = cfg.classes.collapsible_title_mini&lt;br /&gt;
		else&lt;br /&gt;
			title_text_class = cfg.classes.collapsible_title_full&lt;br /&gt;
		end&lt;br /&gt;
		div:done()&lt;br /&gt;
			:tag(&#039;div&#039;)&lt;br /&gt;
			:addClass(title_text_class)&lt;br /&gt;
			:cssText(font_style)&lt;br /&gt;
			:wikitext(args[1])&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	-- hlist -&amp;gt; navbar is best-effort to preserve old Common.css ordering.&lt;br /&gt;
	return frame:extensionTag{&lt;br /&gt;
		name = &#039;templatestyles&#039;, args = { src = cfg.hlist_templatestyles }&lt;br /&gt;
	} .. frame:extensionTag{&lt;br /&gt;
		name = &#039;templatestyles&#039;, args = { src = cfg.templatestyles }&lt;br /&gt;
	} .. tostring(div:done())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.navbar(frame)&lt;br /&gt;
	return p._navbar(require(&#039;Module:Arguments&#039;).getArgs(frame))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Navbox/styles.css&amp;diff=541</id>
		<title>Модуль:Navbox/styles.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Navbox/styles.css&amp;diff=541"/>
		<updated>2026-01-20T04:42:47Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Защитил страницу Модуль:Navbox/styles.css ([Редактирование=Разрешено только администраторам] (бессрочно) [Переименование=Разрешено только администраторам] (бессрочно)) [каскадная]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* {{pp|small=y}} */&lt;br /&gt;
.navbox {&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
	border: 1px solid #a2a9b1;&lt;br /&gt;
	width: 100%;&lt;br /&gt;
	clear: both;&lt;br /&gt;
	font-size: 88%;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
	padding: 1px;&lt;br /&gt;
	margin: 1em auto 0; /* Prevent preceding content from clinging to navboxes */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox .navbox {&lt;br /&gt;
	margin-top: 0; /* No top margin for nested navboxes */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox + .navbox, /* TODO: remove first line after transclusions have updated */&lt;br /&gt;
.navbox + .navbox-styles + .navbox {&lt;br /&gt;
	margin-top: -1px; /* Single pixel border between adjacent navboxes */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-inner,&lt;br /&gt;
.navbox-subgroup {&lt;br /&gt;
	width: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-group,&lt;br /&gt;
.navbox-title,&lt;br /&gt;
.navbox-abovebelow {&lt;br /&gt;
	padding: 0.25em 1em;&lt;br /&gt;
	line-height: 1.5em;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-group {&lt;br /&gt;
	white-space: nowrap;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox,&lt;br /&gt;
.navbox-subgroup {&lt;br /&gt;
	background-color: #fdfdfd;&lt;br /&gt;
    color:inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-list {&lt;br /&gt;
	line-height: 1.5em;&lt;br /&gt;
	border-color: #fdfdfd; /* Must match background color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-list-with-group {&lt;br /&gt;
	text-align: left;&lt;br /&gt;
	border-left-width: 2px;&lt;br /&gt;
	border-left-style: solid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* cell spacing for navbox cells */&lt;br /&gt;
/* Borders above 2nd, 3rd, etc. rows */&lt;br /&gt;
/* TODO: figure out how to replace tr as structure;&lt;br /&gt;
 * with div structure it should be just a matter of first-child */&lt;br /&gt;
tr + tr &amp;gt; .navbox-abovebelow,&lt;br /&gt;
tr + tr &amp;gt; .navbox-group,&lt;br /&gt;
tr + tr &amp;gt; .navbox-image,&lt;br /&gt;
tr + tr &amp;gt; .navbox-list {&lt;br /&gt;
	border-top: 2px solid #fdfdfd; /* Must match background color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-title {&lt;br /&gt;
	background-color: #ccf; /* Level 1 color */&lt;br /&gt;
    color:inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-abovebelow,&lt;br /&gt;
.navbox-group,&lt;br /&gt;
.navbox-subgroup .navbox-title {&lt;br /&gt;
	background-color: #ddf; /* Level 2 color */&lt;br /&gt;
    color:inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-subgroup .navbox-group,&lt;br /&gt;
.navbox-subgroup .navbox-abovebelow {&lt;br /&gt;
	background-color: #e6e6ff; /* Level 3 color */&lt;br /&gt;
    color:inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-even {&lt;br /&gt;
	background-color: #f7f7f7;&lt;br /&gt;
    color:inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-odd {&lt;br /&gt;
	background-color: transparent;&lt;br /&gt;
    color:inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* TODO: figure out how to remove reliance on td as structure */&lt;br /&gt;
.navbox .hlist td dl,&lt;br /&gt;
.navbox .hlist td ol,&lt;br /&gt;
.navbox .hlist td ul,&lt;br /&gt;
.navbox td.hlist dl,&lt;br /&gt;
.navbox td.hlist ol,&lt;br /&gt;
.navbox td.hlist ul {&lt;br /&gt;
	padding: 0.125em 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox .navbar {&lt;br /&gt;
	display: block;&lt;br /&gt;
	font-size: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-title .navbar {&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	float: left;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	text-align: left;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	margin-right: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** T367463 */&lt;br /&gt;
body.skin--responsive .navbox-image img {&lt;br /&gt;
	max-width: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media print {&lt;br /&gt;
	body.ns-0 .navbox {&lt;br /&gt;
		display: none !important;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Navbox&amp;diff=540</id>
		<title>Модуль:Navbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Navbox&amp;diff=540"/>
		<updated>2026-01-20T04:42:24Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Защитил страницу Модуль:Navbox ([Редактирование=Разрешено только администраторам] (бессрочно) [Переименование=Разрешено только администраторам] (бессрочно)) [каскадная]&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;require(&#039;strict&#039;)&lt;br /&gt;
local p = {}&lt;br /&gt;
local cfg = mw.loadData(&#039;Module:Navbox/configuration&#039;)&lt;br /&gt;
local inArray = require(&amp;quot;Module:TableTools&amp;quot;).inArray&lt;br /&gt;
local getArgs -- lazily initialized&lt;br /&gt;
local hiding_templatestyles = {} &lt;br /&gt;
&lt;br /&gt;
-- global passthrough variables&lt;br /&gt;
local passthrough = {&lt;br /&gt;
	[cfg.arg.above]=true,[cfg.arg.aboveclass]=true,[cfg.arg.abovestyle]=true,&lt;br /&gt;
	[cfg.arg.basestyle]=true,&lt;br /&gt;
	[cfg.arg.below]=true,[cfg.arg.belowclass]=true,[cfg.arg.belowstyle]=true,&lt;br /&gt;
	[cfg.arg.bodyclass]=true,&lt;br /&gt;
	[cfg.arg.groupclass]=true,&lt;br /&gt;
	[cfg.arg.image]=true,[cfg.arg.imageclass]=true,[cfg.arg.imagestyle]=true,&lt;br /&gt;
	[cfg.arg.imageleft]=true,[cfg.arg.imageleftstyle]=true,&lt;br /&gt;
	[cfg.arg.listclass]=true,&lt;br /&gt;
	[cfg.arg.name]=true,&lt;br /&gt;
	[cfg.arg.navbar]=true,&lt;br /&gt;
	[cfg.arg.state]=true,&lt;br /&gt;
	[cfg.arg.title]=true,[cfg.arg.titleclass]=true,[cfg.arg.titlestyle]=true,&lt;br /&gt;
	argHash=true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- helper functions&lt;br /&gt;
local andnum = function(s, n) return string.format(cfg.arg[s .. &#039;_and_num&#039;], n) end&lt;br /&gt;
local isblank = function(v) return (v or &#039;&#039;) == &#039;&#039; end&lt;br /&gt;
&lt;br /&gt;
local function concatstrings(s)&lt;br /&gt;
	local r = table.concat(s, &#039;&#039;)&lt;br /&gt;
	if r:match(&#039;^%s*$&#039;) then return nil end&lt;br /&gt;
	return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function concatstyles(s)&lt;br /&gt;
	local r = &#039;&#039;&lt;br /&gt;
	for _, v in ipairs(s) do&lt;br /&gt;
		v = mw.text.trim(v, &amp;quot;%s;&amp;quot;)&lt;br /&gt;
		if not isblank(v) then r = r .. v .. &#039;;&#039; end&lt;br /&gt;
	end&lt;br /&gt;
	if isblank(r) then return nil end&lt;br /&gt;
	return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getSubgroup(args, listnum, listText, prefix)&lt;br /&gt;
	local subArgs = {&lt;br /&gt;
		[cfg.arg.border] = cfg.keyword.border_subgroup,&lt;br /&gt;
		[cfg.arg.navbar] = cfg.keyword.navbar_plain,&lt;br /&gt;
		argHash = 0&lt;br /&gt;
	}&lt;br /&gt;
	local hasSubArgs = false&lt;br /&gt;
	local subgroups_and_num = prefix and {prefix} or cfg.arg.subgroups_and_num&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		k = tostring(k)&lt;br /&gt;
		for _, w in ipairs(subgroups_and_num) do&lt;br /&gt;
			w = string.format(w, listnum) .. &amp;quot;_&amp;quot;&lt;br /&gt;
			if (#k &amp;gt; #w) and (k:sub(1, #w) == w) then&lt;br /&gt;
				subArgs[k:sub(#w + 1)] = v&lt;br /&gt;
				hasSubArgs = true&lt;br /&gt;
				subArgs.argHash = subArgs.argHash + (v and #v or 0)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return hasSubArgs and p._navbox(subArgs) or listText&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Main functions&lt;br /&gt;
function p._navbox(args)&lt;br /&gt;
	if args.type == cfg.keyword.with_collapsible_groups then&lt;br /&gt;
		return p._withCollapsibleGroups(args)&lt;br /&gt;
	elseif args.type == cfg.keyword.with_columns then&lt;br /&gt;
		return p._withColumns(args)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function striped(wikitext, border)&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 = cfg.category.orphan&lt;br /&gt;
		if border == cfg.keyword.border_subgroup and args[cfg.arg.orphan] ~= cfg.keyword.orphan_yes 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 = cfg.class.navbox_odd_part, cfg.class.navbox_even_part&lt;br /&gt;
		if args[cfg.arg.evenodd] then&lt;br /&gt;
			if args[cfg.arg.evenodd] == cfg.keyword.evenodd_swap then&lt;br /&gt;
				first, second = second, first&lt;br /&gt;
			else&lt;br /&gt;
				first = args[cfg.arg.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 == &#039;0&#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(&#039;([%[%]])&#039;, &#039;%%%1&#039;)&lt;br /&gt;
		return (wikitext:gsub(regex, &#039;&#039;):gsub(cfg.marker.regex, changer)) -- () omits gsub count&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function processItem(item, nowrapitems)&lt;br /&gt;
		if item:sub(1, 2) == &#039;{|&#039; then&lt;br /&gt;
			-- Applying nowrap to lines in a table does not make sense.&lt;br /&gt;
			-- Add newlines to compensate for trim of x in |parm=x in a template.&lt;br /&gt;
			return &#039;\n&#039; .. item .. &#039;\n&#039;&lt;br /&gt;
		end&lt;br /&gt;
		if nowrapitems == cfg.keyword.nowrapitems_yes then&lt;br /&gt;
			local lines = {}&lt;br /&gt;
			for line in (item .. &#039;\n&#039;):gmatch(&#039;([^\n]*)\n&#039;) do&lt;br /&gt;
				local prefix, content = line:match(&#039;^([*:;#]+)%s*(.*)&#039;)&lt;br /&gt;
				if prefix and not content:match(cfg.pattern.nowrap) then&lt;br /&gt;
					line = string.format(cfg.nowrap_item, prefix, content)&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(lines, line)&lt;br /&gt;
			end&lt;br /&gt;
			item = table.concat(lines, &#039;\n&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if item:match(&#039;^[*:;#]&#039;) then&lt;br /&gt;
			return &#039;\n&#039; .. item .. &#039;\n&#039;&lt;br /&gt;
		end&lt;br /&gt;
		return item&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function has_navbar()&lt;br /&gt;
		return args[cfg.arg.navbar] ~= cfg.keyword.navbar_off&lt;br /&gt;
			and args[cfg.arg.navbar] ~= cfg.keyword.navbar_plain&lt;br /&gt;
			and (&lt;br /&gt;
				args[cfg.arg.name]&lt;br /&gt;
				or mw.getCurrentFrame():getParent():getTitle():gsub(cfg.pattern.sandbox, &#039;&#039;)&lt;br /&gt;
					~= cfg.pattern.navbox&lt;br /&gt;
			)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- extract text color from css, which is the only permitted inline CSS for the navbar&lt;br /&gt;
	local function extract_color(css_str)&lt;br /&gt;
		-- return nil because navbar takes its argument into mw.html which handles&lt;br /&gt;
		-- nil gracefully, removing the associated style attribute&lt;br /&gt;
		return mw.ustring.match(&#039;;&#039; .. css_str .. &#039;;&#039;, &#039;.*;%s*([Cc][Oo][Ll][Oo][Rr]%s*:%s*.-)%s*;&#039;) or nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function renderNavBar(titleCell)&lt;br /&gt;
		if has_navbar() then&lt;br /&gt;
			local navbar = require(&#039;Module:Navbar&#039;)._navbar&lt;br /&gt;
			titleCell:wikitext(navbar{&lt;br /&gt;
				[cfg.navbar.name] = args[cfg.arg.name],&lt;br /&gt;
				[cfg.navbar.mini] = 1,&lt;br /&gt;
				[cfg.navbar.fontstyle] = extract_color(&lt;br /&gt;
					(args[cfg.arg.basestyle] or &#039;&#039;) .. &#039;;&#039; .. (args[cfg.arg.titlestyle] or &#039;&#039;)&lt;br /&gt;
				)&lt;br /&gt;
			})&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function renderTitleRow(tbl)&lt;br /&gt;
		if not args[cfg.arg.title] then return end&lt;br /&gt;
&lt;br /&gt;
		local titleRow = tbl:tag(&#039;tr&#039;)&lt;br /&gt;
&lt;br /&gt;
		local titleCell = titleRow:tag(&#039;th&#039;):attr(&#039;scope&#039;, &#039;col&#039;)&lt;br /&gt;
&lt;br /&gt;
		local titleColspan = 2&lt;br /&gt;
		if args[cfg.arg.imageleft] then titleColspan = titleColspan + 1 end&lt;br /&gt;
		if args[cfg.arg.image] then titleColspan = titleColspan + 1 end&lt;br /&gt;
&lt;br /&gt;
		titleCell&lt;br /&gt;
			:cssText(args[cfg.arg.basestyle])&lt;br /&gt;
			:cssText(args[cfg.arg.titlestyle])&lt;br /&gt;
			:addClass(cfg.class.navbox_title)&lt;br /&gt;
			:attr(&#039;colspan&#039;, titleColspan)&lt;br /&gt;
&lt;br /&gt;
		renderNavBar(titleCell)&lt;br /&gt;
&lt;br /&gt;
		titleCell&lt;br /&gt;
			:tag(&#039;div&#039;)&lt;br /&gt;
				-- id for aria-labelledby attribute&lt;br /&gt;
				:attr(&#039;id&#039;, mw.uri.anchorEncode(args[cfg.arg.title]) .. args.argHash)&lt;br /&gt;
				:addClass(args[cfg.arg.titleclass])&lt;br /&gt;
				:css(&#039;font-size&#039;, &#039;114%&#039;)&lt;br /&gt;
				:css(&#039;margin&#039;, &#039;0 4em&#039;)&lt;br /&gt;
				:wikitext(processItem(args[cfg.arg.title]))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function getAboveBelowColspan()&lt;br /&gt;
		local ret = 2&lt;br /&gt;
		if args[cfg.arg.imageleft] then ret = ret + 1 end&lt;br /&gt;
		if args[cfg.arg.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)&lt;br /&gt;
		if not args[cfg.arg.above] then return end&lt;br /&gt;
&lt;br /&gt;
		tbl:tag(&#039;tr&#039;)&lt;br /&gt;
			:tag(&#039;td&#039;)&lt;br /&gt;
				:addClass(cfg.class.navbox_abovebelow)&lt;br /&gt;
				:addClass(args[cfg.arg.aboveclass])&lt;br /&gt;
				:cssText(args[cfg.arg.basestyle])&lt;br /&gt;
				:cssText(args[cfg.arg.abovestyle])&lt;br /&gt;
				:attr(&#039;colspan&#039;, getAboveBelowColspan())&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					-- id for aria-labelledby attribute, if no title&lt;br /&gt;
					:attr(&#039;id&#039;, (not args[cfg.arg.title]) and &lt;br /&gt;
						(mw.uri.anchorEncode(args[cfg.arg.above]) .. args.argHash)&lt;br /&gt;
						or nil)&lt;br /&gt;
					:wikitext(processItem(args[cfg.arg.above], args[cfg.arg.nowrapitems]))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function renderBelowRow(tbl)&lt;br /&gt;
		if not args[cfg.arg.below] then return end&lt;br /&gt;
&lt;br /&gt;
		tbl:tag(&#039;tr&#039;)&lt;br /&gt;
			:tag(&#039;td&#039;)&lt;br /&gt;
				:addClass(cfg.class.navbox_abovebelow)&lt;br /&gt;
				:addClass(args[cfg.arg.belowclass])&lt;br /&gt;
				:cssText(args[cfg.arg.basestyle])&lt;br /&gt;
				:cssText(args[cfg.arg.belowstyle])&lt;br /&gt;
				:attr(&#039;colspan&#039;, getAboveBelowColspan())&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:wikitext(processItem(args[cfg.arg.below], args[cfg.arg.nowrapitems]))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function renderListRow(tbl, index, listnum, listnums_size)&lt;br /&gt;
		local row = tbl:tag(&#039;tr&#039;)&lt;br /&gt;
&lt;br /&gt;
		if index == 1 and args[cfg.arg.imageleft] then&lt;br /&gt;
			row&lt;br /&gt;
				:tag(&#039;td&#039;)&lt;br /&gt;
					:addClass(cfg.class.noviewer)&lt;br /&gt;
					:addClass(cfg.class.navbox_image)&lt;br /&gt;
					:addClass(args[cfg.arg.imageclass])&lt;br /&gt;
					:css(&#039;width&#039;, &#039;1px&#039;)               -- Minimize width&lt;br /&gt;
					:css(&#039;padding&#039;, &#039;0 2px 0 0&#039;)&lt;br /&gt;
					:cssText(args[cfg.arg.imageleftstyle])&lt;br /&gt;
					:attr(&#039;rowspan&#039;, listnums_size)&lt;br /&gt;
					:tag(&#039;div&#039;)&lt;br /&gt;
						:wikitext(processItem(args[cfg.arg.imageleft]))&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local group_and_num = andnum(&#039;group&#039;, listnum)&lt;br /&gt;
		local groupstyle_and_num = andnum(&#039;groupstyle&#039;, listnum)&lt;br /&gt;
		if args[group_and_num] then&lt;br /&gt;
			local groupCell = row:tag(&#039;th&#039;)&lt;br /&gt;
&lt;br /&gt;
			-- id for aria-labelledby attribute, if lone group with no title or above&lt;br /&gt;
			if listnum == 1 and not (args[cfg.arg.title] or args[cfg.arg.above] or args[cfg.arg.group2]) then&lt;br /&gt;
				groupCell&lt;br /&gt;
					:attr(&#039;id&#039;, mw.uri.anchorEncode(args[cfg.arg.group1]) .. args.argHash)&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			groupCell&lt;br /&gt;
				:attr(&#039;scope&#039;, &#039;row&#039;)&lt;br /&gt;
				:addClass(cfg.class.navbox_group)&lt;br /&gt;
				:addClass(args[cfg.arg.groupclass])&lt;br /&gt;
				:cssText(args[cfg.arg.basestyle])&lt;br /&gt;
				-- If groupwidth not specified, minimize width&lt;br /&gt;
				:css(&#039;width&#039;, args[cfg.arg.groupwidth] or &#039;1%&#039;)&lt;br /&gt;
&lt;br /&gt;
			groupCell&lt;br /&gt;
				:cssText(args[cfg.arg.groupstyle])&lt;br /&gt;
				:cssText(args[groupstyle_and_num])&lt;br /&gt;
				:wikitext(args[group_and_num])&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local listCell = row:tag(&#039;td&#039;)&lt;br /&gt;
&lt;br /&gt;
		if args[group_and_num] then&lt;br /&gt;
			listCell&lt;br /&gt;
				:addClass(cfg.class.navbox_list_with_group)&lt;br /&gt;
		else&lt;br /&gt;
			listCell:attr(&#039;colspan&#039;, 2)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if not args[cfg.arg.groupwidth] then&lt;br /&gt;
			listCell:css(&#039;width&#039;, &#039;100%&#039;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local rowstyle  -- usually nil so cssText(rowstyle) usually adds nothing&lt;br /&gt;
		if index % 2 == 1 then&lt;br /&gt;
			rowstyle = args[cfg.arg.oddstyle]&lt;br /&gt;
		else&lt;br /&gt;
			rowstyle = args[cfg.arg.evenstyle]&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local list_and_num = andnum(&#039;list&#039;, listnum)&lt;br /&gt;
		local listText = inArray(cfg.keyword.subgroups, args[list_and_num])&lt;br /&gt;
			and getSubgroup(args, listnum, args[list_and_num]) or args[list_and_num]&lt;br /&gt;
&lt;br /&gt;
		local oddEven = cfg.marker.oddeven&lt;br /&gt;
		if listText:sub(1, 12) == &#039;&amp;lt;/div&amp;gt;&amp;lt;table&#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(cfg.pattern.navbox_title) and cfg.marker.restart or cfg.class.navbox_odd_part&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local liststyle_and_num = andnum(&#039;liststyle&#039;, listnum)&lt;br /&gt;
		local listclass_and_num = andnum(&#039;listclass&#039;, listnum)&lt;br /&gt;
		listCell&lt;br /&gt;
			:css(&#039;padding&#039;, &#039;0&#039;)&lt;br /&gt;
			:cssText(args[cfg.arg.liststyle])&lt;br /&gt;
			:cssText(rowstyle)&lt;br /&gt;
			:cssText(args[liststyle_and_num])&lt;br /&gt;
			:addClass(cfg.class.navbox_list)&lt;br /&gt;
			:addClass(cfg.class.navbox_part .. oddEven)&lt;br /&gt;
			:addClass(args[cfg.arg.listclass])&lt;br /&gt;
			:addClass(args[listclass_and_num])&lt;br /&gt;
			:tag(&#039;div&#039;)&lt;br /&gt;
				:css(&#039;padding&#039;,&lt;br /&gt;
					(index == 1 and args[cfg.arg.list1padding]) or args[cfg.arg.listpadding] or &#039;0 0.25em&#039;&lt;br /&gt;
				)&lt;br /&gt;
				:wikitext(processItem(listText, args[cfg.arg.nowrapitems]))&lt;br /&gt;
&lt;br /&gt;
		if index == 1 and args[cfg.arg.image] then&lt;br /&gt;
			row&lt;br /&gt;
				:tag(&#039;td&#039;)&lt;br /&gt;
					:addClass(cfg.class.noviewer)&lt;br /&gt;
					:addClass(cfg.class.navbox_image)&lt;br /&gt;
					:addClass(args[cfg.arg.imageclass])&lt;br /&gt;
					:css(&#039;width&#039;, &#039;1px&#039;)               -- Minimize width&lt;br /&gt;
					:css(&#039;padding&#039;, &#039;0 0 0 2px&#039;)&lt;br /&gt;
					:cssText(args[cfg.arg.imagestyle])&lt;br /&gt;
					:attr(&#039;rowspan&#039;, listnums_size)&lt;br /&gt;
					:tag(&#039;div&#039;)&lt;br /&gt;
						:wikitext(processItem(args[cfg.arg.image]))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function has_list_class(htmlclass)&lt;br /&gt;
		local patterns = {&lt;br /&gt;
			&#039;^&#039; .. htmlclass .. &#039;$&#039;,&lt;br /&gt;
			&#039;%s&#039; .. htmlclass .. &#039;$&#039;,&lt;br /&gt;
			&#039;^&#039; .. htmlclass .. &#039;%s&#039;,&lt;br /&gt;
			&#039;%s&#039; .. htmlclass .. &#039;%s&#039;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		for arg, _ in pairs(args) do&lt;br /&gt;
			if type(arg) == &#039;string&#039; and mw.ustring.find(arg, cfg.pattern.class) then&lt;br /&gt;
				for _, pattern in ipairs(patterns) do&lt;br /&gt;
					if mw.ustring.find(args[arg] or &#039;&#039;, pattern) then&lt;br /&gt;
						return true&lt;br /&gt;
					end&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;
	-- there are a lot of list classes in the wild, so we add their TemplateStyles&lt;br /&gt;
	local function add_list_styles()&lt;br /&gt;
		local frame = mw.getCurrentFrame()&lt;br /&gt;
		local function add_list_templatestyles(htmlclass, templatestyles)&lt;br /&gt;
			if has_list_class(htmlclass) then&lt;br /&gt;
				return frame:extensionTag{&lt;br /&gt;
					name = &#039;templatestyles&#039;, args = { src = templatestyles }&lt;br /&gt;
				}&lt;br /&gt;
			else&lt;br /&gt;
				return &#039;&#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local hlist_styles = add_list_templatestyles(&#039;hlist&#039;, cfg.hlist_templatestyles)&lt;br /&gt;
		local plainlist_styles = add_list_templatestyles(&#039;plainlist&#039;, cfg.plainlist_templatestyles)&lt;br /&gt;
&lt;br /&gt;
		-- a second workaround for [[phab:T303378]]&lt;br /&gt;
		-- when that issue is fixed, we can actually use has_navbar not to emit the&lt;br /&gt;
		-- tag here if we want&lt;br /&gt;
		if has_navbar() and hlist_styles == &#039;&#039; then&lt;br /&gt;
			hlist_styles = frame:extensionTag{&lt;br /&gt;
				name = &#039;templatestyles&#039;, args = { src = cfg.hlist_templatestyles }&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- hlist -&amp;gt; plainlist is best-effort to preserve old Common.css ordering.&lt;br /&gt;
		-- this ordering is not a guarantee because most navboxes will emit only&lt;br /&gt;
		-- one of these classes [hlist_note]&lt;br /&gt;
		return hlist_styles .. plainlist_styles&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function needsHorizontalLists(border)&lt;br /&gt;
		if border == cfg.keyword.border_subgroup or args[cfg.arg.tracking] == cfg.keyword.tracking_no then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
		return not has_list_class(cfg.pattern.hlist) and not has_list_class(cfg.pattern.plainlist)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function hasBackgroundColors()&lt;br /&gt;
		for _, key in ipairs({cfg.arg.titlestyle, cfg.arg.groupstyle,&lt;br /&gt;
			cfg.arg.basestyle, cfg.arg.abovestyle, cfg.arg.belowstyle}) do&lt;br /&gt;
			if tostring(args[key]):find(&#039;background&#039;, 1, true) 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 hasBorders()&lt;br /&gt;
		for _, key in ipairs({cfg.arg.groupstyle, cfg.arg.basestyle,&lt;br /&gt;
			cfg.arg.abovestyle, cfg.arg.belowstyle}) do&lt;br /&gt;
			if tostring(args[key]):find(&#039;border&#039;, 1, true) 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 isIllegible()&lt;br /&gt;
		local styleratio = require(&#039;Module:Color contrast&#039;)._styleratio&lt;br /&gt;
		for key, style in pairs(args) do&lt;br /&gt;
			if tostring(key):match(cfg.pattern.style) 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(border)&lt;br /&gt;
		local cats = {}&lt;br /&gt;
		if needsHorizontalLists(border) then table.insert(cats, cfg.category.horizontal_lists) end&lt;br /&gt;
		if hasBackgroundColors() then table.insert(cats, cfg.category.background_colors) end&lt;br /&gt;
		if isIllegible() then table.insert(cats, cfg.category.illegible) end&lt;br /&gt;
		if hasBorders() then table.insert(cats, cfg.category.borders) end&lt;br /&gt;
		return cats&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function renderTrackingCategories(builder, border)&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 == cfg.keyword.subpage_doc or subpage == cfg.keyword.subpage_sandbox&lt;br /&gt;
			or subpage == cfg.keyword.subpage_testcases then return end&lt;br /&gt;
&lt;br /&gt;
		for _, cat in ipairs(getTrackingCategories(border)) do&lt;br /&gt;
			builder:wikitext(&#039;[[Category:&#039; .. cat .. &#039;]]&#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function renderMainTable(border, listnums)&lt;br /&gt;
		local tbl = mw.html.create(&#039;table&#039;)&lt;br /&gt;
			:addClass(cfg.class.nowraplinks)&lt;br /&gt;
			:addClass(args[cfg.arg.bodyclass])&lt;br /&gt;
&lt;br /&gt;
		local state = args[cfg.arg.state]&lt;br /&gt;
		if args[cfg.arg.title] and state ~= cfg.keyword.state_plain and state ~= cfg.keyword.state_off then&lt;br /&gt;
			if state == cfg.keyword.state_collapsed then&lt;br /&gt;
				state = cfg.class.collapsed&lt;br /&gt;
			end&lt;br /&gt;
			tbl&lt;br /&gt;
				:addClass(cfg.class.collapsible)&lt;br /&gt;
				:addClass(state or cfg.class.autocollapse)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		tbl:css(&#039;border-spacing&#039;, 0)&lt;br /&gt;
		if border == cfg.keyword.border_subgroup or border == cfg.keyword.border_none then&lt;br /&gt;
			tbl&lt;br /&gt;
				:addClass(cfg.class.navbox_subgroup)&lt;br /&gt;
				:cssText(args[cfg.arg.bodystyle])&lt;br /&gt;
				:cssText(args[cfg.arg.style])&lt;br /&gt;
		else  -- regular navbox - bodystyle and style will be applied to the wrapper table&lt;br /&gt;
			tbl&lt;br /&gt;
				:addClass(cfg.class.navbox_inner)&lt;br /&gt;
				:css(&#039;background&#039;, &#039;transparent&#039;)&lt;br /&gt;
				:css(&#039;color&#039;, &#039;inherit&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		tbl:cssText(args[cfg.arg.innerstyle])&lt;br /&gt;
&lt;br /&gt;
		renderTitleRow(tbl)&lt;br /&gt;
		renderAboveRow(tbl)&lt;br /&gt;
		local listnums_size = #listnums&lt;br /&gt;
		for i, listnum in ipairs(listnums) do&lt;br /&gt;
			renderListRow(tbl, i, listnum, listnums_size)&lt;br /&gt;
		end&lt;br /&gt;
		renderBelowRow(tbl)&lt;br /&gt;
&lt;br /&gt;
		return tbl&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function add_navbox_styles(hiding_templatestyles)&lt;br /&gt;
		local frame = mw.getCurrentFrame()&lt;br /&gt;
		-- This is a lambda so that it doesn&#039;t need the frame as a parameter&lt;br /&gt;
		local function add_user_styles(templatestyles)&lt;br /&gt;
			if not isblank(templatestyles) then&lt;br /&gt;
				return frame:extensionTag{&lt;br /&gt;
					name = &#039;templatestyles&#039;, args = { src = templatestyles }&lt;br /&gt;
				}&lt;br /&gt;
			end&lt;br /&gt;
			return &#039;&#039;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- get templatestyles. load base from config so that Lua only needs to do&lt;br /&gt;
		-- the work once of parser tag expansion&lt;br /&gt;
		local base_templatestyles = cfg.templatestyles&lt;br /&gt;
		local templatestyles = add_user_styles(args[cfg.arg.templatestyles])&lt;br /&gt;
		local child_templatestyles = add_user_styles(args[cfg.arg.child_templatestyles])&lt;br /&gt;
&lt;br /&gt;
		-- The &#039;navbox-styles&#039; div exists to wrap the styles to work around T200206&lt;br /&gt;
		-- more elegantly. Instead of combinatorial rules, this ends up being linear&lt;br /&gt;
		-- number of CSS rules.&lt;br /&gt;
		return mw.html.create(&#039;div&#039;)&lt;br /&gt;
			:addClass(cfg.class.navbox_styles)&lt;br /&gt;
			:wikitext(&lt;br /&gt;
				add_list_styles() .. -- see [hlist_note] applied to &#039;before base_templatestyles&#039;&lt;br /&gt;
				base_templatestyles ..&lt;br /&gt;
				templatestyles ..&lt;br /&gt;
				child_templatestyles ..&lt;br /&gt;
				table.concat(hiding_templatestyles)&lt;br /&gt;
			)&lt;br /&gt;
			:done()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- work around [[phab:T303378]]&lt;br /&gt;
	-- for each arg: find all the templatestyles strip markers, insert them into a&lt;br /&gt;
	-- table. then remove all templatestyles markers from the arg&lt;br /&gt;
	local strip_marker_pattern = &#039;(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)&#039;&lt;br /&gt;
	local argHash = 0&lt;br /&gt;
	for k, arg in pairs(args) do&lt;br /&gt;
		if type(arg) == &#039;string&#039; then&lt;br /&gt;
			for marker in string.gfind(arg, strip_marker_pattern) do&lt;br /&gt;
				table.insert(hiding_templatestyles, marker)&lt;br /&gt;
			end&lt;br /&gt;
			argHash = argHash + #arg&lt;br /&gt;
			args[k] = string.gsub(arg, strip_marker_pattern, &#039;&#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not args.argHash then args.argHash = argHash end&lt;br /&gt;
&lt;br /&gt;
	local listnums = {}&lt;br /&gt;
&lt;br /&gt;
	for k, _ in pairs(args) do&lt;br /&gt;
		if type(k) == &#039;string&#039; then&lt;br /&gt;
			local listnum = k:match(cfg.pattern.listnum)&lt;br /&gt;
			if listnum and args[andnum(&#039;list&#039;, tonumber(listnum))] then&lt;br /&gt;
				table.insert(listnums, tonumber(listnum))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(listnums)&lt;br /&gt;
&lt;br /&gt;
	local border = mw.text.trim(args[cfg.arg.border] or args[1] or &#039;&#039;)&lt;br /&gt;
	if border == cfg.keyword.border_child then&lt;br /&gt;
		border = cfg.keyword.border_subgroup&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- render the main body of the navbox&lt;br /&gt;
	local tbl = renderMainTable(border, listnums)&lt;br /&gt;
&lt;br /&gt;
	local res = mw.html.create()&lt;br /&gt;
	-- render the appropriate wrapper for the navbox, based on the border param&lt;br /&gt;
&lt;br /&gt;
	if border == cfg.keyword.border_none then&lt;br /&gt;
		res:node(add_navbox_styles(hiding_templatestyles))&lt;br /&gt;
		local nav = res:tag(&#039;div&#039;)&lt;br /&gt;
			:attr(&#039;role&#039;, &#039;navigation&#039;)&lt;br /&gt;
			:node(tbl)&lt;br /&gt;
		-- aria-labelledby title, otherwise above, otherwise lone group&lt;br /&gt;
		if args[cfg.arg.title] or args[cfg.arg.above] or (args[cfg.arg.group1]&lt;br /&gt;
			and not args[cfg.arg.group2]) then&lt;br /&gt;
			nav:attr(&lt;br /&gt;
				&#039;aria-labelledby&#039;,&lt;br /&gt;
				mw.uri.anchorEncode(&lt;br /&gt;
					args[cfg.arg.title] or args[cfg.arg.above] or args[cfg.arg.group1]&lt;br /&gt;
				) .. args.argHash&lt;br /&gt;
			)&lt;br /&gt;
		else&lt;br /&gt;
			nav:attr(&#039;aria-label&#039;, cfg.aria_label .. args.argHash)&lt;br /&gt;
		end&lt;br /&gt;
	elseif border == cfg.keyword.border_subgroup then&lt;br /&gt;
		-- We assume that this navbox is being rendered in a list cell of a&lt;br /&gt;
		-- parent navbox, and is therefore inside a div with padding:0em 0.25em.&lt;br /&gt;
		-- We start with a &amp;lt;/div&amp;gt; to avoid the padding being applied, and at the&lt;br /&gt;
		-- end add a &amp;lt;div&amp;gt; to balance out the parent&#039;s &amp;lt;/div&amp;gt;&lt;br /&gt;
		res&lt;br /&gt;
			:wikitext(&#039;&amp;lt;/div&amp;gt;&#039;)&lt;br /&gt;
			:node(tbl)&lt;br /&gt;
			:wikitext(&#039;&amp;lt;div&amp;gt;&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		res:node(add_navbox_styles(hiding_templatestyles))&lt;br /&gt;
		local nav = res:tag(&#039;div&#039;)&lt;br /&gt;
			:attr(&#039;role&#039;, &#039;navigation&#039;)&lt;br /&gt;
			:addClass(cfg.class.navbox)&lt;br /&gt;
			:addClass(args[cfg.arg.navboxclass])&lt;br /&gt;
			:cssText(args[cfg.arg.bodystyle])&lt;br /&gt;
			:cssText(args[cfg.arg.style])&lt;br /&gt;
			:css(&#039;padding&#039;, &#039;3px&#039;)&lt;br /&gt;
			:node(tbl)&lt;br /&gt;
		-- aria-labelledby title, otherwise above, otherwise lone group&lt;br /&gt;
		if args[cfg.arg.title] or args[cfg.arg.above]&lt;br /&gt;
			or (args[cfg.arg.group1] and not args[cfg.arg.group2]) then&lt;br /&gt;
			nav:attr(&lt;br /&gt;
				&#039;aria-labelledby&#039;,&lt;br /&gt;
				mw.uri.anchorEncode(&lt;br /&gt;
					args[cfg.arg.title] or args[cfg.arg.above] or args[cfg.arg.group1]&lt;br /&gt;
				) .. args.argHash&lt;br /&gt;
			)&lt;br /&gt;
		else&lt;br /&gt;
			nav:attr(&#039;aria-label&#039;, cfg.aria_label .. args.argHash)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if (args[cfg.arg.nocat] or cfg.keyword.nocat_false):lower() == cfg.keyword.nocat_false then&lt;br /&gt;
		renderTrackingCategories(res, border)&lt;br /&gt;
	end&lt;br /&gt;
	return striped(tostring(res), border)&lt;br /&gt;
end --p._navbox&lt;br /&gt;
&lt;br /&gt;
function p._withCollapsibleGroups(pargs)&lt;br /&gt;
	-- table for args passed to navbox&lt;br /&gt;
	local targs = {}&lt;br /&gt;
&lt;br /&gt;
	-- process args&lt;br /&gt;
	local passthroughLocal = {&lt;br /&gt;
		[cfg.arg.bodystyle] = true,&lt;br /&gt;
		[cfg.arg.border] = true,&lt;br /&gt;
		[cfg.arg.style] = true,&lt;br /&gt;
	}&lt;br /&gt;
	for k,v in pairs(pargs) do&lt;br /&gt;
		if k and type(k) == &#039;string&#039; then&lt;br /&gt;
			if passthrough[k] or passthroughLocal[k] then&lt;br /&gt;
				targs[k] = v&lt;br /&gt;
			elseif (k:match(cfg.pattern.num)) then&lt;br /&gt;
				local n = k:match(cfg.pattern.num)&lt;br /&gt;
				local list_and_num = andnum(&#039;list&#039;, n)&lt;br /&gt;
				if ((k:match(cfg.pattern.listnum) or k:match(cfg.pattern.contentnum))&lt;br /&gt;
						and targs[list_and_num] == nil&lt;br /&gt;
						and pargs[andnum(&#039;group&#039;, n)] == nil&lt;br /&gt;
						and pargs[andnum(&#039;sect&#039;, n)] == nil&lt;br /&gt;
						and pargs[andnum(&#039;section&#039;, n)] == nil) then&lt;br /&gt;
					targs[list_and_num] = concatstrings({&lt;br /&gt;
						pargs[list_and_num] or &#039;&#039;,&lt;br /&gt;
						pargs[andnum(&#039;content&#039;, n)] or &#039;&#039;&lt;br /&gt;
					})&lt;br /&gt;
					if (targs[list_and_num] and inArray(cfg.keyword.subgroups, targs[list_and_num])) then&lt;br /&gt;
						targs[list_and_num] = getSubgroup(pargs, n, targs[list_and_num])&lt;br /&gt;
					end&lt;br /&gt;
				elseif ((k:match(cfg.pattern.groupnum) or k:match(cfg.pattern.sectnum) or k:match(cfg.pattern.sectionnum))&lt;br /&gt;
						and targs[list_and_num] == nil) then&lt;br /&gt;
					local titlestyle = concatstyles({&lt;br /&gt;
						pargs[cfg.arg.groupstyle] or &#039;&#039;,&lt;br /&gt;
						pargs[cfg.arg.secttitlestyle] or &#039;&#039;, &lt;br /&gt;
						pargs[andnum(&#039;groupstyle&#039;, n)] or &#039;&#039;, &lt;br /&gt;
						pargs[andnum(&#039;sectiontitlestyle&#039;, n)] or &#039;&#039;&lt;br /&gt;
					})&lt;br /&gt;
					local liststyle = concatstyles({&lt;br /&gt;
						pargs[cfg.arg.liststyle] or &#039;&#039;,&lt;br /&gt;
						pargs[cfg.arg.contentstyle] or &#039;&#039;, &lt;br /&gt;
						pargs[andnum(&#039;liststyle&#039;, n)] or &#039;&#039;, &lt;br /&gt;
						pargs[andnum(&#039;contentstyle&#039;, n)] or &#039;&#039;&lt;br /&gt;
					})&lt;br /&gt;
					local title = concatstrings({&lt;br /&gt;
						pargs[andnum(&#039;group&#039;, n)] or &#039;&#039;,&lt;br /&gt;
						pargs[andnum(&#039;sect&#039;, n)] or &#039;&#039;,&lt;br /&gt;
						pargs[andnum(&#039;section&#039;, n)] or &#039;&#039;&lt;br /&gt;
					})&lt;br /&gt;
					local list = concatstrings({&lt;br /&gt;
						pargs[list_and_num] or &#039;&#039;, &lt;br /&gt;
						pargs[andnum(&#039;content&#039;, n)] or &#039;&#039;&lt;br /&gt;
					})&lt;br /&gt;
					if list and inArray(cfg.keyword.subgroups, list) then&lt;br /&gt;
						list = getSubgroup(pargs, n, list)&lt;br /&gt;
					end&lt;br /&gt;
					local abbr_and_num = andnum(&#039;abbr&#039;, n)&lt;br /&gt;
					local state = (pargs[abbr_and_num] and pargs[abbr_and_num] == pargs[cfg.arg.selected]) &lt;br /&gt;
						and cfg.keyword.state_uncollapsed&lt;br /&gt;
						or (pargs[andnum(&#039;state&#039;, n)] or cfg.keyword.state_collapsed)&lt;br /&gt;
					&lt;br /&gt;
					targs[list_and_num] =p._navbox({&lt;br /&gt;
						cfg.keyword.border_child,&lt;br /&gt;
						[cfg.arg.navbar] = cfg.keyword.navbar_plain,&lt;br /&gt;
						[cfg.arg.state] = state,&lt;br /&gt;
						[cfg.arg.basestyle] = pargs[cfg.arg.basestyle],&lt;br /&gt;
						[cfg.arg.title] = title,&lt;br /&gt;
						[cfg.arg.titlestyle] = titlestyle,&lt;br /&gt;
						[andnum(&#039;list&#039;, 1)] = list,&lt;br /&gt;
						[cfg.arg.liststyle] = liststyle,&lt;br /&gt;
						[cfg.arg.listclass] = pargs[andnum(&#039;listclass&#039;, n)],&lt;br /&gt;
						[cfg.arg.image] = pargs[andnum(&#039;image&#039;, n)],&lt;br /&gt;
						[cfg.arg.imageleft] = pargs[andnum(&#039;imageleft&#039;, n)],&lt;br /&gt;
						[cfg.arg.listpadding] = pargs[cfg.arg.listpadding],&lt;br /&gt;
						argHash = pargs.argHash&lt;br /&gt;
					})&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- ordering of style and bodystyle&lt;br /&gt;
	targs[cfg.arg.style] = concatstyles({targs[cfg.arg.style] or &#039;&#039;, targs[cfg.arg.bodystyle] or &#039;&#039;})&lt;br /&gt;
	targs[cfg.arg.bodystyle] = nil&lt;br /&gt;
&lt;br /&gt;
	-- child or subgroup&lt;br /&gt;
	if targs[cfg.arg.border] == nil then targs[cfg.arg.border] = pargs[1] end&lt;br /&gt;
&lt;br /&gt;
	return p._navbox(targs)&lt;br /&gt;
end --p._withCollapsibleGroups&lt;br /&gt;
&lt;br /&gt;
function p._withColumns(pargs)&lt;br /&gt;
	-- table for args passed to navbox&lt;br /&gt;
	local targs = {}&lt;br /&gt;
&lt;br /&gt;
	-- tables of column numbers&lt;br /&gt;
	local colheadernums = {}&lt;br /&gt;
	local colnums = {}&lt;br /&gt;
	local colfooternums = {}&lt;br /&gt;
&lt;br /&gt;
	-- process args&lt;br /&gt;
	local passthroughLocal = {&lt;br /&gt;
		[cfg.arg.evenstyle]=true,&lt;br /&gt;
		[cfg.arg.groupstyle]=true,&lt;br /&gt;
		[cfg.arg.liststyle]=true,&lt;br /&gt;
		[cfg.arg.oddstyle]=true,&lt;br /&gt;
		[cfg.arg.state]=true,&lt;br /&gt;
	}&lt;br /&gt;
	for k,v in pairs(pargs) do&lt;br /&gt;
		if passthrough[k] or passthroughLocal[k] then&lt;br /&gt;
			targs[k] = v&lt;br /&gt;
		elseif type(k) == &#039;string&#039; then&lt;br /&gt;
			if k:match(cfg.pattern.listnum) then&lt;br /&gt;
				local n = k:match(cfg.pattern.listnum)&lt;br /&gt;
				targs[andnum(&#039;liststyle&#039;, n + 2)] = pargs[andnum(&#039;liststyle&#039;, n)]&lt;br /&gt;
				targs[andnum(&#039;group&#039;, n + 2)] = pargs[andnum(&#039;group&#039;, n)]&lt;br /&gt;
				targs[andnum(&#039;groupstyle&#039;, n + 2)] = pargs[andnum(&#039;groupstyle&#039;, n)]&lt;br /&gt;
				if v and inArray(cfg.keyword.subgroups, v) then&lt;br /&gt;
					targs[andnum(&#039;list&#039;, n + 2)] = getSubgroup(pargs, n, v)&lt;br /&gt;
				else&lt;br /&gt;
					targs[andnum(&#039;list&#039;, n + 2)] = v&lt;br /&gt;
				end&lt;br /&gt;
			elseif (k:match(cfg.pattern.colheadernum) and v ~= &#039;&#039;) then&lt;br /&gt;
				table.insert(colheadernums, tonumber(k:match(cfg.pattern.colheadernum)))&lt;br /&gt;
			elseif (k:match(cfg.pattern.colnum) and v ~= &#039;&#039;) then&lt;br /&gt;
				table.insert(colnums, tonumber(k:match(cfg.pattern.colnum)))&lt;br /&gt;
			elseif (k:match(cfg.pattern.colfooternum) and v ~= &#039;&#039;) then&lt;br /&gt;
				table.insert(colfooternums, tonumber(k:match(cfg.pattern.colfooternum)))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(colheadernums)&lt;br /&gt;
	table.sort(colnums)&lt;br /&gt;
	table.sort(colfooternums)&lt;br /&gt;
&lt;br /&gt;
	-- HTML table for list1&lt;br /&gt;
	local coltable = mw.html.create( &#039;table&#039; ):addClass(&#039;navbox-columns-table&#039;)&lt;br /&gt;
	local row, col&lt;br /&gt;
&lt;br /&gt;
	local tablestyle = ( (#colheadernums &amp;gt; 0) or (not isblank(pargs[cfg.arg.fullwidth])) )&lt;br /&gt;
		and &#039;width:100%&#039;&lt;br /&gt;
		or &#039;width:auto; margin-left:auto; margin-right:auto&#039;&lt;br /&gt;
&lt;br /&gt;
	coltable:cssText(concatstyles({&lt;br /&gt;
		&#039;border-spacing: 0px; text-align:left&#039;,&lt;br /&gt;
		tablestyle,&lt;br /&gt;
		pargs[cfg.arg.coltablestyle] or &#039;&#039;&lt;br /&gt;
	}))&lt;br /&gt;
&lt;br /&gt;
	--- Header row ---&lt;br /&gt;
	if (#colheadernums &amp;gt; 0) then&lt;br /&gt;
		row = coltable:tag(&#039;tr&#039;)&lt;br /&gt;
		for k, n in ipairs(colheadernums) do&lt;br /&gt;
			col = row:tag(&#039;th&#039;):addClass(&#039;navbox-abovebelow&#039;)&lt;br /&gt;
			col:cssText(concatstyles({&lt;br /&gt;
				(k &amp;gt; 1) and &#039;border-left:2px solid #fdfdfd&#039; or &#039;&#039;,&lt;br /&gt;
				&#039;font-weight:bold&#039;,&lt;br /&gt;
				pargs[cfg.arg.colheaderstyle] or &#039;&#039;,&lt;br /&gt;
				pargs[andnum(&#039;colheaderstyle&#039;, n)] or &#039;&#039;&lt;br /&gt;
			}))&lt;br /&gt;
			col:attr(&#039;colspan&#039;, tonumber(pargs[andnum(&#039;colheadercolspan&#039;, n)]))&lt;br /&gt;
			col:wikitext(pargs[andnum(&#039;colheader&#039;, n)])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--- Main columns ---&lt;br /&gt;
	row = coltable:tag(&#039;tr&#039;):css(&#039;vertical-align&#039;, &#039;top&#039;)&lt;br /&gt;
	for k, n in ipairs(colnums) do&lt;br /&gt;
		if k == 1 and isblank(pargs[andnum(&#039;colheader&#039;, 1)])&lt;br /&gt;
				and isblank(pargs[andnum(&#039;colfooter&#039;, 1)])&lt;br /&gt;
				and isblank(pargs[cfg.arg.fullwidth]) then&lt;br /&gt;
			local nopad = inArray(&lt;br /&gt;
				{&#039;off&#039;, &#039;0&#039;, &#039;0em&#039;, &#039;0px&#039;},&lt;br /&gt;
				mw.ustring.gsub(pargs[cfg.arg.padding] or &#039;&#039;, &#039;[;%%]&#039;, &#039;&#039;))&lt;br /&gt;
			if not nopad then&lt;br /&gt;
				row:tag(&#039;td&#039;):wikitext(&#039;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&#039;)&lt;br /&gt;
					:css(&#039;width&#039;, (pargs[cfg.arg.padding] or &#039;5em&#039;))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		col = row:tag(&#039;td&#039;):addClass(&#039;navbox-list&#039;)&lt;br /&gt;
		col:cssText(concatstyles({&lt;br /&gt;
			(k &amp;gt; 1) and &#039;border-left:2px solid #fdfdfd&#039; or &#039;&#039;,&lt;br /&gt;
			&#039;padding:0px&#039;,&lt;br /&gt;
			pargs[cfg.arg.colstyle] or &#039;&#039;,&lt;br /&gt;
			((n%2 == 0) and pargs[cfg.arg.evencolstyle] or pargs[cfg.arg.oddcolstyle]) or &#039;&#039;,&lt;br /&gt;
			pargs[andnum(&#039;colstyle&#039;, n)] or &#039;&#039;,&lt;br /&gt;
			&#039;width:&#039; .. (pargs[andnum(&#039;colwidth&#039;, n)] or pargs[cfg.arg.colwidth] or &#039;10em&#039;)&lt;br /&gt;
		}))&lt;br /&gt;
		local wt = pargs[andnum(&#039;col&#039;, n)]&lt;br /&gt;
		if wt and inArray(cfg.keyword.subgroups, wt) then&lt;br /&gt;
			wt = getSubgroup(pargs, n, wt, cfg.arg.col_and_num)&lt;br /&gt;
		end&lt;br /&gt;
		col:tag(&#039;div&#039;):newline():wikitext(wt):newline()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--- Footer row ---&lt;br /&gt;
	if (#colfooternums &amp;gt; 0) then&lt;br /&gt;
		row = coltable:tag(&#039;tr&#039;)&lt;br /&gt;
		for k, n in ipairs(colfooternums) do&lt;br /&gt;
			col = row:tag(&#039;td&#039;):addClass(&#039;navbox-abovebelow&#039;)&lt;br /&gt;
			col:cssText(concatstyles({&lt;br /&gt;
				(k &amp;gt; 1) and &#039;border-left:2px solid #fdfdfd&#039; or &#039;&#039;,&lt;br /&gt;
				&#039;font-weight:bold&#039;,&lt;br /&gt;
				pargs[cfg.arg.colfooterstyle] or &#039;&#039;,&lt;br /&gt;
				pargs[andnum(&#039;colfooterstyle&#039;, n)] or &#039;&#039;&lt;br /&gt;
			}))&lt;br /&gt;
			col:attr(&#039;colspan&#039;, tonumber(pargs[andnum(&#039;colfootercolspan&#039;, n)]))&lt;br /&gt;
			col:wikitext(pargs[andnum(&#039;colfooter&#039;, n)])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- assign table to list1&lt;br /&gt;
	targs[andnum(&#039;list&#039;, 1)] = tostring(coltable)&lt;br /&gt;
	if isblank(pargs[andnum(&#039;colheader&#039;, 1)]) &lt;br /&gt;
			and isblank(pargs[andnum(&#039;col&#039;, 1)])&lt;br /&gt;
			and isblank(pargs[andnum(&#039;colfooter&#039;, 1)]) then&lt;br /&gt;
		targs[andnum(&#039;list&#039;, 1)] = targs[andnum(&#039;list&#039;, 1)] ..&lt;br /&gt;
			cfg.category.without_first_col&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Other parameters&lt;br /&gt;
	targs[cfg.arg.border] = pargs[cfg.arg.border] or pargs[1]&lt;br /&gt;
	targs[cfg.arg.evenodd] = (not isblank(pargs[cfg.arg.evenodd])) and pargs[cfg.arg.evenodd] or nil&lt;br /&gt;
	targs[cfg.arg.list1padding] = &#039;0px&#039;&lt;br /&gt;
	targs[andnum(&#039;liststyle&#039;, 1)] = &#039;background:transparent;color:inherit;&#039;&lt;br /&gt;
	targs[cfg.arg.style] = concatstyles({pargs[cfg.arg.style], pargs[cfg.arg.bodystyle]})&lt;br /&gt;
	targs[cfg.arg.tracking] = &#039;no&#039;&lt;br /&gt;
	&lt;br /&gt;
	return p._navbox(targs)&lt;br /&gt;
end --p._withColumns&lt;br /&gt;
&lt;br /&gt;
-- Template entry points&lt;br /&gt;
function p.navbox (frame, boxtype)&lt;br /&gt;
	local function readArgs(args, prefix)&lt;br /&gt;
		local function readSubgroups(element, i)&lt;br /&gt;
			if inArray(cfg.keyword.subgroups, args[prefix .. andnum(element, i)]) then&lt;br /&gt;
				for _, v in ipairs(cfg.arg.subgroups_and_num) do&lt;br /&gt;
					readArgs(args, prefix .. string.format(v, i) .. &amp;quot;_&amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
				readArgs(args, prefix .. andnum(&#039;col&#039;, i) .. &amp;quot;_&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end	&lt;br /&gt;
		-- Read the arguments in the order they&#039;ll be output in, to make references&lt;br /&gt;
		-- number in the right order.&lt;br /&gt;
		local _&lt;br /&gt;
		_ = args[prefix .. cfg.arg.title]&lt;br /&gt;
		_ = args[prefix .. cfg.arg.above]&lt;br /&gt;
		-- Limit this to 20 as covering &#039;most&#039; cases (that&#039;s a SWAG) and because&lt;br /&gt;
		-- iterator approach won&#039;t work here&lt;br /&gt;
		local boxtype = args.type or cfg.keyword[boxtype]&lt;br /&gt;
		if boxtype == cfg.keyword.with_columns then&lt;br /&gt;
			for i = 1, 20 do&lt;br /&gt;
				_ = args[prefix .. andnum(&#039;colheader&#039;, i)]&lt;br /&gt;
			end		&lt;br /&gt;
			for i = 1, 20 do&lt;br /&gt;
				readSubgroups(&#039;col&#039;, i)&lt;br /&gt;
			end		&lt;br /&gt;
			for i = 1, 20 do&lt;br /&gt;
				_ = args[prefix .. andnum(&#039;colfooter&#039;, i)]&lt;br /&gt;
			end		&lt;br /&gt;
		end&lt;br /&gt;
		for i = 1, 20 do&lt;br /&gt;
			_ = args[prefix .. andnum(&#039;group&#039;, i)]&lt;br /&gt;
			readSubgroups(&#039;list&#039;, i)&lt;br /&gt;
		end&lt;br /&gt;
		_ = args[prefix .. cfg.arg.below]&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not getArgs then&lt;br /&gt;
		getArgs = require(&#039;Module:Arguments&#039;).getArgs&lt;br /&gt;
	end&lt;br /&gt;
	local args = getArgs(frame, {wrappers = {cfg.pattern[boxtype or &#039;navbox&#039;]}})&lt;br /&gt;
	readArgs(args, &amp;quot;&amp;quot;)&lt;br /&gt;
	args.argHash = nil -- we shouldn&#039;t accept argHash passed from a template&lt;br /&gt;
	args.type = args.type or cfg.keyword[boxtype]&lt;br /&gt;
	return p[&#039;_navbox&#039;](args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[cfg.keyword.with_collapsible_groups] = function (frame)&lt;br /&gt;
	return p.navbox(frame, &#039;with_collapsible_groups&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[cfg.keyword.with_columns] = function (frame)&lt;br /&gt;
	return p.navbox(frame, &#039;with_columns&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%A2%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0&amp;diff=539</id>
		<title>Таблица</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%A2%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0&amp;diff=539"/>
		<updated>2026-01-20T04:38:33Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Таблица&#039;&#039;&#039; (&amp;lt;code&amp;gt;Table&amp;lt;/code&amp;gt;) - область данных, которая используется для отображения информации в табличном формате в табличных отчётах. &lt;br /&gt;
&lt;br /&gt;
==Общие сведения==&lt;br /&gt;
*таблица состоит из столбцов и строк, в которых организованы данные; &lt;br /&gt;
*по умолчанию в таблице три столбца и три строки, всего девять ячеек, каждая из которых заполнена [[TextBox|текстовым полем]]; &lt;br /&gt;
*во время разработки вы можете добавлять или удалять столбцы, строки и группы в соответствии с вашими потребностями; &lt;br /&gt;
*в ячейки таблицы можно встраивать другие области данных ([[Текстовое_поле|текстовые поля]], [[Форматированный_текст|поля форматированного текста]], картинки и др.).&lt;br /&gt;
&lt;br /&gt;
==Создание таблицы==&lt;br /&gt;
*для добавления таблицы необходимо в левой части окна Дизайнера левой кнопкой мыши нажать на элемент &amp;lt;code&amp;gt;Table&amp;lt;/code&amp;gt; и, не отпуская, перенести его в желаемое место и отпустить кнопку мыши;&lt;br /&gt;
[[Файл:Table.png|center|thumb]]&lt;br /&gt;
*по умолчанию в таблице три столбца и три строки, всего девять ячеек, каждая из которых заполнена текстовым полем;&lt;br /&gt;
*по умолчанию в таблице три столбца и три строки, всего девять ячеек, каждая из которых заполнена текстовым полем;&lt;br /&gt;
[[Файл:Table2.png|center|thumb]]&lt;br /&gt;
*первая строка &amp;lt;code&amp;gt;Table Header&amp;lt;/code&amp;gt; является строкой заголовка, может располагаться только на первой странице или повторяться на всех;&lt;br /&gt;
*вторая строка &amp;lt;code&amp;gt;Table Details&amp;lt;/code&amp;gt; является строкой собственно данных;&lt;br /&gt;
*третья строка &amp;lt;code&amp;gt;Table Footer&amp;lt;/code&amp;gt; является результирующей (можно использовать для итоговых вычислений), также может располагаться только на первой странице или повторяться на всех;&lt;br /&gt;
*для скрытия результирующей строки в контекстном меню таблицы отжать значение &amp;lt;code&amp;gt;Table Footer&amp;lt;/code&amp;gt;; &lt;br /&gt;
[[Файл:Table3.png|center|thumb]]&lt;br /&gt;
*аналогичным образом можно регулировать отображение остальных разделов строк (&amp;lt;code&amp;gt;Table Header&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Table Details&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
==Изменение размера таблицы==&lt;br /&gt;
*для изменения размера таблицы необходимо левой кнопкой мыши перетащить узловую точку границы таблицы в желаемое место и отпустить кнопку мыши;&lt;br /&gt;
[[Файл:Table4.png|center|thumb]]&lt;br /&gt;
*также для изменения размера таблицы можно использовать окно свойств таблицы, пункт меню &amp;lt;code&amp;gt;Layout &amp;gt;&amp;gt; Size&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[Файл:Table5.png|center]]&lt;br /&gt;
&lt;br /&gt;
==Изменение высоты строк==&lt;br /&gt;
*для изменения высоты строк необходимо выбрать одну или несколько строк таблицы, перейти в окно свойств таблицы, пункт меню &amp;lt;code&amp;gt;Layout &amp;gt;&amp;gt; Height&amp;lt;/code&amp;gt; и ввести необходимые данные (например, 0,55).&lt;br /&gt;
[[Файл:Table6.png|center]]&lt;br /&gt;
&lt;br /&gt;
==Создание и удаление столбцов==&lt;br /&gt;
*для добавления столбцов в таблицу необходимо выбрать один из столбцов таблицы, нажать правую клавишу мыши и в контекстном меню выбрать добавление столбца справа &amp;lt;code&amp;gt;Insert Column to the Right&amp;lt;/code&amp;gt; или слева &amp;lt;code&amp;gt;Insert Column to the Left&amp;lt;/code&amp;gt; от выделенного столбца;&lt;br /&gt;
[[Файл:Table7.png|center|thumb]]&lt;br /&gt;
*для удаления столбцов в таблицу необходимо выбрать один или несколько столбцов, нажать правую клавишу мыши и в контекстном меню выбрать удаление столбца &amp;lt;code&amp;gt;Delete Columns&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Объединение и разделение ячеек==&lt;br /&gt;
*для объединения необходимо выделить объединяемые ячейки, вызвать правой кнопкой мышки контекстное меню, выбрать пункт &amp;lt;code&amp;gt;Merge Cells&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Table8.png|center]]&lt;br /&gt;
*для разделения необходимо выделить разделяемую ячейку, вызвать правой кнопкой мышки контекстное меню, выбрать пункт &amp;lt;code&amp;gt;Split Cells&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[Файл:Table9.png|center]]&lt;br /&gt;
&lt;br /&gt;
==Объединение соседних ячеек с одинаковыми значениями==&lt;br /&gt;
*левой кнопкой мыши выделить необходимую ячейку таблицы;&lt;br /&gt;
*в разделе свойств элемента &amp;lt;code&amp;gt;Layout &amp;gt;&amp;gt; AutoMergeMode&amp;lt;/code&amp;gt; нажать левой кнопкой мыши на стрелку;&lt;br /&gt;
[[Файл:Table11.png|center]]&lt;br /&gt;
*выбрать значение из списка: &amp;lt;code&amp;gt;Never&amp;lt;/code&amp;gt; (по умолчанию, никогда не объединяются),  &amp;lt;code&amp;gt;Always&amp;lt;/code&amp;gt; (всегда объединяются) и &amp;lt;code&amp;gt;Restricted&amp;lt;/code&amp;gt; (объединяются только в том случае, если соответствующие ячейки в предыдущих столбцах объединены аналогичным образом – &amp;lt;code&amp;gt;Always&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;Restricted&amp;lt;/code&amp;gt;).&lt;br /&gt;
[[Файл:Table10.png|center|thumb]]&lt;br /&gt;
&lt;br /&gt;
==Изменение свойств границ==&lt;br /&gt;
Для отображения всех границ таблицы:  &lt;br /&gt;
*выделить всю таблицу на основном поле конструктора или в дереве отчета &amp;lt;code&amp;gt;ReportSection1 &amp;gt;&amp;gt; Body &amp;gt;&amp;gt; Table1&amp;lt;/code&amp;gt;;&lt;br /&gt;
*перейти в окно свойств таблицы, в пункте меню &amp;lt;code&amp;gt;Appearance &amp;gt;&amp;gt; BorderStyle&amp;lt;/code&amp;gt;; &lt;br /&gt;
[[Файл:Table12.png|center]]&lt;br /&gt;
*в раскрывающемся списке выбрать значение &amp;lt;code&amp;gt;Solid&amp;lt;/code&amp;gt; или другое требуемое (по умолчанию при создании таблицы границы не отображаются – значение &amp;lt;code&amp;gt;None&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Также можно настроить отображение каждой границы ячейки отдельно. Для этого:&lt;br /&gt;
*выбрать одну или несколько ячеек; &lt;br /&gt;
*раскрыть пункт меню &amp;lt;code&amp;gt;Appearance &amp;gt;&amp;gt; BorderStyle&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Table13.png|center]]&lt;br /&gt;
*в раскрывающемся списке выбрать значение &amp;lt;code&amp;gt;Solid&amp;lt;/code&amp;gt; для любой из четырех границ (в данном случае значение &amp;lt;code&amp;gt;Solid&amp;lt;/code&amp;gt; установлено для нижней границы).&lt;br /&gt;
&lt;br /&gt;
==Наименование и форматирование заголовков==&lt;br /&gt;
По умолчанию каждая ячейка таблицы является текстовым полем, соответственно форматирование содержимого такое же:&lt;br /&gt;
[[Файл:Table14.png|center]]&lt;br /&gt;
Для шрифта вносятся изменения в следующие свойства:&lt;br /&gt;
*стиль &amp;lt;code&amp;gt;Appearance &amp;gt;&amp;gt; Font &amp;gt;&amp;gt; FontStyle&amp;lt;/code&amp;gt; – нормальный &amp;lt;code&amp;gt;Normal&amp;lt;/code&amp;gt; или курсив &amp;lt;code&amp;gt;Italic&amp;lt;/code&amp;gt;; &lt;br /&gt;
*название &amp;lt;code&amp;gt;Appearance &amp;gt;&amp;gt; Font &amp;gt;&amp;gt; FontFamily&amp;lt;/code&amp;gt;;&lt;br /&gt;
*размер &amp;lt;code&amp;gt;Appearance &amp;gt;&amp;gt; Font &amp;gt;&amp;gt; FontSize&amp;lt;/code&amp;gt;;&lt;br /&gt;
*толщина &amp;lt;code&amp;gt;Appearance &amp;gt;&amp;gt; Font &amp;gt;&amp;gt; FontWeight&amp;lt;/code&amp;gt; – нормальный &amp;lt;code&amp;gt;Normal&amp;lt;/code&amp;gt;, жирный &amp;lt;code&amp;gt;Bold&amp;lt;/code&amp;gt; и другие. &lt;br /&gt;
Выравнивание текста:&lt;br /&gt;
*по горизонтали &amp;lt;code&amp;gt;Appearance &amp;gt;&amp;gt; Font &amp;gt;&amp;gt; TextAlign&amp;lt;/code&amp;gt;; &lt;br /&gt;
*выравнивание текста по вертикали &amp;lt;code&amp;gt;Appearance &amp;gt;&amp;gt; Font &amp;gt;&amp;gt; VerticalAlign&amp;lt;/code&amp;gt;. &lt;br /&gt;
Изменение имени текстового поля:&lt;br /&gt;
*&amp;lt;code&amp;gt;Data &amp;gt;&amp;gt; DataElementName&amp;lt;/code&amp;gt;;&lt;br /&gt;
*&amp;lt;code&amp;gt;Design &amp;gt;&amp;gt; Name&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Определение нумерации строк==&lt;br /&gt;
*на ячейке данных, в которой будут выводиться номера строк (в данном случае – первый столбец, первая строка после заголовка) правой кнопкой вызвать контекстное меню;&lt;br /&gt;
*выбрать пункт &amp;lt;code&amp;gt;Expression…&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Table15.png|center]]&lt;br /&gt;
*в появившемся окне &amp;lt;code&amp;gt;Expression Editor&amp;lt;/code&amp;gt; в поле &amp;lt;code&amp;gt;Expression:&amp;lt;/code&amp;gt; ввести с клавиатуры &amp;lt;code&amp;gt;=RowNumber()&amp;lt;/code&amp;gt; или выбрать (двойной клик) данную функцию из меню &amp;lt;code&amp;gt;Fields: &amp;gt;&amp;gt; Common Functions &amp;gt;&amp;gt; Miscellaneous &amp;gt;&amp;gt; RowNumber&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Table16.png|center|thumb]]&lt;br /&gt;
*в дальнейшем, при необходимости, можно создать фильтр &amp;lt;code&amp;gt;ReportParametrNumberFirstString&amp;lt;/code&amp;gt; для ввода начального значения первой строки пользователем; в таком случае выражение будет иметь вид &amp;lt;code&amp;gt;=RowNumber() + Parameters!ReportParametrNumberFirstString.Value – 1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Добавление данных БД в ячейки из DataSet==&lt;br /&gt;
*для ввода простого значения из подключенного [[Набор_данных|набора данных &amp;lt;code&amp;gt;DataSet&amp;lt;/code&amp;gt;]] необходимо выбрать желаемую конечную ячейку таблицы;&lt;br /&gt;
*в правой верхней части ячейки левой кнопкой мыши нажать на три горизонтальных синих черточки;&lt;br /&gt;
[[Файл:Table17.png|center]]&lt;br /&gt;
*в появившемся списке всех доступных в &amp;lt;code&amp;gt;DataSet&amp;lt;/code&amp;gt; полей выбрать необходимое поле;&lt;br /&gt;
*при этом значение поля в &amp;lt;code&amp;gt;DataSet&amp;lt;/code&amp;gt; имеет ряд синонимов&lt;br /&gt;
**в списке название фигурирует как &amp;lt;code&amp;gt;fio&amp;lt;/code&amp;gt;;&lt;br /&gt;
**в ячейке после выбора будет отображаться в сокращенном формате как &amp;lt;code&amp;gt;=[fio]&amp;lt;/code&amp;gt;;&lt;br /&gt;
**в окне &amp;lt;code&amp;gt;Expression Editor&amp;lt;/code&amp;gt; будет отображаться в полном формате как &amp;lt;code&amp;gt;=Fields!fio.Value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Группировка данных таблицы==&lt;br /&gt;
===Создание группировки таблицы===&lt;br /&gt;
*выделить таблицу на основном поле конструктора или в дереве;&lt;br /&gt;
*нажать на кнопку диалогового окна свойств &amp;lt;code&amp;gt;Property dialog…&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Table19.png|center|thumb]]&lt;br /&gt;
*в открывшемся окне в левом столбце перейти на вкладку &amp;lt;code&amp;gt;Table - Groups&amp;lt;/code&amp;gt; и нажать на кнопку &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Table20.png|center|thumb]]&lt;br /&gt;
*в результате появится группа &amp;lt;code&amp;gt;MainTable_Group1&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Table21.png|center|thumb]]&lt;br /&gt;
*в области &amp;lt;code&amp;gt;Group on:&amp;lt;/code&amp;gt; нажать на стрелку поля &amp;lt;code&amp;gt;Expression&amp;lt;/code&amp;gt; и в раскрывшемся списке выбрать поле из &amp;lt;code&amp;gt;DataSet&amp;lt;/code&amp;gt;, по которому будет проводиться группировка;&lt;br /&gt;
*в результате на основном поле конструктора выше и ниже основной строки с данными появятся строки добавленной группировки.&lt;br /&gt;
[[Файл:Table22.png|center|thumb]]&lt;br /&gt;
&lt;br /&gt;
===Удаление результирующей строки группировки===&lt;br /&gt;
*выделить таблицу на основном поле конструктора или в дереве;&lt;br /&gt;
*нажать на кнопку диалогового окна свойств &amp;lt;code&amp;gt;Property dialog…&amp;lt;/code&amp;gt; (рис. 4.19);&lt;br /&gt;
[[Файл:Table19.png|center|thumb]]&lt;br /&gt;
*в открывшемся окне в левом столбце перейти на вкладку &amp;lt;code&amp;gt;Table - Groups&amp;lt;/code&amp;gt;;&lt;br /&gt;
*в правом разделе окна перейти на вкладку &amp;lt;code&amp;gt;Layout&amp;lt;/code&amp;gt; (рис. 4.23);&lt;br /&gt;
[[Файл:Table23.png|center|thumb]]&lt;br /&gt;
*убрать галочку из поля &amp;lt;code&amp;gt;Include group footer&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Нумерация==&lt;br /&gt;
===Сквозная нумерация строк===&lt;br /&gt;
*левой кнопкой мыши выделить ячейку таблицы (обычно крайнюю левую);&lt;br /&gt;
*правой кнопкой мыши вызвать контекстное меню&lt;br /&gt;
*выбрать пункт &amp;lt;code&amp;gt;Expression…&amp;lt;/code&amp;gt;;&lt;br /&gt;
*в появившемся окне &amp;lt;code&amp;gt;Expression Editor&amp;lt;/code&amp;gt; в левой части окна в области &amp;lt;code&amp;gt;Fields:&amp;lt;/code&amp;gt; выбрать пункт &amp;lt;code&amp;gt;Common Function &amp;gt;&amp;gt; Miscellaneous &amp;gt;&amp;gt; RowNumber&amp;lt;/code&amp;gt; и двойным кликом или кнопкой &amp;lt;code&amp;gt;Append&amp;lt;/code&amp;gt; добавить пункт &amp;lt;code&amp;gt;RowNumber&amp;lt;/code&amp;gt; в область &amp;lt;code&amp;gt;Expression:&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Table24.png|center|thumb]]&lt;br /&gt;
*также можно с клавиатуры в поле &amp;lt;code&amp;gt;Expression:&amp;lt;/code&amp;gt; ввести &amp;lt;code&amp;gt;=RowNumber()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Сквозная нумерация строк со значения, заданного пользователем===&lt;br /&gt;
*создать [[простой фильтр]] &amp;lt;code&amp;gt;ReportParametrNumberFirstString&amp;lt;/code&amp;gt;;&lt;br /&gt;
*задать имя фильтра, тип данных &amp;lt;code&amp;gt;Integer&amp;lt;/code&amp;gt; и текст-приглашение для ввода данных на вкладке &amp;lt;code&amp;gt;Report – Parameters &amp;gt;&amp;gt; General&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Table25.png|center|thumb]]&lt;br /&gt;
*задать значение по умолчанию &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, тип данных &amp;lt;code&amp;gt;Integer&amp;lt;/code&amp;gt; и текст-приглашение для ввода данных на вкладке &amp;lt;code&amp;gt;Report – Parameters &amp;gt;&amp;gt; DefaultValues&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Table26.png|center|thumb]]&lt;br /&gt;
*левой кнопкой мыши выбрать ячейку таблицы (обычно крайнюю левую);&lt;br /&gt;
*правой кнопкой мыши вызвать контекстное меню;&lt;br /&gt;
*выбрать пункт &amp;lt;code&amp;gt;Expression…&amp;lt;/code&amp;gt;;&lt;br /&gt;
*в поле &amp;lt;code&amp;gt;Expression:&amp;lt;/code&amp;gt; ввести с клавиатуры &amp;lt;code&amp;gt;=RowNumber() + Parameters!ReportParametrNumberFirstString.Value - 1&amp;lt;/code&amp;gt; или выбрать соответствующие элементы в поле &amp;lt;code&amp;gt;Fields:&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Table27.png|center|thumb]]&lt;br /&gt;
*в результате получится простой фильтр.&lt;br /&gt;
[[Файл:Table28.png|center]]&lt;br /&gt;
&lt;br /&gt;
===Нумерация групп и строк внутри групп===&lt;br /&gt;
*для нумерации групп и строк групп необходимо дважды провести [[группировку таблицы]];&lt;br /&gt;
[[Файл:Table29.png|center|thumb]]&lt;br /&gt;
*создать группу верхнего уровня &amp;lt;code&amp;gt;Type_Group&amp;lt;/code&amp;gt; («Тип объекта анализа») на основании поля &amp;lt;code&amp;gt;type_name&amp;lt;/code&amp;gt; из текущего набора данных;&lt;br /&gt;
[[Файл:Table30.png|center|thumb]] &lt;br /&gt;
*левой кнопкой мыши выбрать ячейку таблицы (обычно крайнюю левую);&lt;br /&gt;
*правой кнопкой мыши вызвать контекстное меню;&lt;br /&gt;
*выбрать пункт &amp;lt;code&amp;gt;Expression…&amp;lt;/code&amp;gt;;&lt;br /&gt;
*в поле &amp;lt;code&amp;gt;Expression:&amp;lt;/code&amp;gt; ввести с клавиатуры (или выбрать в поле &amp;lt;code&amp;gt;Fields:&amp;lt;/code&amp;gt;) &amp;lt;code&amp;gt;=GroupIndex(&amp;quot;Type_Group&amp;quot;) + 1 &amp;amp; &amp;quot;. &amp;quot; &amp;amp; Fields.type_name.Value&amp;lt;/code&amp;gt;;&lt;br /&gt;
*создается группа второго уровня &amp;lt;code&amp;gt;AO_Group&amp;lt;/code&amp;gt; («Объект анализа») на основании поля &amp;lt;code&amp;gt;ao_name&amp;lt;/code&amp;gt; из текущего набора данных; &lt;br /&gt;
[[Файл:Table31.png|center|thumb]]&lt;br /&gt;
*левой кнопкой мыши выбрать ячейку таблицы (обычно крайнюю левую);&lt;br /&gt;
*правой кнопкой мыши вызвать контекстное меню;&lt;br /&gt;
*выбрать пункт &amp;lt;code&amp;gt;Expression…&amp;lt;/code&amp;gt;;&lt;br /&gt;
*в поле &amp;lt;code&amp;gt;Expression:&amp;lt;/code&amp;gt; ввести с клавиатуры (или выбрать в поле &amp;lt;code&amp;gt;Fields:&amp;lt;/code&amp;gt;) &amp;lt;code&amp;gt;=GroupIndex(&amp;quot;Type_Group&amp;quot;) + 1 &amp;amp; &amp;quot;.&amp;quot; &amp;amp; GroupIndex(&amp;quot;AO_Group&amp;quot;) + 1 &amp;amp; &amp;quot;. &amp;quot; &amp;amp; Fields!ao_name.Value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Блок документов ВебЛИМС «Тритея»}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Внутренняя документация]]&lt;br /&gt;
[[Category:Тритея]]&lt;br /&gt;
[[Category:Дизайнер_документов]]&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%91%D0%BB%D0%BE%D0%BA_%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%92%D0%B5%D0%B1%D0%9B%D0%98%D0%9C%D0%A1_%C2%AB%D0%A2%D1%80%D0%B8%D1%82%D0%B5%D1%8F%C2%BB&amp;diff=538</id>
		<title>Шаблон:Блок документов ВебЛИМС «Тритея»</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%91%D0%BB%D0%BE%D0%BA_%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%92%D0%B5%D0%B1%D0%9B%D0%98%D0%9C%D0%A1_%C2%AB%D0%A2%D1%80%D0%B8%D1%82%D0%B5%D1%8F%C2%BB&amp;diff=538"/>
		<updated>2026-01-20T04:38:23Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Navbox&lt;br /&gt;
|name = Блок документов&lt;br /&gt;
|state = collapsed&lt;br /&gt;
|title = Блок документов&lt;br /&gt;
|bodyclass = hlist&lt;br /&gt;
&lt;br /&gt;
|group1 = Дизайнер документов&lt;br /&gt;
&lt;br /&gt;
|list1 = child&lt;br /&gt;
| 1_group1 = Контролы&lt;br /&gt;
| 1_list1 = &lt;br /&gt;
* [[Текстовое поле|Текстовое поле]]&lt;br /&gt;
* [[Форматированный текст|Форматированный текст]]&lt;br /&gt;
* [[Таблица|Таблица]]&lt;br /&gt;
* [[Табликс|Табликс]]&lt;br /&gt;
&lt;br /&gt;
| 1_group2 = Стандартные формы&lt;br /&gt;
| 1_list2 = {{Navbox|subgroup&lt;br /&gt;
| group1 = Персонал (картотека)&lt;br /&gt;
| list1 =&lt;br /&gt;
* [[Сведения о работниках лаборатории|Сведения о работниках лаборатории]]&lt;br /&gt;
* [[Общая информация о сотрудниках|Общая информация о сотрудниках]]&lt;br /&gt;
* [[Карточка персонального учета сотрудника|Карточка персонального учета сотрудника]]&lt;br /&gt;
* [[Информация об уволенных сотрудниках|Информация об уволенных сотрудниках]]&lt;br /&gt;
| group2 = Объекты анализа&lt;br /&gt;
| list2 = &lt;br /&gt;
* [[Информация по спискам показателей объектов и нормативов|Информация по спискам показателей объектов и нормативов]]&lt;br /&gt;
* [[Информация о нормах показателей|Информация о нормах показателей]]&lt;br /&gt;
| group3 = Методики анализа&lt;br /&gt;
| list3 = &lt;br /&gt;
* [[Приложение к аттестату аккредитации|Приложение к аттестату аккредитации]]&lt;br /&gt;
* [[Общая информация о методиках анализа|Общая информация о методиках анализа]]&lt;br /&gt;
* [[Полная информация о методике анализа|Полная информация о методике анализа]]&lt;br /&gt;
* [[Информация об использовании методик анализа в ЛЖ|Информация об использовании методик анализа в ЛЖ]]&lt;br /&gt;
| group4 = Формулы&lt;br /&gt;
| list4 = &lt;br /&gt;
* [[Полная информация по методам анализа (формулы)|Полная информация по методам анализа (формулы)]]&lt;br /&gt;
| group5 = Структура предприятия (лаборатории)&lt;br /&gt;
| list5 = &lt;br /&gt;
* [[Структура предприятия (всё дерево)|Структура предприятия (всё дерево)]]&lt;br /&gt;
* [[Карточка предприятия|Карточка предприятия]]&lt;br /&gt;
| group6 = Источники проб&lt;br /&gt;
| list6 = &lt;br /&gt;
* [[Структура источников (с выбором уровня)|Структура источников (с выбором уровня)]]&lt;br /&gt;
* [[Список мест выбранного типа|Список мест выбранного типа]]&lt;br /&gt;
* [[Информация о нормах в источниках проб|Информация о нормах в источниках проб]]&lt;br /&gt;
| group7 = Администрирование&lt;br /&gt;
| list7 = &lt;br /&gt;
* [[Информация о ролях и пользователях|Информация о ролях и пользователях]]&lt;br /&gt;
| group8 = Статистика&lt;br /&gt;
| list8 =&lt;br /&gt;
* [[Общая информация по БД|Общая информация по БД]]&lt;br /&gt;
* [[Расширенная статистика запусков|Расширенная статистика запусков]]&lt;br /&gt;
| group9 = Лабораторные журналы&lt;br /&gt;
| list9 = &lt;br /&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;
}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%91%D0%BB%D0%BE%D0%BA_%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%92%D0%B5%D0%B1%D0%9B%D0%98%D0%9C%D0%A1_%C2%AB%D0%A2%D1%80%D0%B8%D1%82%D0%B5%D1%8F%C2%BB&amp;diff=537</id>
		<title>Шаблон:Блок документов ВебЛИМС «Тритея»</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%91%D0%BB%D0%BE%D0%BA_%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%92%D0%B5%D0%B1%D0%9B%D0%98%D0%9C%D0%A1_%C2%AB%D0%A2%D1%80%D0%B8%D1%82%D0%B5%D1%8F%C2%BB&amp;diff=537"/>
		<updated>2026-01-20T04:30:34Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Navbox&lt;br /&gt;
|name = Блок документов&lt;br /&gt;
|state = autocollapse&lt;br /&gt;
|title = Блок документов&lt;br /&gt;
|bodyclass = hlist&lt;br /&gt;
&lt;br /&gt;
|group1 = Дизайнер документов&lt;br /&gt;
&lt;br /&gt;
|list1 = child&lt;br /&gt;
| 1_group1 = Контролы&lt;br /&gt;
| 1_list1 = &lt;br /&gt;
* [[Текстовое поле|Текстовое поле]]&lt;br /&gt;
* [[Форматированный текст|Форматированный текст]]&lt;br /&gt;
* [[Таблица|Таблица]]&lt;br /&gt;
* [[Табликс|Табликс]]&lt;br /&gt;
&lt;br /&gt;
| 1_group2 = Стандартные формы&lt;br /&gt;
| 1_list2 = {{Navbox|subgroup&lt;br /&gt;
| group1 = Персонал (картотека)&lt;br /&gt;
| list1 =&lt;br /&gt;
* [[Сведения о работниках лаборатории|Сведения о работниках лаборатории]]&lt;br /&gt;
* [[Общая информация о сотрудниках|Общая информация о сотрудниках]]&lt;br /&gt;
* [[Карточка персонального учета сотрудника|Карточка персонального учета сотрудника]]&lt;br /&gt;
* [[Информация об уволенных сотрудниках|Информация об уволенных сотрудниках]]&lt;br /&gt;
| group2 = Объекты анализа&lt;br /&gt;
| list2 = &lt;br /&gt;
* [[Информация по спискам показателей объектов и нормативов|Информация по спискам показателей объектов и нормативов]]&lt;br /&gt;
* [[Информация о нормах показателей|Информация о нормах показателей]]&lt;br /&gt;
| group3 = Методики анализа&lt;br /&gt;
| list3 = &lt;br /&gt;
* [[Приложение к аттестату аккредитации|Приложение к аттестату аккредитации]]&lt;br /&gt;
* [[Общая информация о методиках анализа|Общая информация о методиках анализа]]&lt;br /&gt;
* [[Полная информация о методике анализа|Полная информация о методике анализа]]&lt;br /&gt;
* [[Информация об использовании методик анализа в ЛЖ|Информация об использовании методик анализа в ЛЖ]]&lt;br /&gt;
| group4 = Формулы&lt;br /&gt;
| list4 = &lt;br /&gt;
* [[Полная информация по методам анализа (формулы)|Полная информация по методам анализа (формулы)]]&lt;br /&gt;
| group5 = Структура предприятия (лаборатории)&lt;br /&gt;
| list5 = &lt;br /&gt;
* [[Структура предприятия (всё дерево)|Структура предприятия (всё дерево)]]&lt;br /&gt;
* [[Карточка предприятия|Карточка предприятия]]&lt;br /&gt;
| group6 = Источники проб&lt;br /&gt;
| list6 = &lt;br /&gt;
* [[Структура источников (с выбором уровня)|Структура источников (с выбором уровня)]]&lt;br /&gt;
* [[Список мест выбранного типа|Список мест выбранного типа]]&lt;br /&gt;
* [[Информация о нормах в источниках проб|Информация о нормах в источниках проб]]&lt;br /&gt;
| group7 = Администрирование&lt;br /&gt;
| list7 = &lt;br /&gt;
* [[Информация о ролях и пользователях|Информация о ролях и пользователях]]&lt;br /&gt;
| group8 = Статистика&lt;br /&gt;
| list8 =&lt;br /&gt;
* [[Общая информация по БД|Общая информация по БД]]&lt;br /&gt;
* [[Расширенная статистика запусков|Расширенная статистика запусков]]&lt;br /&gt;
| group9 = Лабораторные журналы&lt;br /&gt;
| list9 = &lt;br /&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;
}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Navbar/styles.css&amp;diff=536</id>
		<title>Модуль:Navbar/styles.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Navbar/styles.css&amp;diff=536"/>
		<updated>2026-01-20T04:06:19Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Новая страница: «/* {{pp|small=yes}} */ .navbar { 	display: inline; 	font-size: 88%; 	font-weight: normal; }  .navbar-collapse { 	float: left; 	text-align: left; }  .navbar-boxtext { 	word-spacing: 0; }  .navbar ul { 	display: inline-block; 	white-space: nowrap; 	line-height: inherit; }  .navbar-brackets::before { 	margin-right: -0.125em; 	content: &amp;#039;[ &amp;#039;; }  .navbar-brackets::after { 	margin-left: -0.125em; 	content: &amp;#039; ]&amp;#039;; }  .navbar li { 	word-spacing: -0.125em; }  .navbar a...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* {{pp|small=yes}} */&lt;br /&gt;
.navbar {&lt;br /&gt;
	display: inline;&lt;br /&gt;
	font-size: 88%;&lt;br /&gt;
	font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar-collapse {&lt;br /&gt;
	float: left;&lt;br /&gt;
	text-align: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar-boxtext {&lt;br /&gt;
	word-spacing: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar ul {&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	white-space: nowrap;&lt;br /&gt;
	line-height: inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar-brackets::before {&lt;br /&gt;
	margin-right: -0.125em;&lt;br /&gt;
	content: &#039;[ &#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar-brackets::after {&lt;br /&gt;
	margin-left: -0.125em;&lt;br /&gt;
	content: &#039; ]&#039;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar li {&lt;br /&gt;
	word-spacing: -0.125em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar a &amp;gt; span,&lt;br /&gt;
.navbar a &amp;gt; abbr {&lt;br /&gt;
	text-decoration: inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar-mini abbr {&lt;br /&gt;
	font-variant: small-caps;&lt;br /&gt;
	border-bottom: none;&lt;br /&gt;
	text-decoration: none;&lt;br /&gt;
	cursor: inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar-ct-full {&lt;br /&gt;
	font-size: 114%;&lt;br /&gt;
	margin: 0 7em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbar-ct-mini {&lt;br /&gt;
	font-size: 114%;&lt;br /&gt;
	margin: 0 4em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* not the usual @media screen, we simply remove navbar in @media print */&lt;br /&gt;
html.skin-theme-clientpref-night .navbar li a abbr {&lt;br /&gt;
	color: var(--color-base) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (prefers-color-scheme: dark) {&lt;br /&gt;
	html.skin-theme-clientpref-os .navbar li a abbr {&lt;br /&gt;
		color: var(--color-base) !important;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media print {&lt;br /&gt;
	.navbar {&lt;br /&gt;
		display: none !important;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Navbar/configuration&amp;diff=535</id>
		<title>Модуль:Navbar/configuration</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Navbar/configuration&amp;diff=535"/>
		<updated>2026-01-20T04:05:13Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Новая страница: «return { 	[&amp;#039;templatestyles&amp;#039;] = &amp;#039;Module:Navbar/styles.css&amp;#039;, 	[&amp;#039;hlist_templatestyles&amp;#039;] = &amp;#039;Hlist/styles.css&amp;#039;, 	[&amp;#039;box_text&amp;#039;] = &amp;#039;This box: &amp;#039;,			-- default text box when not plain or mini 	[&amp;#039;title_namespace&amp;#039;] = &amp;#039;Template&amp;#039;,		-- namespace to default to for title 	[&amp;#039;invalid_title&amp;#039;] = &amp;#039;Invalid title &amp;#039;, 	[&amp;#039;classes&amp;#039;] = { -- set a line to nil if you don&amp;#039;t want it 		[&amp;#039;navbar&amp;#039;] = &amp;#039;navbar&amp;#039;, 		[&amp;#039;plainlinks&amp;#039;] = &amp;#039;plainlinks&amp;#039;, -- plainlinks 		[&amp;#039;horizontal_list&amp;#039;] = &amp;#039;hlist&amp;#039;, -- h...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;return {&lt;br /&gt;
	[&#039;templatestyles&#039;] = &#039;Module:Navbar/styles.css&#039;,&lt;br /&gt;
	[&#039;hlist_templatestyles&#039;] = &#039;Hlist/styles.css&#039;,&lt;br /&gt;
	[&#039;box_text&#039;] = &#039;This box: &#039;,			-- default text box when not plain or mini&lt;br /&gt;
	[&#039;title_namespace&#039;] = &#039;Template&#039;,		-- namespace to default to for title&lt;br /&gt;
	[&#039;invalid_title&#039;] = &#039;Invalid title &#039;,&lt;br /&gt;
	[&#039;classes&#039;] = { -- set a line to nil if you don&#039;t want it&lt;br /&gt;
		[&#039;navbar&#039;] = &#039;navbar&#039;,&lt;br /&gt;
		[&#039;plainlinks&#039;] = &#039;plainlinks&#039;, -- plainlinks&lt;br /&gt;
		[&#039;horizontal_list&#039;] = &#039;hlist&#039;, -- horizontal list class&lt;br /&gt;
		[&#039;mini&#039;] = &#039;navbar-mini&#039;, -- class indicating small links in the navbar&lt;br /&gt;
		[&#039;this_box&#039;] = &#039;navbar-boxtext&#039;,&lt;br /&gt;
		[&#039;brackets&#039;] = &#039;navbar-brackets&#039;,&lt;br /&gt;
		-- &#039;collapsible&#039; is the key for a class to indicate the navbar is&lt;br /&gt;
		-- setting up the collapsible element in addition to the normal&lt;br /&gt;
		-- navbar.&lt;br /&gt;
		[&#039;collapsible&#039;] = &#039;navbar-collapse&#039;,&lt;br /&gt;
		[&#039;collapsible_title_mini&#039;] = &#039;navbar-ct-mini&#039;,&lt;br /&gt;
		[&#039;collapsible_title_full&#039;] = &#039;navbar-ct-full&#039;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Navbar&amp;diff=534</id>
		<title>Модуль:Navbar</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Navbar&amp;diff=534"/>
		<updated>2026-01-20T04:04:41Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Новая страница: «local p = {} local cfg = mw.loadData(&amp;#039;Module:Navbar/configuration&amp;#039;)  local function get_title_arg(is_collapsible, template) 	local title_arg = 1 	if is_collapsible then title_arg = 2 end 	if template then title_arg = &amp;#039;template&amp;#039; end 	return title_arg end  local function choose_links(template, args) 	-- The show table indicates the default displayed items. 	-- view, talk, edit, hist, move, watch 	-- TODO: Move to configuration. 	local show = {true, true, true,...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
local cfg = mw.loadData(&#039;Module:Navbar/configuration&#039;)&lt;br /&gt;
&lt;br /&gt;
local function get_title_arg(is_collapsible, template)&lt;br /&gt;
	local title_arg = 1&lt;br /&gt;
	if is_collapsible then title_arg = 2 end&lt;br /&gt;
	if template then title_arg = &#039;template&#039; end&lt;br /&gt;
	return title_arg&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function choose_links(template, args)&lt;br /&gt;
	-- The show table indicates the default displayed items.&lt;br /&gt;
	-- view, talk, edit, hist, move, watch&lt;br /&gt;
	-- TODO: Move to configuration.&lt;br /&gt;
	local show = {true, true, true, false, false, false}&lt;br /&gt;
	if template then&lt;br /&gt;
		show[2] = false&lt;br /&gt;
		show[3] = false&lt;br /&gt;
		local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6,&lt;br /&gt;
			talk = 2, edit = 3, hist = 4, move = 5, watch = 6}&lt;br /&gt;
		-- TODO: Consider removing TableTools dependency.&lt;br /&gt;
		for _, v in ipairs(require (&#039;Module:TableTools&#039;).compressSparseArray(args)) do&lt;br /&gt;
			local num = index[v]&lt;br /&gt;
			if num then show[num] = true end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local remove_edit_link = args.noedit&lt;br /&gt;
	if remove_edit_link then show[3] = false end&lt;br /&gt;
	&lt;br /&gt;
	return show&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function add_link(link_description, ul, is_mini, font_style)&lt;br /&gt;
	local l&lt;br /&gt;
	if link_description.url then&lt;br /&gt;
		l = {&#039;[&#039;, &#039;&#039;, &#039;]&#039;}&lt;br /&gt;
	else&lt;br /&gt;
		l = {&#039;[[&#039;, &#039;|&#039;, &#039;]]&#039;}&lt;br /&gt;
	end&lt;br /&gt;
	ul:tag(&#039;li&#039;)&lt;br /&gt;
		:addClass(&#039;nv-&#039; .. link_description.full)&lt;br /&gt;
		:wikitext(l[1] .. link_description.link .. l[2])&lt;br /&gt;
		:tag(is_mini and &#039;abbr&#039; or &#039;span&#039;)&lt;br /&gt;
			:attr(&#039;title&#039;, link_description.html_title)&lt;br /&gt;
			:cssText(font_style)&lt;br /&gt;
			:wikitext(is_mini and link_description.mini or link_description.full)&lt;br /&gt;
			:done()&lt;br /&gt;
		:wikitext(l[3])&lt;br /&gt;
		:done()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function make_list(title_text, has_brackets, displayed_links, is_mini, font_style)&lt;br /&gt;
	&lt;br /&gt;
	local title = mw.title.new(mw.text.trim(title_text), cfg.title_namespace)&lt;br /&gt;
	if not title then&lt;br /&gt;
		error(cfg.invalid_title .. title_text)&lt;br /&gt;
	end&lt;br /&gt;
	local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or &#039;&#039;&lt;br /&gt;
	&lt;br /&gt;
	-- TODO: Get link_descriptions and show into the configuration module.&lt;br /&gt;
	-- link_descriptions should be easier...&lt;br /&gt;
	local link_descriptions = {&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;v&#039;, [&#039;full&#039;] = &#039;view&#039;, [&#039;html_title&#039;] = &#039;View this template&#039;,&lt;br /&gt;
			[&#039;link&#039;] = title.fullText, [&#039;url&#039;] = false },&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;t&#039;, [&#039;full&#039;] = &#039;talk&#039;, [&#039;html_title&#039;] = &#039;Discuss this template&#039;,&lt;br /&gt;
			[&#039;link&#039;] = talkpage, [&#039;url&#039;] = false },&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;e&#039;, [&#039;full&#039;] = &#039;edit&#039;, [&#039;html_title&#039;] = &#039;Edit this template&#039;,&lt;br /&gt;
			[&#039;link&#039;] = &#039;Special:EditPage/&#039; .. title.fullText, [&#039;url&#039;] = false },&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;h&#039;, [&#039;full&#039;] = &#039;hist&#039;, [&#039;html_title&#039;] = &#039;History of this template&#039;,&lt;br /&gt;
			[&#039;link&#039;] = &#039;Special:PageHistory/&#039; .. title.fullText, [&#039;url&#039;] = false },&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;m&#039;, [&#039;full&#039;] = &#039;move&#039;, [&#039;html_title&#039;] = &#039;Move this template&#039;,&lt;br /&gt;
			[&#039;link&#039;] = mw.title.new(&#039;Special:Movepage&#039;):fullUrl(&#039;target=&#039;..title.fullText), [&#039;url&#039;] = true },&lt;br /&gt;
		{ [&#039;mini&#039;] = &#039;w&#039;, [&#039;full&#039;] = &#039;watch&#039;, [&#039;html_title&#039;] = &#039;Watch this template&#039;, &lt;br /&gt;
			[&#039;link&#039;] = title:fullUrl(&#039;action=watch&#039;), [&#039;url&#039;] = true }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local ul = mw.html.create(&#039;ul&#039;)&lt;br /&gt;
	if has_brackets then&lt;br /&gt;
		ul:addClass(cfg.classes.brackets)&lt;br /&gt;
			:cssText(font_style)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for i, _ in ipairs(displayed_links) do&lt;br /&gt;
		if displayed_links[i] then add_link(link_descriptions[i], ul, is_mini, font_style) end&lt;br /&gt;
	end&lt;br /&gt;
	return ul:done()&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._navbar(args)&lt;br /&gt;
	&lt;br /&gt;
	-- TODO: We probably don&#039;t need both fontstyle and fontcolor...&lt;br /&gt;
	local font_style = args.fontstyle&lt;br /&gt;
	local font_color = args.fontcolor&lt;br /&gt;
	local is_collapsible = args.collapsible&lt;br /&gt;
	local is_mini = args.mini&lt;br /&gt;
	local is_plain = args.plain&lt;br /&gt;
	&lt;br /&gt;
	local collapsible_class = nil&lt;br /&gt;
	if is_collapsible then&lt;br /&gt;
		collapsible_class = cfg.classes.collapsible&lt;br /&gt;
		if not is_plain then is_mini = 1 end&lt;br /&gt;
		if font_color then&lt;br /&gt;
			font_style = (font_style or &#039;&#039;) .. &#039;; color: &#039; .. font_color .. &#039;;&#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local navbar_style = args.style&lt;br /&gt;
	local div = mw.html.create():tag(&#039;div&#039;)&lt;br /&gt;
	div&lt;br /&gt;
		:addClass(cfg.classes.navbar)&lt;br /&gt;
		:addClass(cfg.classes.plainlinks)&lt;br /&gt;
		:addClass(cfg.classes.horizontal_list)&lt;br /&gt;
		:addClass(collapsible_class) -- we made the determination earlier&lt;br /&gt;
		:cssText(navbar_style)&lt;br /&gt;
&lt;br /&gt;
	if is_mini then div:addClass(cfg.classes.mini) end&lt;br /&gt;
&lt;br /&gt;
	local box_text = (args.text or cfg.box_text) .. &#039; &#039;&lt;br /&gt;
	 -- the concatenated space guarantees the box text is separated&lt;br /&gt;
	if not (is_mini or is_plain) then&lt;br /&gt;
		div&lt;br /&gt;
			:tag(&#039;span&#039;)&lt;br /&gt;
				:addClass(cfg.classes.box_text)&lt;br /&gt;
				:cssText(font_style)&lt;br /&gt;
				:wikitext(box_text)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local template = args.template&lt;br /&gt;
	local displayed_links = choose_links(template, args)&lt;br /&gt;
	local has_brackets = args.brackets&lt;br /&gt;
	local title_arg = get_title_arg(is_collapsible, template)&lt;br /&gt;
	local title_text = args[title_arg] or (&#039;:&#039; .. mw.getCurrentFrame():getParent():getTitle())&lt;br /&gt;
	local list = make_list(title_text, has_brackets, displayed_links, is_mini, font_style)&lt;br /&gt;
	div:node(list)&lt;br /&gt;
&lt;br /&gt;
	if is_collapsible then&lt;br /&gt;
		local title_text_class&lt;br /&gt;
		if is_mini then&lt;br /&gt;
			title_text_class = cfg.classes.collapsible_title_mini&lt;br /&gt;
		else&lt;br /&gt;
			title_text_class = cfg.classes.collapsible_title_full&lt;br /&gt;
		end&lt;br /&gt;
		div:done()&lt;br /&gt;
			:tag(&#039;div&#039;)&lt;br /&gt;
			:addClass(title_text_class)&lt;br /&gt;
			:cssText(font_style)&lt;br /&gt;
			:wikitext(args[1])&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	-- hlist -&amp;gt; navbar is best-effort to preserve old Common.css ordering.&lt;br /&gt;
	return frame:extensionTag{&lt;br /&gt;
		name = &#039;templatestyles&#039;, args = { src = cfg.hlist_templatestyles }&lt;br /&gt;
	} .. frame:extensionTag{&lt;br /&gt;
		name = &#039;templatestyles&#039;, args = { src = cfg.templatestyles }&lt;br /&gt;
	} .. tostring(div:done())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.navbar(frame)&lt;br /&gt;
	return p._navbar(require(&#039;Module:Arguments&#039;).getArgs(frame))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:Navbox&amp;diff=533</id>
		<title>Шаблон:Navbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:Navbox&amp;diff=533"/>
		<updated>2026-01-20T04:04:01Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Новая страница: «&amp;lt;includeonly&amp;gt;{{#invoke:Navbox|navbox}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt; {{Documentation}} &amp;lt;/noinclude&amp;gt;»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{#invoke:Navbox|navbox}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:Hlist&amp;diff=530</id>
		<title>Шаблон:Hlist</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:Hlist&amp;diff=530"/>
		<updated>2026-01-20T03:51:09Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Новая страница: «{{&amp;lt;includeonly&amp;gt;safesubst:&amp;lt;/includeonly&amp;gt;#invoke:list|horizontal}}&amp;lt;noinclude&amp;gt; {{documentation}} &amp;lt;!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --&amp;gt; &amp;lt;/noinclude&amp;gt;»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{&amp;lt;includeonly&amp;gt;safesubst:&amp;lt;/includeonly&amp;gt;#invoke:list|horizontal}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:List&amp;diff=529</id>
		<title>Модуль:List</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:List&amp;diff=529"/>
		<updated>2026-01-20T03:50:57Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Новая страница: «local libUtil = require(&amp;#039;libraryUtil&amp;#039;) local checkType = libUtil.checkType local mTableTools = require(&amp;#039;Module:TableTools&amp;#039;)  local p = {}  local listTypes = { 	[&amp;#039;bulleted&amp;#039;] = true, 	[&amp;#039;unbulleted&amp;#039;] = true, 	[&amp;#039;horizontal&amp;#039;] = true, 	[&amp;#039;ordered&amp;#039;] = true, 	[&amp;#039;horizontal_ordered&amp;#039;] = true }  function p.makeListData(listType, args) 	-- Constructs a data table to be passed to p.renderList. 	local data = {}  	-- Classes and TemplateStyles 	data.classes = {} 	data.templa...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local libUtil = require(&#039;libraryUtil&#039;)&lt;br /&gt;
local checkType = libUtil.checkType&lt;br /&gt;
local mTableTools = require(&#039;Module:TableTools&#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local listTypes = {&lt;br /&gt;
	[&#039;bulleted&#039;] = true,&lt;br /&gt;
	[&#039;unbulleted&#039;] = true,&lt;br /&gt;
	[&#039;horizontal&#039;] = true,&lt;br /&gt;
	[&#039;ordered&#039;] = true,&lt;br /&gt;
	[&#039;horizontal_ordered&#039;] = true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.makeListData(listType, args)&lt;br /&gt;
	-- Constructs a data table to be passed to p.renderList.&lt;br /&gt;
	local data = {}&lt;br /&gt;
&lt;br /&gt;
	-- Classes and TemplateStyles&lt;br /&gt;
	data.classes = {}&lt;br /&gt;
	data.templatestyles = &#039;&#039;&lt;br /&gt;
	if listType == &#039;horizontal&#039; or listType == &#039;horizontal_ordered&#039; then&lt;br /&gt;
		table.insert(data.classes, &#039;hlist&#039;)&lt;br /&gt;
		data.templatestyles = mw.getCurrentFrame():extensionTag{&lt;br /&gt;
			name = &#039;templatestyles&#039;, args = { src = &#039;Hlist/styles.css&#039; }&lt;br /&gt;
		}&lt;br /&gt;
	elseif listType == &#039;unbulleted&#039; then&lt;br /&gt;
		table.insert(data.classes, &#039;plainlist&#039;)&lt;br /&gt;
		data.templatestyles = mw.getCurrentFrame():extensionTag{&lt;br /&gt;
			name = &#039;templatestyles&#039;, args = { src = &#039;Plainlist/styles.css&#039; }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(data.classes, args.class)&lt;br /&gt;
&lt;br /&gt;
	-- Main div style&lt;br /&gt;
	data.style = args.style&lt;br /&gt;
&lt;br /&gt;
	-- Indent for horizontal lists&lt;br /&gt;
	if listType == &#039;horizontal&#039; or listType == &#039;horizontal_ordered&#039; then&lt;br /&gt;
		local indent = tonumber(args.indent)&lt;br /&gt;
		indent = indent and indent * 1.6 or 0&lt;br /&gt;
		if indent &amp;gt; 0 then&lt;br /&gt;
			data.marginLeft = indent .. &#039;em&#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- List style types for ordered lists&lt;br /&gt;
	-- This could be &amp;quot;1, 2, 3&amp;quot;, &amp;quot;a, b, c&amp;quot;, or a number of others. The list style&lt;br /&gt;
	-- type is either set by the &amp;quot;type&amp;quot; attribute or the &amp;quot;list-style-type&amp;quot; CSS&lt;br /&gt;
	-- property.&lt;br /&gt;
	if listType == &#039;ordered&#039; or listType == &#039;horizontal_ordered&#039; then &lt;br /&gt;
		data.listStyleType = args.list_style_type or args[&#039;list-style-type&#039;]&lt;br /&gt;
		data.type = args[&#039;type&#039;]&lt;br /&gt;
&lt;br /&gt;
		-- Detect invalid type attributes and attempt to convert them to&lt;br /&gt;
		-- list-style-type CSS properties.&lt;br /&gt;
		if data.type &lt;br /&gt;
			and not data.listStyleType&lt;br /&gt;
			and not tostring(data.type):find(&#039;^%s*[1AaIi]%s*$&#039;)&lt;br /&gt;
		then&lt;br /&gt;
			data.listStyleType = data.type&lt;br /&gt;
			data.type = nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- List tag type&lt;br /&gt;
	if listType == &#039;ordered&#039; or listType == &#039;horizontal_ordered&#039; then&lt;br /&gt;
		data.listTag = &#039;ol&#039;&lt;br /&gt;
	else&lt;br /&gt;
		data.listTag = &#039;ul&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Start number for ordered lists&lt;br /&gt;
	data.start = args.start&lt;br /&gt;
	if listType == &#039;horizontal_ordered&#039; then&lt;br /&gt;
		-- Apply fix to get start numbers working with horizontal ordered lists.&lt;br /&gt;
		local startNum = tonumber(data.start)&lt;br /&gt;
		if startNum then&lt;br /&gt;
			data.counterReset = &#039;listitem &#039; .. tostring(startNum - 1)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- List style&lt;br /&gt;
	 -- ul_style and ol_style are included for backwards compatibility. No&lt;br /&gt;
	 -- distinction is made for ordered or unordered lists.&lt;br /&gt;
	data.listStyle = args.list_style&lt;br /&gt;
&lt;br /&gt;
	-- List items&lt;br /&gt;
	-- li_style is included for backwards compatibility. item_style was included&lt;br /&gt;
	-- to be easier to understand for non-coders.&lt;br /&gt;
	data.itemStyle = args.item_style or args.li_style&lt;br /&gt;
	data.items = {}&lt;br /&gt;
	for _, num in ipairs(mTableTools.numKeys(args)) do&lt;br /&gt;
		local item = {}&lt;br /&gt;
		item.content = args[num]&lt;br /&gt;
		item.style = args[&#039;item&#039; .. tostring(num) .. &#039;_style&#039;]&lt;br /&gt;
			or args[&#039;item_style&#039; .. tostring(num)]&lt;br /&gt;
		item.value = args[&#039;item&#039; .. tostring(num) .. &#039;_value&#039;]&lt;br /&gt;
			or args[&#039;item_value&#039; .. tostring(num)]&lt;br /&gt;
		table.insert(data.items, item)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return data&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.renderList(data)&lt;br /&gt;
	-- Renders the list HTML.&lt;br /&gt;
	&lt;br /&gt;
	-- Return the blank string if there are no list items.&lt;br /&gt;
	if type(data.items) ~= &#039;table&#039; or #data.items &amp;lt; 1 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Render the main div tag.&lt;br /&gt;
	local root = mw.html.create(&#039;div&#039;)&lt;br /&gt;
	for _, class in ipairs(data.classes or {}) do&lt;br /&gt;
		root:addClass(class)&lt;br /&gt;
	end&lt;br /&gt;
	root:css{[&#039;margin-left&#039;] = data.marginLeft}&lt;br /&gt;
	if data.style then&lt;br /&gt;
		root:cssText(data.style)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Render the list tag.&lt;br /&gt;
	local list = root:tag(data.listTag or &#039;ul&#039;)&lt;br /&gt;
	list&lt;br /&gt;
		:attr{start = data.start, type = data.type}&lt;br /&gt;
		:css{&lt;br /&gt;
			[&#039;counter-reset&#039;] = data.counterReset,&lt;br /&gt;
			[&#039;list-style-type&#039;] = data.listStyleType&lt;br /&gt;
		}&lt;br /&gt;
	if data.listStyle then&lt;br /&gt;
		list:cssText(data.listStyle)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Render the list items&lt;br /&gt;
	for _, t in ipairs(data.items or {}) do&lt;br /&gt;
		local item = list:tag(&#039;li&#039;)&lt;br /&gt;
		if data.itemStyle then&lt;br /&gt;
			item:cssText(data.itemStyle)&lt;br /&gt;
		end&lt;br /&gt;
		if t.style then&lt;br /&gt;
			item:cssText(t.style)&lt;br /&gt;
		end&lt;br /&gt;
		item&lt;br /&gt;
			:attr{value = t.value}&lt;br /&gt;
			:wikitext(t.content)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return data.templatestyles .. tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.renderTrackingCategories(args)&lt;br /&gt;
	local isDeprecated = false -- Tracks deprecated parameters.&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		k = tostring(k)&lt;br /&gt;
		if k:find(&#039;^item_style%d+$&#039;) or k:find(&#039;^item_value%d+$&#039;) then&lt;br /&gt;
			isDeprecated = true&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local ret = &#039;&#039;&lt;br /&gt;
	if isDeprecated then&lt;br /&gt;
		ret = ret .. &#039;[[Category:List templates with deprecated parameters]]&#039;&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeList(listType, args)&lt;br /&gt;
	if not listType or not listTypes[listType] then&lt;br /&gt;
		error(string.format(&lt;br /&gt;
			&amp;quot;bad argument #1 to &#039;makeList&#039; (&#039;%s&#039; is not a valid list type)&amp;quot;,&lt;br /&gt;
			tostring(listType)&lt;br /&gt;
		), 2)&lt;br /&gt;
	end&lt;br /&gt;
	checkType(&#039;makeList&#039;, 2, args, &#039;table&#039;)&lt;br /&gt;
	local data = p.makeListData(listType, args)&lt;br /&gt;
	local list = p.renderList(data)&lt;br /&gt;
	local trackingCategories = p.renderTrackingCategories(args)&lt;br /&gt;
	return list .. trackingCategories&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for listType in pairs(listTypes) do&lt;br /&gt;
	p[listType] = function (frame)&lt;br /&gt;
		local mArguments = require(&#039;Module:Arguments&#039;)&lt;br /&gt;
		local origArgs = mArguments.getArgs(frame, {&lt;br /&gt;
			frameOnly = ((frame and frame.args and frame.args.frameonly or &#039;&#039;) ~= &#039;&#039;),&lt;br /&gt;
			valueFunc = function (key, value)&lt;br /&gt;
			if not value or not mw.ustring.find(value, &#039;%S&#039;) then return nil end&lt;br /&gt;
			if mw.ustring.find(value, &#039;^%s*[%*#;:]&#039;) then&lt;br /&gt;
				return value&lt;br /&gt;
			else&lt;br /&gt;
				return value:match(&#039;^%s*(.-)%s*$&#039;)&lt;br /&gt;
			end&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
		})&lt;br /&gt;
		-- Copy all the arguments to a new table, for faster indexing.&lt;br /&gt;
		local args = {}&lt;br /&gt;
		for k, v in pairs(origArgs) do&lt;br /&gt;
			args[k] = v&lt;br /&gt;
		end&lt;br /&gt;
		return p.makeList(listType, args)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:Hlist/styles.css&amp;diff=528</id>
		<title>Шаблон:Hlist/styles.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:Hlist/styles.css&amp;diff=528"/>
		<updated>2026-01-20T03:50:09Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Новая страница: «/* {{pp-template}} */ /*   * hlist styles are defined in core and Minerva and differ in Minerva. The  * current definitions here (2023-01-01) are sufficient to override Minerva  * without use of the hlist-separated class. The most problematic styles were  * related to margin, padding, and the bullet. Check files listed at  * MediaWiki talk:Common.css/to do#hlist-separated  */ /*  * TODO: When the majority of readership supports it (or some beautiful worl...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* {{pp-template}} */&lt;br /&gt;
/* &lt;br /&gt;
 * hlist styles are defined in core and Minerva and differ in Minerva. The&lt;br /&gt;
 * current definitions here (2023-01-01) are sufficient to override Minerva&lt;br /&gt;
 * without use of the hlist-separated class. The most problematic styles were&lt;br /&gt;
 * related to margin, padding, and the bullet. Check files listed at&lt;br /&gt;
 * [[MediaWiki talk:Common.css/to do#hlist-separated]]&lt;br /&gt;
 */&lt;br /&gt;
/*&lt;br /&gt;
 * TODO: When the majority of readership supports it (or some beautiful world&lt;br /&gt;
 * in which grade C support is above the minimum threshold), use :is()&lt;br /&gt;
 */&lt;br /&gt;
.hlist dl,&lt;br /&gt;
.hlist ol,&lt;br /&gt;
.hlist ul {&lt;br /&gt;
	margin: 0;&lt;br /&gt;
	padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Display list items inline */&lt;br /&gt;
.hlist dd,&lt;br /&gt;
.hlist dt,&lt;br /&gt;
.hlist li {&lt;br /&gt;
	/*&lt;br /&gt;
	 * don&#039;t trust the note that says margin doesn&#039;t work with inline&lt;br /&gt;
	 * removing margin: 0 makes dds have margins again&lt;br /&gt;
	 * We also want to reset margin-right in Minerva&lt;br /&gt;
	 */&lt;br /&gt;
	margin: 0; &lt;br /&gt;
	display: inline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Display requested top-level lists inline */&lt;br /&gt;
.hlist.inline,&lt;br /&gt;
.hlist.inline dl,&lt;br /&gt;
.hlist.inline ol,&lt;br /&gt;
.hlist.inline ul,&lt;br /&gt;
/* Display nested lists inline */&lt;br /&gt;
.hlist dl dl,&lt;br /&gt;
.hlist dl ol,&lt;br /&gt;
.hlist dl ul,&lt;br /&gt;
.hlist ol dl,&lt;br /&gt;
.hlist ol ol,&lt;br /&gt;
.hlist ol ul,&lt;br /&gt;
.hlist ul dl,&lt;br /&gt;
.hlist ul ol,&lt;br /&gt;
.hlist ul ul {&lt;br /&gt;
	display: inline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Hide empty list items */&lt;br /&gt;
.hlist .mw-empty-li {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* TODO: :not() can maybe be used here to remove the later rule. naive test&lt;br /&gt;
 * seems to work. more testing needed. like so:&lt;br /&gt;
 *.hlist dt:not(:last-child)::after {&lt;br /&gt;
 *	content: &amp;quot;: &amp;quot;;&lt;br /&gt;
 *}&lt;br /&gt;
 *.hlist dd:not(:last-child)::after,&lt;br /&gt;
 *.hlist li:not(:last-child)::after {&lt;br /&gt;
 *	content: &amp;quot; · &amp;quot;;&lt;br /&gt;
 *	font-weight: bold;&lt;br /&gt;
 *}&lt;br /&gt;
 */&lt;br /&gt;
/* Generate interpuncts */&lt;br /&gt;
.hlist dt::after {&lt;br /&gt;
	content: &amp;quot;: &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist dd::after,&lt;br /&gt;
.hlist li::after {&lt;br /&gt;
	content: &amp;quot;\a0· &amp;quot;;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist dd:last-child::after,&lt;br /&gt;
.hlist dt:last-child::after,&lt;br /&gt;
.hlist li:last-child::after {&lt;br /&gt;
	content: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Add parentheses around nested lists */&lt;br /&gt;
.hlist dd dd:first-child::before,&lt;br /&gt;
.hlist dd dt:first-child::before,&lt;br /&gt;
.hlist dd li:first-child::before,&lt;br /&gt;
.hlist dt dd:first-child::before,&lt;br /&gt;
.hlist dt dt:first-child::before,&lt;br /&gt;
.hlist dt li:first-child::before,&lt;br /&gt;
.hlist li dd:first-child::before,&lt;br /&gt;
.hlist li dt:first-child::before,&lt;br /&gt;
.hlist li li:first-child::before {&lt;br /&gt;
	content: &amp;quot; (&amp;quot;;&lt;br /&gt;
	font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist dd dd:last-child::after,&lt;br /&gt;
.hlist dd dt:last-child::after,&lt;br /&gt;
.hlist dd li:last-child::after,&lt;br /&gt;
.hlist dt dd:last-child::after,&lt;br /&gt;
.hlist dt dt:last-child::after,&lt;br /&gt;
.hlist dt li:last-child::after,&lt;br /&gt;
.hlist li dd:last-child::after,&lt;br /&gt;
.hlist li dt:last-child::after,&lt;br /&gt;
.hlist li li:last-child::after {&lt;br /&gt;
	content: &amp;quot;)&amp;quot;;&lt;br /&gt;
	font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Put ordinals in front of ordered list items */&lt;br /&gt;
.hlist ol {&lt;br /&gt;
	counter-reset: listitem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist ol &amp;gt; li {&lt;br /&gt;
	counter-increment: listitem;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist ol &amp;gt; li::before {&lt;br /&gt;
	content: &amp;quot; &amp;quot; counter(listitem) &amp;quot;\a0&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.hlist dd ol &amp;gt; li:first-child::before,&lt;br /&gt;
.hlist dt ol &amp;gt; li:first-child::before,&lt;br /&gt;
.hlist li ol &amp;gt; li:first-child::before {&lt;br /&gt;
	content: &amp;quot; (&amp;quot; counter(listitem) &amp;quot;\a0&amp;quot;;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Navbox/styles.css&amp;diff=527</id>
		<title>Модуль:Navbox/styles.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Navbox/styles.css&amp;diff=527"/>
		<updated>2026-01-20T03:48:40Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Новая страница: «/* {{pp|small=y}} */ .navbox { 	box-sizing: border-box; 	border: 1px solid #a2a9b1; 	width: 100%; 	clear: both; 	font-size: 88%; 	text-align: center; 	padding: 1px; 	margin: 1em auto 0; /* Prevent preceding content from clinging to navboxes */ }  .navbox .navbox { 	margin-top: 0; /* No top margin for nested navboxes */ }  .navbox + .navbox, /* TODO: remove first line after transclusions have updated */ .navbox + .navbox-styles + .navbox { 	margin-top: -1px;...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* {{pp|small=y}} */&lt;br /&gt;
.navbox {&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
	border: 1px solid #a2a9b1;&lt;br /&gt;
	width: 100%;&lt;br /&gt;
	clear: both;&lt;br /&gt;
	font-size: 88%;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
	padding: 1px;&lt;br /&gt;
	margin: 1em auto 0; /* Prevent preceding content from clinging to navboxes */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox .navbox {&lt;br /&gt;
	margin-top: 0; /* No top margin for nested navboxes */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox + .navbox, /* TODO: remove first line after transclusions have updated */&lt;br /&gt;
.navbox + .navbox-styles + .navbox {&lt;br /&gt;
	margin-top: -1px; /* Single pixel border between adjacent navboxes */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-inner,&lt;br /&gt;
.navbox-subgroup {&lt;br /&gt;
	width: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-group,&lt;br /&gt;
.navbox-title,&lt;br /&gt;
.navbox-abovebelow {&lt;br /&gt;
	padding: 0.25em 1em;&lt;br /&gt;
	line-height: 1.5em;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-group {&lt;br /&gt;
	white-space: nowrap;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	text-align: right;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox,&lt;br /&gt;
.navbox-subgroup {&lt;br /&gt;
	background-color: #fdfdfd;&lt;br /&gt;
    color:inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-list {&lt;br /&gt;
	line-height: 1.5em;&lt;br /&gt;
	border-color: #fdfdfd; /* Must match background color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-list-with-group {&lt;br /&gt;
	text-align: left;&lt;br /&gt;
	border-left-width: 2px;&lt;br /&gt;
	border-left-style: solid;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* cell spacing for navbox cells */&lt;br /&gt;
/* Borders above 2nd, 3rd, etc. rows */&lt;br /&gt;
/* TODO: figure out how to replace tr as structure;&lt;br /&gt;
 * with div structure it should be just a matter of first-child */&lt;br /&gt;
tr + tr &amp;gt; .navbox-abovebelow,&lt;br /&gt;
tr + tr &amp;gt; .navbox-group,&lt;br /&gt;
tr + tr &amp;gt; .navbox-image,&lt;br /&gt;
tr + tr &amp;gt; .navbox-list {&lt;br /&gt;
	border-top: 2px solid #fdfdfd; /* Must match background color */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-title {&lt;br /&gt;
	background-color: #ccf; /* Level 1 color */&lt;br /&gt;
    color:inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-abovebelow,&lt;br /&gt;
.navbox-group,&lt;br /&gt;
.navbox-subgroup .navbox-title {&lt;br /&gt;
	background-color: #ddf; /* Level 2 color */&lt;br /&gt;
    color:inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-subgroup .navbox-group,&lt;br /&gt;
.navbox-subgroup .navbox-abovebelow {&lt;br /&gt;
	background-color: #e6e6ff; /* Level 3 color */&lt;br /&gt;
    color:inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-even {&lt;br /&gt;
	background-color: #f7f7f7;&lt;br /&gt;
    color:inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-odd {&lt;br /&gt;
	background-color: transparent;&lt;br /&gt;
    color:inherit;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* TODO: figure out how to remove reliance on td as structure */&lt;br /&gt;
.navbox .hlist td dl,&lt;br /&gt;
.navbox .hlist td ol,&lt;br /&gt;
.navbox .hlist td ul,&lt;br /&gt;
.navbox td.hlist dl,&lt;br /&gt;
.navbox td.hlist ol,&lt;br /&gt;
.navbox td.hlist ul {&lt;br /&gt;
	padding: 0.125em 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox .navbar {&lt;br /&gt;
	display: block;&lt;br /&gt;
	font-size: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.navbox-title .navbar {&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	float: left;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	text-align: left;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	margin-right: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/** T367463 */&lt;br /&gt;
body.skin--responsive .navbox-image img {&lt;br /&gt;
	max-width: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media print {&lt;br /&gt;
	body.ns-0 .navbox {&lt;br /&gt;
		display: none !important;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Yesno&amp;diff=525</id>
		<title>Модуль:Yesno</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Yesno&amp;diff=525"/>
		<updated>2026-01-20T03:43:58Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Новая страница: «-- Function allowing for consistent treatment of boolean-like wikitext input. -- It works similarly to the template {{yesno}}.  return function (val, default) 	-- If your wiki uses non-ascii characters for any of &amp;quot;yes&amp;quot;, &amp;quot;no&amp;quot;, etc., you 	-- should replace &amp;quot;val:lower()&amp;quot; with &amp;quot;mw.ustring.lower(val)&amp;quot; in the 	-- following line. 	val = type(val) == &amp;#039;string&amp;#039; and val:lower() or val 	if val == nil then 		return nil 	elseif val == true  		or val == &amp;#039;yes&amp;#039; 		or val == &amp;#039;...»&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) == &#039;string&#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 == &#039;yes&#039;&lt;br /&gt;
		or val == &#039;y&#039;&lt;br /&gt;
		or val == &#039;true&#039;&lt;br /&gt;
		or val == &#039;t&#039;&lt;br /&gt;
		or val == &#039;on&#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 == &#039;no&#039;&lt;br /&gt;
		or val == &#039;n&#039;&lt;br /&gt;
		or val == &#039;false&#039;&lt;br /&gt;
		or val == &#039;f&#039;&lt;br /&gt;
		or val == &#039;off&#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>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Color_contrast/colors&amp;diff=524</id>
		<title>Модуль:Color contrast/colors</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Color_contrast/colors&amp;diff=524"/>
		<updated>2026-01-20T03:35:55Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Новая страница: «return { 	aliceblue            = 0.92880068253475, 	antiquewhite         = 0.84646951707754, 	aqua                 = 0.7874, 	aquamarine           = 0.8078549208338, 	azure                = 0.97265264954166, 	beige                = 0.8988459998705, 	bisque               = 0.80732327372979, 	black                = 0, 	blanchedalmond       = 0.85084439608156, 	blue                 = 0.0722, 	blueviolet           = 0.12622014321946, 	brown                = 0.09...»&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>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Color_contrast&amp;diff=523</id>
		<title>Модуль:Color contrast</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Color_contrast&amp;diff=523"/>
		<updated>2026-01-20T03:35:36Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Новая страница: «-- -- This module implements --  {{Color contrast ratio}} --  {{Greater color contrast ratio}} --  {{ColorToLum}} --  {{RGBColorToLum}} -- local p = {} local HTMLcolor = mw.loadData( &amp;#039;Module:Color contrast/colors&amp;#039; )  local function sRGB (v) 	if (v &amp;lt;= 0.03928) then 		v = v / 12.92 	else 		v = math.pow((v+0.055)/1.055, 2.4) 	end 	return v end  local function rgbdec2lum(R, G, B) 	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 		ret...»&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( &#039;Module:Color contrast/colors&#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 &#039;&#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 &#039;&#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 &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- html &#039;#&#039; entity&lt;br /&gt;
	c = c:gsub(&amp;quot;&amp;amp;#35;&amp;quot;, &amp;quot;#&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	-- whitespace&lt;br /&gt;
	c = c:match( &#039;^%s*(.-)[%s;]*$&#039; )&lt;br /&gt;
&lt;br /&gt;
	-- unstrip nowiki strip markers&lt;br /&gt;
	c = mw.text.unstripNoWiki(c)&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,&#039;^hsl%([%s]*[0-9][0-9%.]*[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*%)$&#039;) then&lt;br /&gt;
		local h, s, l = mw.ustring.match(c,&#039;^hsl%([%s]*([0-9][0-9%.]*)[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*%)$&#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,&#039;^rgb%([%s]*[0-9][0-9]*[%s]*,[%s]*[0-9][0-9]*[%s]*,[%s]*[0-9][0-9]*[%s]*%)$&#039;) then&lt;br /&gt;
		local R, G, B = mw.ustring.match(c,&#039;^rgb%([%s]*([0-9][0-9]*)[%s]*,[%s]*([0-9][0-9]*)[%s]*,[%s]*([0-9][0-9]*)[%s]*%)$&#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,&#039;^rgb%([%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*,[%s]*[0-9][0-9%.]*%%[%s]*%)$&#039;) then&lt;br /&gt;
		local R, G, B = mw.ustring.match(c,&#039;^rgb%([%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*,[%s]*([0-9][0-9%.]*)%%[%s]*%)$&#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, &#039;^[%s#]*([a-f0-9]*)[%s]*$&#039;)&lt;br /&gt;
&lt;br /&gt;
	-- split into rgb&lt;br /&gt;
	local cs = mw.text.split(c or &#039;&#039;, &#039;&#039;)&lt;br /&gt;
	if( #cs == 6 ) then&lt;br /&gt;
		local R = 16*tonumber(&#039;0x&#039; .. cs[1]) + tonumber(&#039;0x&#039; .. cs[2])&lt;br /&gt;
		local G = 16*tonumber(&#039;0x&#039; .. cs[3]) + tonumber(&#039;0x&#039; .. cs[4])&lt;br /&gt;
		local B = 16*tonumber(&#039;0x&#039; .. cs[5]) + tonumber(&#039;0x&#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(&#039;0x&#039; .. cs[1]) + tonumber(&#039;0x&#039; .. cs[1])&lt;br /&gt;
		local G = 16*tonumber(&#039;0x&#039; .. cs[2]) + tonumber(&#039;0x&#039; .. cs[2])&lt;br /&gt;
		local B = 16*tonumber(&#039;0x&#039; .. cs[3]) + tonumber(&#039;0x&#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 &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- This exports the function for use in other modules.&lt;br /&gt;
-- The colour is passed as a string.&lt;br /&gt;
function p._lum(color)&lt;br /&gt;
	return color2lum(color)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._greatercontrast(args)&lt;br /&gt;
	local bias = tonumber(args[&#039;bias&#039;] or &#039;0&#039;) or 0&lt;br /&gt;
	local css = (args[&#039;css&#039;] and args[&#039;css&#039;] ~= &#039;&#039;) and true or false&lt;br /&gt;
	local v1 = color2lum(args[1] or &#039;&#039;)&lt;br /&gt;
	local c2 = args[2] or &#039;white&#039;&lt;br /&gt;
	local v2 = color2lum(c2)&lt;br /&gt;
	local c3 = args[3] or &#039;black&#039;&lt;br /&gt;
	local v3 = color2lum(c3)&lt;br /&gt;
	local ratio1 = -1;&lt;br /&gt;
	local ratio2 = -1;&lt;br /&gt;
	if (type(v1) == &#039;number&#039; and type(v2) == &#039;number&#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) == &#039;number&#039; and type(v3) == &#039;number&#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;
&lt;br /&gt;
	if css then&lt;br /&gt;
		local c1 = args[1] or &#039;&#039;&lt;br /&gt;
		if mw.ustring.match(c1, &#039;^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$&#039;) or&lt;br /&gt;
			mw.ustring.match(c1, &#039;^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$&#039;) then&lt;br /&gt;
				c1 = &#039;#&#039; .. c1&lt;br /&gt;
		end&lt;br /&gt;
		if mw.ustring.match(c2, &#039;^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$&#039;) or&lt;br /&gt;
			mw.ustring.match(c2, &#039;^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$&#039;) then&lt;br /&gt;
				c2 = &#039;#&#039; .. c2&lt;br /&gt;
		end&lt;br /&gt;
		if mw.ustring.match(v3, &#039;^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$&#039;) or&lt;br /&gt;
			mw.ustring.match(v3, &#039;^[A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9][A-Fa-f0-9]$&#039;) then&lt;br /&gt;
				c3 = &#039;#&#039; .. c3&lt;br /&gt;
		end&lt;br /&gt;
		return &#039;background-color:&#039; .. c1 .. &#039;; color:&#039; .. ((ratio1 &amp;gt; 0) and (ratio2 &amp;gt; 0) and ((ratio1 + bias &amp;gt; ratio2) and c2 or c3) or &#039;&#039;) .. &#039;;&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return (ratio1 &amp;gt; 0) and (ratio2 &amp;gt; 0) and ((ratio1 + bias &amp;gt; ratio2) and c2 or c3) or &#039;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._ratio(args)&lt;br /&gt;
	local v1 = color2lum(args[1])&lt;br /&gt;
	local v2 = color2lum(args[2])&lt;br /&gt;
	if (type(v1) == &#039;number&#039; and type(v2) == &#039;number&#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[&#039;error&#039;] or &#039;?&#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 &#039;&#039;):lower()&lt;br /&gt;
	local bg, fg = &#039;white&#039;, &#039;black&#039;&lt;br /&gt;
	local lum_bg, lum_fg = 1, 0&lt;br /&gt;
&lt;br /&gt;
	if args[2] then&lt;br /&gt;
		local lum = color2lum(args[2])&lt;br /&gt;
		if lum ~= &#039;&#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 ~= &#039;&#039; then fg, lum_fg = args[3], lum end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local slist = mw.text.split(mw.ustring.gsub(mw.ustring.gsub(style or &#039;&#039;, &#039;&amp;amp;#[Xx]23;&#039;, &#039;#&#039;), &#039;&amp;amp;#35;&#039;, &#039;#&#039;), &#039;;&#039;)&lt;br /&gt;
	for k = 1,#slist do&lt;br /&gt;
		local s = slist[k]&lt;br /&gt;
		local k,v = s:match( &#039;^[%s]*([^:]-):([^:]-)[%s;]*$&#039; )&lt;br /&gt;
		k = k or &#039;&#039;&lt;br /&gt;
		v = v or &#039;&#039;&lt;br /&gt;
		if (k:match(&#039;^[%s]*(background)[%s]*$&#039;) or k:match(&#039;^[%s]*(background%-color)[%s]*$&#039;)) then&lt;br /&gt;
			local lum = color2lum(v)&lt;br /&gt;
			if( lum ~= &#039;&#039; ) then bg, lum_bg = v, lum end&lt;br /&gt;
		elseif (k:match(&#039;^[%s]*(color)[%s]*$&#039;)) then&lt;br /&gt;
			local lum = color2lum(v)&lt;br /&gt;
			if( lum ~= &#039;&#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;
--[[&lt;br /&gt;
Use {{#invoke:Color contrast|somecolor}} directly or&lt;br /&gt;
{{#invoke:Color contrast}} from a wrapper template.&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
	-- |1=	— required; A color to check.&lt;br /&gt;
--]]&lt;br /&gt;
function p.lum(frame)&lt;br /&gt;
	local color = frame.args[1] or frame:getParent().args[1]&lt;br /&gt;
	return p._lum(color)&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>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Arguments&amp;diff=522</id>
		<title>Модуль:Arguments</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Arguments&amp;diff=522"/>
		<updated>2026-01-20T03:35:12Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Новая страница: «-- This module provides easy processing of arguments passed to Scribunto from -- #invoke. It is intended for use by other Lua modules, and should not be -- called from #invoke directly.  local libraryUtil = require(&amp;#039;libraryUtil&amp;#039;) local checkType = libraryUtil.checkType  local arguments = {}  -- Generate four different tidyVal functions, so that we don&amp;#039;t have to check the -- options every time we call it.  local function tidyValDefault(key, val) 	if type(val)...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module provides easy processing of arguments passed to Scribunto from&lt;br /&gt;
-- #invoke. It is intended for use by other Lua modules, and should not be&lt;br /&gt;
-- called from #invoke directly.&lt;br /&gt;
&lt;br /&gt;
local libraryUtil = require(&#039;libraryUtil&#039;)&lt;br /&gt;
local checkType = libraryUtil.checkType&lt;br /&gt;
&lt;br /&gt;
local arguments = {}&lt;br /&gt;
&lt;br /&gt;
-- Generate four different tidyVal functions, so that we don&#039;t have to check the&lt;br /&gt;
-- options every time we call it.&lt;br /&gt;
&lt;br /&gt;
local function tidyValDefault(key, val)&lt;br /&gt;
	if type(val) == &#039;string&#039; then&lt;br /&gt;
		val = val:match(&#039;^%s*(.-)%s*$&#039;)&lt;br /&gt;
		if val == &#039;&#039; then&lt;br /&gt;
			return nil&lt;br /&gt;
		else&lt;br /&gt;
			return val&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValTrimOnly(key, val)&lt;br /&gt;
	if type(val) == &#039;string&#039; then&lt;br /&gt;
		return val:match(&#039;^%s*(.-)%s*$&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValRemoveBlanksOnly(key, val)&lt;br /&gt;
	if type(val) == &#039;string&#039; then&lt;br /&gt;
		if val:find(&#039;%S&#039;) then&lt;br /&gt;
			return val&lt;br /&gt;
		else&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValNoChange(key, val)&lt;br /&gt;
	return val&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function matchesTitle(given, title)&lt;br /&gt;
	local tp = type( given )&lt;br /&gt;
	return (tp == &#039;string&#039; or tp == &#039;number&#039;) and mw.title.new( given ).prefixedText == title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local translate_mt = { __index = function(t, k) return k end }&lt;br /&gt;
&lt;br /&gt;
function arguments.getArgs(frame, options)&lt;br /&gt;
	checkType(&#039;getArgs&#039;, 1, frame, &#039;table&#039;, true)&lt;br /&gt;
	checkType(&#039;getArgs&#039;, 2, options, &#039;table&#039;, true)&lt;br /&gt;
	frame = frame or {}&lt;br /&gt;
	options = options or {}&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Set up argument translation.&lt;br /&gt;
	--]]&lt;br /&gt;
	options.translate = options.translate or {}&lt;br /&gt;
	if getmetatable(options.translate) == nil then&lt;br /&gt;
		setmetatable(options.translate, translate_mt)&lt;br /&gt;
	end&lt;br /&gt;
	if options.backtranslate == nil then&lt;br /&gt;
		options.backtranslate = {}&lt;br /&gt;
		for k,v in pairs(options.translate) do&lt;br /&gt;
			options.backtranslate[v] = k&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if options.backtranslate and getmetatable(options.backtranslate) == nil then&lt;br /&gt;
		setmetatable(options.backtranslate, {&lt;br /&gt;
			__index = function(t, k)&lt;br /&gt;
				if options.translate[k] ~= k then&lt;br /&gt;
					return nil&lt;br /&gt;
				else&lt;br /&gt;
					return k&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Get the argument tables. If we were passed a valid frame object, get the&lt;br /&gt;
	-- frame arguments (fargs) and the parent frame arguments (pargs), depending&lt;br /&gt;
	-- on the options set and on the parent frame&#039;s availability. If we weren&#039;t&lt;br /&gt;
	-- passed a valid frame object, we are being called from another Lua module&lt;br /&gt;
	-- or from the debug console, so assume that we were passed a table of args&lt;br /&gt;
	-- directly, and assign it to a new variable (luaArgs).&lt;br /&gt;
	--]]&lt;br /&gt;
	local fargs, pargs, luaArgs&lt;br /&gt;
	if type(frame.args) == &#039;table&#039; and type(frame.getParent) == &#039;function&#039; then&lt;br /&gt;
		if options.wrappers then&lt;br /&gt;
			--[[&lt;br /&gt;
			-- The wrappers option makes Module:Arguments look up arguments in&lt;br /&gt;
			-- either the frame argument table or the parent argument table, but&lt;br /&gt;
			-- not both. This means that users can use either the #invoke syntax&lt;br /&gt;
			-- or a wrapper template without the loss of performance associated&lt;br /&gt;
			-- with looking arguments up in both the frame and the parent frame.&lt;br /&gt;
			-- Module:Arguments will look up arguments in the parent frame&lt;br /&gt;
			-- if it finds the parent frame&#039;s title in options.wrapper;&lt;br /&gt;
			-- otherwise it will look up arguments in the frame object passed&lt;br /&gt;
			-- to getArgs.&lt;br /&gt;
			--]]&lt;br /&gt;
			local parent = frame:getParent()&lt;br /&gt;
			if not parent then&lt;br /&gt;
				fargs = frame.args&lt;br /&gt;
			else&lt;br /&gt;
				local title = parent:getTitle():gsub(&#039;/sandbox$&#039;, &#039;&#039;)&lt;br /&gt;
				local found = false&lt;br /&gt;
				if matchesTitle(options.wrappers, title) then&lt;br /&gt;
					found = true&lt;br /&gt;
				elseif type(options.wrappers) == &#039;table&#039; then&lt;br /&gt;
					for _,v in pairs(options.wrappers) do&lt;br /&gt;
						if matchesTitle(v, title) then&lt;br /&gt;
							found = true&lt;br /&gt;
							break&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				-- We test for false specifically here so that nil (the default) acts like true.&lt;br /&gt;
				if found or options.frameOnly == false then&lt;br /&gt;
					pargs = parent.args&lt;br /&gt;
				end&lt;br /&gt;
				if not found or options.parentOnly == false then&lt;br /&gt;
					fargs = frame.args&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			-- options.wrapper isn&#039;t set, so check the other options.&lt;br /&gt;
			if not options.parentOnly then&lt;br /&gt;
				fargs = frame.args&lt;br /&gt;
			end&lt;br /&gt;
			if not options.frameOnly then&lt;br /&gt;
				local parent = frame:getParent()&lt;br /&gt;
				pargs = parent and parent.args or nil&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if options.parentFirst then&lt;br /&gt;
			fargs, pargs = pargs, fargs&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		luaArgs = frame&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set the order of precedence of the argument tables. If the variables are&lt;br /&gt;
	-- nil, nothing will be added to the table, which is how we avoid clashes&lt;br /&gt;
	-- between the frame/parent args and the Lua args.&lt;br /&gt;
	local argTables = {fargs}&lt;br /&gt;
	argTables[#argTables + 1] = pargs&lt;br /&gt;
	argTables[#argTables + 1] = luaArgs&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Generate the tidyVal function. If it has been specified by the user, we&lt;br /&gt;
	-- use that; if not, we choose one of four functions depending on the&lt;br /&gt;
	-- options chosen. This is so that we don&#039;t have to call the options table&lt;br /&gt;
	-- every time the function is called.&lt;br /&gt;
	--]]&lt;br /&gt;
	local tidyVal = options.valueFunc&lt;br /&gt;
	if tidyVal then&lt;br /&gt;
		if type(tidyVal) ~= &#039;function&#039; then&lt;br /&gt;
			error(&lt;br /&gt;
				&amp;quot;bad value assigned to option &#039;valueFunc&#039;&amp;quot;&lt;br /&gt;
					.. &#039;(function expected, got &#039;&lt;br /&gt;
					.. type(tidyVal)&lt;br /&gt;
					.. &#039;)&#039;,&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		end&lt;br /&gt;
	elseif options.trim ~= false then&lt;br /&gt;
		if options.removeBlanks ~= false then&lt;br /&gt;
			tidyVal = tidyValDefault&lt;br /&gt;
		else&lt;br /&gt;
			tidyVal = tidyValTrimOnly&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		if options.removeBlanks ~= false then&lt;br /&gt;
			tidyVal = tidyValRemoveBlanksOnly&lt;br /&gt;
		else&lt;br /&gt;
			tidyVal = tidyValNoChange&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Set up the args, metaArgs and nilArgs tables. args will be the one&lt;br /&gt;
	-- accessed from functions, and metaArgs will hold the actual arguments. Nil&lt;br /&gt;
	-- arguments are memoized in nilArgs, and the metatable connects all of them&lt;br /&gt;
	-- together.&lt;br /&gt;
	--]]&lt;br /&gt;
	local args, metaArgs, nilArgs, metatable = {}, {}, {}, {}&lt;br /&gt;
	setmetatable(args, metatable)&lt;br /&gt;
&lt;br /&gt;
	local function mergeArgs(tables)&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Accepts multiple tables as input and merges their keys and values&lt;br /&gt;
		-- into one table. If a value is already present it is not overwritten;&lt;br /&gt;
		-- tables listed earlier have precedence. We are also memoizing nil&lt;br /&gt;
		-- values, which can be overwritten if they are &#039;s&#039; (soft).&lt;br /&gt;
		--]]&lt;br /&gt;
		for _, t in ipairs(tables) do&lt;br /&gt;
			for key, val in pairs(t) do&lt;br /&gt;
				if metaArgs[key] == nil and nilArgs[key] ~= &#039;h&#039; then&lt;br /&gt;
					local tidiedVal = tidyVal(key, val)&lt;br /&gt;
					if tidiedVal == nil then&lt;br /&gt;
						nilArgs[key] = &#039;s&#039;&lt;br /&gt;
					else&lt;br /&gt;
						metaArgs[key] = tidiedVal&lt;br /&gt;
					end&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;
	-- Define metatable behaviour. Arguments are memoized in the metaArgs table,&lt;br /&gt;
	-- and are only fetched from the argument tables once. Fetching arguments&lt;br /&gt;
	-- from the argument tables is the most resource-intensive step in this&lt;br /&gt;
	-- module, so we try and avoid it where possible. For this reason, nil&lt;br /&gt;
	-- arguments are also memoized, in the nilArgs table. Also, we keep a record&lt;br /&gt;
	-- in the metatable of when pairs and ipairs have been called, so we do not&lt;br /&gt;
	-- run pairs and ipairs on the argument tables more than once. We also do&lt;br /&gt;
	-- not run ipairs on fargs and pargs if pairs has already been run, as all&lt;br /&gt;
	-- the arguments will already have been copied over.&lt;br /&gt;
	--]]&lt;br /&gt;
&lt;br /&gt;
	metatable.__index = function (t, key)&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Fetches an argument when the args table is indexed. First we check&lt;br /&gt;
		-- to see if the value is memoized, and if not we try and fetch it from&lt;br /&gt;
		-- the argument tables. When we check memoization, we need to check&lt;br /&gt;
		-- metaArgs before nilArgs, as both can be non-nil at the same time.&lt;br /&gt;
		-- If the argument is not present in metaArgs, we also check whether&lt;br /&gt;
		-- pairs has been run yet. If pairs has already been run, we return nil.&lt;br /&gt;
		-- This is because all the arguments will have already been copied into&lt;br /&gt;
		-- metaArgs by the mergeArgs function, meaning that any other arguments&lt;br /&gt;
		-- must be nil.&lt;br /&gt;
		--]]&lt;br /&gt;
		if type(key) == &#039;string&#039; then&lt;br /&gt;
			key = options.translate[key]&lt;br /&gt;
		end&lt;br /&gt;
		local val = metaArgs[key]&lt;br /&gt;
		if val ~= nil then&lt;br /&gt;
			return val&lt;br /&gt;
		elseif metatable.donePairs or nilArgs[key] then&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
		for _, argTable in ipairs(argTables) do&lt;br /&gt;
			local argTableVal = tidyVal(key, argTable[key])&lt;br /&gt;
			if argTableVal ~= nil then&lt;br /&gt;
				metaArgs[key] = argTableVal&lt;br /&gt;
				return argTableVal&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		nilArgs[key] = &#039;h&#039;&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__newindex = function (t, key, val)&lt;br /&gt;
		-- This function is called when a module tries to add a new value to the&lt;br /&gt;
		-- args table, or tries to change an existing value.&lt;br /&gt;
		if type(key) == &#039;string&#039; then&lt;br /&gt;
			key = options.translate[key]&lt;br /&gt;
		end&lt;br /&gt;
		if options.readOnly then&lt;br /&gt;
			error(&lt;br /&gt;
				&#039;could not write to argument table key &amp;quot;&#039;&lt;br /&gt;
					.. tostring(key)&lt;br /&gt;
					.. &#039;&amp;quot;; the table is read-only&#039;,&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		elseif options.noOverwrite and args[key] ~= nil then&lt;br /&gt;
			error(&lt;br /&gt;
				&#039;could not write to argument table key &amp;quot;&#039;&lt;br /&gt;
					.. tostring(key)&lt;br /&gt;
					.. &#039;&amp;quot;; overwriting existing arguments is not permitted&#039;,&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		elseif val == nil then&lt;br /&gt;
			--[[&lt;br /&gt;
			-- If the argument is to be overwritten with nil, we need to erase&lt;br /&gt;
			-- the value in metaArgs, so that __index, __pairs and __ipairs do&lt;br /&gt;
			-- not use a previous existing value, if present; and we also need&lt;br /&gt;
			-- to memoize the nil in nilArgs, so that the value isn&#039;t looked&lt;br /&gt;
			-- up in the argument tables if it is accessed again.&lt;br /&gt;
			--]]&lt;br /&gt;
			metaArgs[key] = nil&lt;br /&gt;
			nilArgs[key] = &#039;h&#039;&lt;br /&gt;
		else&lt;br /&gt;
			metaArgs[key] = val&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function translatenext(invariant)&lt;br /&gt;
		local k, v = next(invariant.t, invariant.k)&lt;br /&gt;
		invariant.k = k&lt;br /&gt;
		if k == nil then&lt;br /&gt;
			return nil&lt;br /&gt;
		elseif type(k) ~= &#039;string&#039; or not options.backtranslate then&lt;br /&gt;
			return k, v&lt;br /&gt;
		else&lt;br /&gt;
			local backtranslate = options.backtranslate[k]&lt;br /&gt;
			if backtranslate == nil then&lt;br /&gt;
				-- Skip this one. This is a tail call, so this won&#039;t cause stack overflow&lt;br /&gt;
				return translatenext(invariant)&lt;br /&gt;
			else&lt;br /&gt;
				return backtranslate, v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__pairs = function ()&lt;br /&gt;
		-- Called when pairs is run on the args table.&lt;br /&gt;
		if not metatable.donePairs then&lt;br /&gt;
			mergeArgs(argTables)&lt;br /&gt;
			metatable.donePairs = true&lt;br /&gt;
		end&lt;br /&gt;
		return translatenext, { t = metaArgs }&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function inext(t, i)&lt;br /&gt;
		-- This uses our __index metamethod&lt;br /&gt;
		local v = t[i + 1]&lt;br /&gt;
		if v ~= nil then&lt;br /&gt;
			return i + 1, v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__ipairs = function (t)&lt;br /&gt;
		-- Called when ipairs is run on the args table.&lt;br /&gt;
		return inext, t, 0&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return arguments&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableTools&amp;diff=521</id>
		<title>Модуль:TableTools</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableTools&amp;diff=521"/>
		<updated>2026-01-20T03:34:43Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Новая страница: «------------------------------------------------------------------------------------ --                                   TableTools                                   -- --                                                                                -- -- This module includes a number of functions for dealing with Lua tables.        -- -- It is a meta-module, meant to be called from other Lua modules, and should not -- -- be called directly from #invoke....»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&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 not --&lt;br /&gt;
-- be called directly from #invoke.                                               --&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local libraryUtil = require(&#039;libraryUtil&#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;
-- 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&#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;
function p.isPositiveInteger(v)&lt;br /&gt;
	return type(v) == &#039;number&#039; and v &amp;gt;= 1 and floor(v) == v and v &amp;lt; infinity&lt;br /&gt;
end&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 if&lt;br /&gt;
-- not. Although it doesn&#039;t operate on tables, it is included here as it is useful&lt;br /&gt;
-- for determining whether a value can be a valid table key. Lua will generate an&lt;br /&gt;
-- error if a NaN is used as a table key.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.isNan(v)&lt;br /&gt;
	return type(v) == &#039;number&#039; and v ~= v&lt;br /&gt;
end&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;
function p.shallowClone(t)&lt;br /&gt;
	checkType(&#039;shallowClone&#039;, 1, t, &#039;table&#039;)&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;
-- 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;
function p.removeDuplicates(arr)&lt;br /&gt;
	checkType(&#039;removeDuplicates&#039;, 1, arr, &#039;table&#039;)&lt;br /&gt;
	local isNan = p.isNan&lt;br /&gt;
	local ret, exists = {}, {}&lt;br /&gt;
	for _, v in ipairs(arr) do&lt;br /&gt;
		if isNan(v) then&lt;br /&gt;
			-- NaNs can&#039;t be table keys, and they are also unique, so we don&#039;t need to check existence.&lt;br /&gt;
			ret[#ret + 1] = v&lt;br /&gt;
		elseif 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;
	return ret&lt;br /&gt;
end&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;
function p.numKeys(t)&lt;br /&gt;
	checkType(&#039;numKeys&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	local isPositiveInteger = p.isPositiveInteger&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	for k 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;
-- 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 = &#039;foo&#039;, a3 = &#039;bar&#039;, a6 = &#039;baz&#039;} and the prefix &amp;quot;a&amp;quot;, affixNums will return&lt;br /&gt;
-- {1, 3, 6}.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.affixNums(t, prefix, suffix)&lt;br /&gt;
	checkType(&#039;affixNums&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	checkType(&#039;affixNums&#039;, 2, prefix, &#039;string&#039;, true)&lt;br /&gt;
	checkType(&#039;affixNums&#039;, 3, suffix, &#039;string&#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;
		return s:gsub(&#039;([%(%)%%%.%[%]%*%+%-%?%^%$])&#039;, &#039;%%%1&#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	prefix = prefix or &#039;&#039;&lt;br /&gt;
	suffix = suffix or &#039;&#039;&lt;br /&gt;
	prefix = cleanPattern(prefix)&lt;br /&gt;
	suffix = cleanPattern(suffix)&lt;br /&gt;
	local pattern = &#039;^&#039; .. prefix .. &#039;([1-9]%d*)&#039; .. suffix .. &#039;$&#039;&lt;br /&gt;
&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	for k in pairs(t) do&lt;br /&gt;
		if type(k) == &#039;string&#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;
-- 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 = &#039;text&#039;, bar = &#039;text&#039;}, [2] = {foo = &#039;text&#039;, baz = &#039;text&#039;}}.&lt;br /&gt;
-- Keys that don&#039;t end with an integer are stored in a subtable named &amp;quot;other&amp;quot;. The&lt;br /&gt;
-- compress option compresses the table so that it can be iterated over with&lt;br /&gt;
-- ipairs.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.numData(t, compress)&lt;br /&gt;
	checkType(&#039;numData&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	checkType(&#039;numData&#039;, 2, compress, &#039;boolean&#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), &#039;^([^0-9]*)([1-9][0-9]*)$&#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 == &#039;&#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;
-- 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;
function p.compressSparseArray(t)&lt;br /&gt;
	checkType(&#039;compressSparseArray&#039;, 1, t, &#039;table&#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;
-- 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;
function p.sparseIpairs(t)&lt;br /&gt;
	checkType(&#039;sparseIpairs&#039;, 1, t, &#039;table&#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;
-- 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;
function p.size(t)&lt;br /&gt;
	checkType(&#039;size&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	local i = 0&lt;br /&gt;
	for _ 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;
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;
	elseif type1 == &#039;table&#039; or type1 == &#039;boolean&#039; or type1 == &#039;function&#039; then&lt;br /&gt;
		return tostring(item1) &amp;lt; tostring(item2)&lt;br /&gt;
	else&lt;br /&gt;
		return item1 &amp;lt; item2&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- keysToList&lt;br /&gt;
--&lt;br /&gt;
-- Returns an array 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(&#039;keysToList&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
		checkTypeMulti(&#039;keysToList&#039;, 2, keySort, {&#039;function&#039;, &#039;boolean&#039;, &#039;nil&#039;})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local arr = {}&lt;br /&gt;
	local index = 1&lt;br /&gt;
	for k in pairs(t) do&lt;br /&gt;
		arr[index] = k&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) == &#039;function&#039; and keySort or defaultKeySort&lt;br /&gt;
		table.sort(arr, keySort)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return arr&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- sortedPairs&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(&#039;sortedPairs&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	checkType(&#039;sortedPairs&#039;, 2, keySort, &#039;function&#039;, true)&lt;br /&gt;
&lt;br /&gt;
	local arr = 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 = arr[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;
-- isArray&lt;br /&gt;
--&lt;br /&gt;
-- Returns true if the given value is a table and all keys are consecutive&lt;br /&gt;
-- integers starting at 1.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.isArray(v)&lt;br /&gt;
	if type(v) ~= &#039;table&#039; then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	local i = 0&lt;br /&gt;
	for _ in pairs(v) do&lt;br /&gt;
		i = i + 1&lt;br /&gt;
		if v[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;
------------------------------------------------------------------------------------&lt;br /&gt;
-- isArrayLike&lt;br /&gt;
--&lt;br /&gt;
-- Returns true if the given value is iterable and all keys are consecutive&lt;br /&gt;
-- integers starting at 1.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.isArrayLike(v)&lt;br /&gt;
	if not pcall(pairs, v) then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	local i = 0&lt;br /&gt;
	for _ in pairs(v) do&lt;br /&gt;
		i = i + 1&lt;br /&gt;
		if v[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;
------------------------------------------------------------------------------------&lt;br /&gt;
-- invert&lt;br /&gt;
--&lt;br /&gt;
-- Transposes the keys and values in an array. For example, {&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;} -&amp;gt;&lt;br /&gt;
-- {a = 1, b = 2, c = 3}. Duplicates are not supported (result values refer to&lt;br /&gt;
-- the index of the last duplicate) and NaN values are ignored.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.invert(arr)&lt;br /&gt;
	checkType(&amp;quot;invert&amp;quot;, 1, arr, &amp;quot;table&amp;quot;)&lt;br /&gt;
	local isNan = p.isNan&lt;br /&gt;
	local map = {}&lt;br /&gt;
	for i, v in ipairs(arr) do&lt;br /&gt;
		if not isNan(v) then&lt;br /&gt;
			map[v] = i&lt;br /&gt;
		end&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;
-- listToSet&lt;br /&gt;
--&lt;br /&gt;
-- Creates a set from the array part of the table. Indexing the set by any of the&lt;br /&gt;
-- values of the array returns true. For example, {&amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot;} -&amp;gt;&lt;br /&gt;
-- {a = true, b = true, c = true}. NaN values are ignored as Lua considers them&lt;br /&gt;
-- never equal to any value (including other NaNs or even themselves).&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.listToSet(arr)&lt;br /&gt;
	checkType(&amp;quot;listToSet&amp;quot;, 1, arr, &amp;quot;table&amp;quot;)&lt;br /&gt;
	local isNan = p.isNan&lt;br /&gt;
	local set = {}&lt;br /&gt;
	for _, v in ipairs(arr) do&lt;br /&gt;
		if not isNan(v) then&lt;br /&gt;
			set[v] = true&lt;br /&gt;
		end&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;
-- deepCopy&lt;br /&gt;
--&lt;br /&gt;
-- Recursive deep copy function. Preserves identities of subtables.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
local function _deepCopy(orig, includeMetatable, already_seen)&lt;br /&gt;
	if type(orig) ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
		return orig&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- already_seen stores copies of tables indexed by the original table.&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;
	copy = {}&lt;br /&gt;
	already_seen[orig] = copy -- memoize before any recursion, to avoid infinite loops&lt;br /&gt;
	&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;
	&lt;br /&gt;
	if includeMetatable then&lt;br /&gt;
		local mt = getmetatable(orig)&lt;br /&gt;
		if mt ~= nil then&lt;br /&gt;
			setmetatable(copy, _deepCopy(mt, true, already_seen))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&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;
	return _deepCopy(orig, not noMetatable, already_seen or {})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- sparseConcat&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 arr = {}&lt;br /&gt;
&lt;br /&gt;
	local arr_i = 0&lt;br /&gt;
	for _, v in p.sparseIpairs(t) do&lt;br /&gt;
		arr_i = arr_i + 1&lt;br /&gt;
		arr[arr_i] = v&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return table.concat(arr, sep, i, j)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- length&lt;br /&gt;
--&lt;br /&gt;
-- Finds the length of an array, or of a quasi-array with keys such as &amp;quot;data1&amp;quot;,&lt;br /&gt;
-- &amp;quot;data2&amp;quot;, etc., using an exponential search algorithm. It is similar to the&lt;br /&gt;
-- operator #, but may return a different value when there are gaps in the array&lt;br /&gt;
-- portion of the table. Intended to be used on data loaded with mw.loadData. For&lt;br /&gt;
-- other tables, use #.&lt;br /&gt;
-- Note: #frame.args in frame object always be set to 0, regardless of  the number&lt;br /&gt;
-- of unnamed template parameters, so use this function for frame.args.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.length(t, prefix)&lt;br /&gt;
	-- requiring module inline so that [[Module:Exponential search]] which is&lt;br /&gt;
	-- only needed by this one function doesn&#039;t get millions of transclusions&lt;br /&gt;
	local expSearch = require(&amp;quot;Module:Exponential search&amp;quot;)&lt;br /&gt;
	checkType(&#039;length&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	checkType(&#039;length&#039;, 2, prefix, &#039;string&#039;, true)&lt;br /&gt;
	return expSearch(function (i)&lt;br /&gt;
		local key&lt;br /&gt;
		if prefix then&lt;br /&gt;
			key = prefix .. tostring(i)&lt;br /&gt;
		else&lt;br /&gt;
			key = i&lt;br /&gt;
		end&lt;br /&gt;
		return t[key] ~= nil&lt;br /&gt;
	end) or 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- inArray&lt;br /&gt;
--&lt;br /&gt;
-- Returns true if searchElement is a member of the array, and false otherwise.&lt;br /&gt;
-- Equivalent to JavaScript array.includes(searchElement) or&lt;br /&gt;
-- array.includes(searchElement, fromIndex), except fromIndex is 1 indexed&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.inArray(array, searchElement, fromIndex)&lt;br /&gt;
	checkType(&amp;quot;inArray&amp;quot;, 1, array, &amp;quot;table&amp;quot;)&lt;br /&gt;
	-- if searchElement is nil, error?&lt;br /&gt;
&lt;br /&gt;
	fromIndex = tonumber(fromIndex)&lt;br /&gt;
	if fromIndex then&lt;br /&gt;
		if (fromIndex &amp;lt; 0) then&lt;br /&gt;
			fromIndex = #array + fromIndex + 1&lt;br /&gt;
		end&lt;br /&gt;
		if fromIndex &amp;lt; 1 then fromIndex = 1 end&lt;br /&gt;
		for _, v in ipairs({unpack(array, fromIndex)}) do&lt;br /&gt;
			if v == searchElement then&lt;br /&gt;
				return true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		for _, v in pairs(array) do&lt;br /&gt;
			if v == searchElement 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;
------------------------------------------------------------------------------------&lt;br /&gt;
-- merge&lt;br /&gt;
--&lt;br /&gt;
-- Given the arrays, returns an array containing the elements of each input array&lt;br /&gt;
-- in sequence.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.merge(...)&lt;br /&gt;
	local arrays = {...}&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	for i, arr in ipairs(arrays) do&lt;br /&gt;
		checkType(&#039;merge&#039;, i, arr, &#039;table&#039;)&lt;br /&gt;
		for _, v in ipairs(arr) do&lt;br /&gt;
			ret[#ret + 1] = v&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;
-- extend&lt;br /&gt;
--&lt;br /&gt;
-- Extends the first array in place by appending all elements from the second&lt;br /&gt;
-- array.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
function p.extend(arr1, arr2)&lt;br /&gt;
	checkType(&#039;extend&#039;, 1, arr1, &#039;table&#039;)&lt;br /&gt;
	checkType(&#039;extend&#039;, 2, arr2, &#039;table&#039;)&lt;br /&gt;
&lt;br /&gt;
	for _, v in ipairs(arr2) do&lt;br /&gt;
		arr1[#arr1 + 1] = v&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Navbox/configuration&amp;diff=520</id>
		<title>Модуль:Navbox/configuration</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Navbox/configuration&amp;diff=520"/>
		<updated>2026-01-20T03:33:59Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Новая страница: «return { 	aria_label = &amp;#039;Navbox&amp;#039;, 	nowrap_item = &amp;#039;%s&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;&amp;#039;, 	templatestyles = mw.getCurrentFrame():extensionTag{ 		name = &amp;#039;templatestyles&amp;#039;, args = { src = &amp;#039;Module:Navbox/styles.css&amp;#039; } 	}, 	hlist_templatestyles = &amp;#039;Hlist/styles.css&amp;#039;, 	plainlist_templatestyles = &amp;#039;Plainlist/styles.css&amp;#039;, 	-- do not localize marker table 	marker = { 		oddeven = &amp;#039;\127_ODDEVEN_\127&amp;#039;, 		restart = &amp;#039;\127_ODDEVEN0_\127&amp;#039;, 		regex = &amp;#039;\127_ODDEVEN(%d?)_\127&amp;#039; 	}, 	ca...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;return {&lt;br /&gt;
	aria_label = &#039;Navbox&#039;,&lt;br /&gt;
	nowrap_item = &#039;%s&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;&#039;,&lt;br /&gt;
	templatestyles = mw.getCurrentFrame():extensionTag{&lt;br /&gt;
		name = &#039;templatestyles&#039;, args = { src = &#039;Module:Navbox/styles.css&#039; }&lt;br /&gt;
	},&lt;br /&gt;
	hlist_templatestyles = &#039;Hlist/styles.css&#039;,&lt;br /&gt;
	plainlist_templatestyles = &#039;Plainlist/styles.css&#039;,&lt;br /&gt;
	-- do not localize marker table&lt;br /&gt;
	marker = {&lt;br /&gt;
		oddeven = &#039;\127_ODDEVEN_\127&#039;,&lt;br /&gt;
		restart = &#039;\127_ODDEVEN0_\127&#039;,&lt;br /&gt;
		regex = &#039;\127_ODDEVEN(%d?)_\127&#039;&lt;br /&gt;
	},&lt;br /&gt;
	category = {&lt;br /&gt;
		orphan = &#039;[[Category:Navbox orphans]]&#039;,&lt;br /&gt;
		horizontal_lists = &#039;Navigational boxes without horizontal lists&#039;,&lt;br /&gt;
		background_colors = &#039;Navboxes using background colours&#039;,&lt;br /&gt;
		illegible = &#039;Potentially illegible navboxes&#039;,&lt;br /&gt;
		borders = &#039;Navboxes using borders&#039;,&lt;br /&gt;
		without_first_col = &#039;[[Category:Pages using navbox columns without the first column]]&#039;&lt;br /&gt;
	},&lt;br /&gt;
	keyword = {&lt;br /&gt;
		border_subgroup = &#039;subgroup&#039;,&lt;br /&gt;
		border_child = &#039;child&#039;,&lt;br /&gt;
		border_none = &#039;none&#039;,&lt;br /&gt;
		evenodd_swap = &#039;swap&#039;,&lt;br /&gt;
		navbar_off = &#039;off&#039;,&lt;br /&gt;
		navbar_plain = &#039;plain&#039;,&lt;br /&gt;
		nocat_false = &#039;false&#039;,&lt;br /&gt;
		nowrapitems_yes = &#039;yes&#039;,&lt;br /&gt;
		orphan_yes = &#039;yes&#039;,&lt;br /&gt;
		state_collapsed = &#039;collapsed&#039;,&lt;br /&gt;
		state_off = &#039;off&#039;,&lt;br /&gt;
		state_plain = &#039;plain&#039;,&lt;br /&gt;
		state_uncollapsed = &#039;uncollapsed&#039;,&lt;br /&gt;
		subgroups = {&#039;subgroup&#039;, &#039;child&#039;, &#039;&#039;},&lt;br /&gt;
		subpage_doc = &#039;doc&#039;,&lt;br /&gt;
		subpage_sandbox = &#039;sandbox&#039;,&lt;br /&gt;
		subpage_testcases = &#039;testcases&#039;,&lt;br /&gt;
		tracking_no = &#039;no&#039;,&lt;br /&gt;
		with_collapsible_groups = &#039;with collapsible groups&#039;,&lt;br /&gt;
		with_columns = &#039;with columns&#039;,&lt;br /&gt;
	},&lt;br /&gt;
	class = {&lt;br /&gt;
		autocollapse = &#039;autocollapse&#039;,&lt;br /&gt;
		collapsible = &#039;mw-collapsible&#039;,&lt;br /&gt;
		collapsed = &#039;mw-collapsed&#039;,&lt;br /&gt;
		-- Warning&lt;br /&gt;
		navbox = &#039;navbox&#039;, -- WMF currently hides &#039;navbox&#039; from mobile,&lt;br /&gt;
		-- so you probably shouldn&#039;t change the navbox class.&lt;br /&gt;
		navbox_abovebelow = &#039;navbox-abovebelow&#039;,&lt;br /&gt;
		navbox_group = &#039;navbox-group&#039;,&lt;br /&gt;
		navbox_image = &#039;navbox-image&#039;,&lt;br /&gt;
		navbox_inner = &#039;navbox-inner&#039;,&lt;br /&gt;
		navbox_list = &#039;navbox-list&#039;,&lt;br /&gt;
		navbox_list_with_group = &#039;navbox-list-with-group&#039;,&lt;br /&gt;
		navbox_part = &#039;navbox-&#039;, -- do not l10n&lt;br /&gt;
		navbox_styles = &#039;navbox-styles&#039;,&lt;br /&gt;
		navbox_subgroup = &#039;navbox-subgroup&#039;,&lt;br /&gt;
		navbox_title = &#039;navbox-title&#039;, -- l10n only if you change pattern.navbox_title below&lt;br /&gt;
		navbox_odd_part = &#039;odd&#039;, -- do not l10n&lt;br /&gt;
		navbox_even_part = &#039;even&#039;, -- do not l10n&lt;br /&gt;
		nomobile = &#039;nomobile&#039;,&lt;br /&gt;
		nowraplinks = &#039;nowraplinks&#039;,&lt;br /&gt;
		noviewer = &#039;noviewer&#039;, -- used to remove images from MediaViewer&lt;br /&gt;
		notheme = &#039;notheme&#039;&lt;br /&gt;
	},&lt;br /&gt;
	pattern = {&lt;br /&gt;
		class = &#039;class&#039;,&lt;br /&gt;
		colnum = &#039;^col(%d+)$&#039;,&lt;br /&gt;
		colheadernum = &#039;^col(%d+)header$&#039;,&lt;br /&gt;
		colfooternum = &#039;^col(%d+)footer$&#039;,&lt;br /&gt;
		contentnum = &#039;^content(%d+)$&#039;,&lt;br /&gt;
		groupnum = &#039;^group(%d+)$&#039;,&lt;br /&gt;
		hlist = &#039;hlist&#039;,&lt;br /&gt;
		listnum = &#039;^list(%d+)$&#039;,&lt;br /&gt;
		navbox = &#039;Template:Navbox&#039;,&lt;br /&gt;
		navbox_title = &#039;&amp;lt;th[^&amp;gt;]*&amp;quot;navbox%-title&amp;quot;&#039;,&lt;br /&gt;
		nowrap = &#039;^&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;&#039;,&lt;br /&gt;
		num = &#039;^%a+(%d+)$&#039;,&lt;br /&gt;
		plainlist = &#039;plainlist&#039;,&lt;br /&gt;
		sandbox = &#039;/sandbox$&#039;,&lt;br /&gt;
		sectionnum = &#039;^section(%d+)$&#039;,&lt;br /&gt;
		sectnum = &#039;^sect(%d+)$&#039;,&lt;br /&gt;
		style = &#039;style$&#039;,&lt;br /&gt;
		with_collapsible_groups = &#039;Template:Navbox with collapsible groups&#039;,&lt;br /&gt;
		with_columns = &#039;Template:Navbox with columns&#039;,&lt;br /&gt;
	},&lt;br /&gt;
	arg = {&lt;br /&gt;
		abbr_and_num = &#039;abbr%d&#039;,&lt;br /&gt;
		above = &#039;above&#039;,&lt;br /&gt;
		aboveclass = &#039;aboveclass&#039;,&lt;br /&gt;
		abovestyle = &#039;abovestyle&#039;,&lt;br /&gt;
		basestyle = &#039;basestyle&#039;,&lt;br /&gt;
		below = &#039;below&#039;,&lt;br /&gt;
		belowclass = &#039;belowclass&#039;,&lt;br /&gt;
		belowstyle = &#039;belowstyle&#039;,&lt;br /&gt;
		bodyclass = &#039;bodyclass&#039;,&lt;br /&gt;
		bodystyle = &#039;bodystyle&#039;,&lt;br /&gt;
		border = &#039;border&#039;,&lt;br /&gt;
		content_and_num = &#039;content%d&#039;,&lt;br /&gt;
		contentstyle = &#039;contentstyle&#039;,&lt;br /&gt;
		contentstyle_and_num = &#039;content%dstyle&#039;,&lt;br /&gt;
		colheaderstyle = &#039;colheaderstyle&#039;,&lt;br /&gt;
		colheader_and_num = &#039;col%dheader&#039;,&lt;br /&gt;
		colheaderstyle_and_num = &#039;col%dheaderstyle&#039;,&lt;br /&gt;
		colheadercolspan_and_num = &#039;col%dheadercolspan&#039;,&lt;br /&gt;
		colstyle = &#039;colstyle&#039;,&lt;br /&gt;
		col_and_num = &#039;col%d&#039;,&lt;br /&gt;
		colstyle_and_num = &#039;col%dstyle&#039;,&lt;br /&gt;
		colwidth = &#039;colwidth&#039;,&lt;br /&gt;
		colwidth_and_num = &#039;col%dwidth&#039;,&lt;br /&gt;
		colfooterstyle = &#039;colfooterstyle&#039;,&lt;br /&gt;
		colfooter_and_num = &#039;col%dfooter&#039;,&lt;br /&gt;
		colfooterstyle_and_num = &#039;col%dfooterstyle&#039;,&lt;br /&gt;
		colfootercolspan_and_num = &#039;col%dfootercolspan&#039;,&lt;br /&gt;
		coltablestyle = &#039;coltablestyle&#039;,&lt;br /&gt;
		evencolstyle = &#039;evencolstyle&#039;,&lt;br /&gt;
		evenodd = &#039;evenodd&#039;,&lt;br /&gt;
		evenstyle = &#039;evenstyle&#039;,&lt;br /&gt;
		fullwidth = &#039;fullwidth&#039;,&lt;br /&gt;
		group1 = &#039;group1&#039;,&lt;br /&gt;
		group2 = &#039;group2&#039;,&lt;br /&gt;
		group_and_num = &#039;group%d&#039;,&lt;br /&gt;
		groupclass = &#039;groupclass&#039;,&lt;br /&gt;
		groupstyle = &#039;groupstyle&#039;,&lt;br /&gt;
		groupstyle_and_num = &#039;group%dstyle&#039;,&lt;br /&gt;
		groupwidth = &#039;groupwidth&#039;,&lt;br /&gt;
		image = &#039;image&#039;,&lt;br /&gt;
		image_and_num = &#039;image%d&#039;,&lt;br /&gt;
		imageclass = &#039;imageclass&#039;,&lt;br /&gt;
		imageleft = &#039;imageleft&#039;,&lt;br /&gt;
		imageleft_and_num = &#039;imageleft%d&#039;,&lt;br /&gt;
		imageleftstyle = &#039;imageleftstyle&#039;,&lt;br /&gt;
		imagestyle = &#039;imagestyle&#039;,&lt;br /&gt;
		innerstyle = &#039;innerstyle&#039;,&lt;br /&gt;
		list1padding = &#039;list1padding&#039;,&lt;br /&gt;
		list_and_num = &#039;list%d&#039;,&lt;br /&gt;
		listclass = &#039;listclass&#039;,&lt;br /&gt;
		listclass_and_num = &#039;list%dclass&#039;,&lt;br /&gt;
		listpadding = &#039;listpadding&#039;,&lt;br /&gt;
		liststyle = &#039;liststyle&#039;,&lt;br /&gt;
		liststyle_and_num = &#039;list%dstyle&#039;,&lt;br /&gt;
		name = &#039;name&#039;,&lt;br /&gt;
		navbar = &#039;navbar&#039;,&lt;br /&gt;
		navboxclass = &#039;navboxclass&#039;,&lt;br /&gt;
		nocat = &#039;nocat&#039;,&lt;br /&gt;
		nowrapitems = &#039;nowrapitems&#039;,&lt;br /&gt;
		oddcolstyle = &#039;oddcolstyle&#039;,&lt;br /&gt;
		oddstyle = &#039;oddstyle&#039;,&lt;br /&gt;
		orphan = &#039;orphan&#039;,&lt;br /&gt;
		padding = &#039;padding&#039;,&lt;br /&gt;
		sect_and_num = &#039;sect%d&#039;,&lt;br /&gt;
		section_and_num = &#039;section%d&#039;,&lt;br /&gt;
		sectiontitlestyle_and_num = &#039;section%dtitlestyle&#039;,&lt;br /&gt;
		secttitlestyle = &#039;secttitlestyle&#039;,&lt;br /&gt;
		selected = &#039;selected&#039;,&lt;br /&gt;
		state = &#039;state&#039;,&lt;br /&gt;
		state_and_num = &#039;state%d&#039;,&lt;br /&gt;
		style = &#039;style&#039;,&lt;br /&gt;
		subgroups_and_num = {&#039;subgroup%d&#039;, &#039;child%d&#039;, &#039;%d&#039;},&lt;br /&gt;
		templatestyles = &#039;templatestyles&#039;,&lt;br /&gt;
		child_templatestyles = &#039;child templatestyles&#039;,&lt;br /&gt;
		title = &#039;title&#039;,&lt;br /&gt;
		titleclass = &#039;titleclass&#039;,&lt;br /&gt;
		titlestyle = &#039;titlestyle&#039;,&lt;br /&gt;
		tracking = &#039;tracking&#039;,&lt;br /&gt;
	},&lt;br /&gt;
	-- names of navbar arguments&lt;br /&gt;
	navbar = {&lt;br /&gt;
		name = 1,&lt;br /&gt;
		fontstyle = &#039;fontstyle&#039;,&lt;br /&gt;
		mini = &#039;mini&#039;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Navbox&amp;diff=518</id>
		<title>Модуль:Navbox</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Navbox&amp;diff=518"/>
		<updated>2026-01-20T03:04:45Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Новая страница: «require(&amp;#039;strict&amp;#039;) local p = {} local cfg = mw.loadData(&amp;#039;Module:Navbox/configuration&amp;#039;) local inArray = require(&amp;quot;Module:TableTools&amp;quot;).inArray local getArgs -- lazily initialized local hiding_templatestyles = {}   -- global passthrough variables local passthrough = { 	[cfg.arg.above]=true,[cfg.arg.aboveclass]=true,[cfg.arg.abovestyle]=true, 	[cfg.arg.basestyle]=true, 	[cfg.arg.below]=true,[cfg.arg.belowclass]=true,[cfg.arg.belowstyle]=true, 	[cfg.arg.bodyclass]=...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;require(&#039;strict&#039;)&lt;br /&gt;
local p = {}&lt;br /&gt;
local cfg = mw.loadData(&#039;Module:Navbox/configuration&#039;)&lt;br /&gt;
local inArray = require(&amp;quot;Module:TableTools&amp;quot;).inArray&lt;br /&gt;
local getArgs -- lazily initialized&lt;br /&gt;
local hiding_templatestyles = {} &lt;br /&gt;
&lt;br /&gt;
-- global passthrough variables&lt;br /&gt;
local passthrough = {&lt;br /&gt;
	[cfg.arg.above]=true,[cfg.arg.aboveclass]=true,[cfg.arg.abovestyle]=true,&lt;br /&gt;
	[cfg.arg.basestyle]=true,&lt;br /&gt;
	[cfg.arg.below]=true,[cfg.arg.belowclass]=true,[cfg.arg.belowstyle]=true,&lt;br /&gt;
	[cfg.arg.bodyclass]=true,&lt;br /&gt;
	[cfg.arg.groupclass]=true,&lt;br /&gt;
	[cfg.arg.image]=true,[cfg.arg.imageclass]=true,[cfg.arg.imagestyle]=true,&lt;br /&gt;
	[cfg.arg.imageleft]=true,[cfg.arg.imageleftstyle]=true,&lt;br /&gt;
	[cfg.arg.listclass]=true,&lt;br /&gt;
	[cfg.arg.name]=true,&lt;br /&gt;
	[cfg.arg.navbar]=true,&lt;br /&gt;
	[cfg.arg.state]=true,&lt;br /&gt;
	[cfg.arg.title]=true,[cfg.arg.titleclass]=true,[cfg.arg.titlestyle]=true,&lt;br /&gt;
	argHash=true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- helper functions&lt;br /&gt;
local andnum = function(s, n) return string.format(cfg.arg[s .. &#039;_and_num&#039;], n) end&lt;br /&gt;
local isblank = function(v) return (v or &#039;&#039;) == &#039;&#039; end&lt;br /&gt;
&lt;br /&gt;
local function concatstrings(s)&lt;br /&gt;
	local r = table.concat(s, &#039;&#039;)&lt;br /&gt;
	if r:match(&#039;^%s*$&#039;) then return nil end&lt;br /&gt;
	return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function concatstyles(s)&lt;br /&gt;
	local r = &#039;&#039;&lt;br /&gt;
	for _, v in ipairs(s) do&lt;br /&gt;
		v = mw.text.trim(v, &amp;quot;%s;&amp;quot;)&lt;br /&gt;
		if not isblank(v) then r = r .. v .. &#039;;&#039; end&lt;br /&gt;
	end&lt;br /&gt;
	if isblank(r) then return nil end&lt;br /&gt;
	return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getSubgroup(args, listnum, listText, prefix)&lt;br /&gt;
	local subArgs = {&lt;br /&gt;
		[cfg.arg.border] = cfg.keyword.border_subgroup,&lt;br /&gt;
		[cfg.arg.navbar] = cfg.keyword.navbar_plain,&lt;br /&gt;
		argHash = 0&lt;br /&gt;
	}&lt;br /&gt;
	local hasSubArgs = false&lt;br /&gt;
	local subgroups_and_num = prefix and {prefix} or cfg.arg.subgroups_and_num&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		k = tostring(k)&lt;br /&gt;
		for _, w in ipairs(subgroups_and_num) do&lt;br /&gt;
			w = string.format(w, listnum) .. &amp;quot;_&amp;quot;&lt;br /&gt;
			if (#k &amp;gt; #w) and (k:sub(1, #w) == w) then&lt;br /&gt;
				subArgs[k:sub(#w + 1)] = v&lt;br /&gt;
				hasSubArgs = true&lt;br /&gt;
				subArgs.argHash = subArgs.argHash + (v and #v or 0)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return hasSubArgs and p._navbox(subArgs) or listText&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Main functions&lt;br /&gt;
function p._navbox(args)&lt;br /&gt;
	if args.type == cfg.keyword.with_collapsible_groups then&lt;br /&gt;
		return p._withCollapsibleGroups(args)&lt;br /&gt;
	elseif args.type == cfg.keyword.with_columns then&lt;br /&gt;
		return p._withColumns(args)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function striped(wikitext, border)&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 = cfg.category.orphan&lt;br /&gt;
		if border == cfg.keyword.border_subgroup and args[cfg.arg.orphan] ~= cfg.keyword.orphan_yes 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 = cfg.class.navbox_odd_part, cfg.class.navbox_even_part&lt;br /&gt;
		if args[cfg.arg.evenodd] then&lt;br /&gt;
			if args[cfg.arg.evenodd] == cfg.keyword.evenodd_swap then&lt;br /&gt;
				first, second = second, first&lt;br /&gt;
			else&lt;br /&gt;
				first = args[cfg.arg.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 == &#039;0&#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(&#039;([%[%]])&#039;, &#039;%%%1&#039;)&lt;br /&gt;
		return (wikitext:gsub(regex, &#039;&#039;):gsub(cfg.marker.regex, changer)) -- () omits gsub count&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function processItem(item, nowrapitems)&lt;br /&gt;
		if item:sub(1, 2) == &#039;{|&#039; then&lt;br /&gt;
			-- Applying nowrap to lines in a table does not make sense.&lt;br /&gt;
			-- Add newlines to compensate for trim of x in |parm=x in a template.&lt;br /&gt;
			return &#039;\n&#039; .. item .. &#039;\n&#039;&lt;br /&gt;
		end&lt;br /&gt;
		if nowrapitems == cfg.keyword.nowrapitems_yes then&lt;br /&gt;
			local lines = {}&lt;br /&gt;
			for line in (item .. &#039;\n&#039;):gmatch(&#039;([^\n]*)\n&#039;) do&lt;br /&gt;
				local prefix, content = line:match(&#039;^([*:;#]+)%s*(.*)&#039;)&lt;br /&gt;
				if prefix and not content:match(cfg.pattern.nowrap) then&lt;br /&gt;
					line = string.format(cfg.nowrap_item, prefix, content)&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(lines, line)&lt;br /&gt;
			end&lt;br /&gt;
			item = table.concat(lines, &#039;\n&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if item:match(&#039;^[*:;#]&#039;) then&lt;br /&gt;
			return &#039;\n&#039; .. item .. &#039;\n&#039;&lt;br /&gt;
		end&lt;br /&gt;
		return item&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function has_navbar()&lt;br /&gt;
		return args[cfg.arg.navbar] ~= cfg.keyword.navbar_off&lt;br /&gt;
			and args[cfg.arg.navbar] ~= cfg.keyword.navbar_plain&lt;br /&gt;
			and (&lt;br /&gt;
				args[cfg.arg.name]&lt;br /&gt;
				or mw.getCurrentFrame():getParent():getTitle():gsub(cfg.pattern.sandbox, &#039;&#039;)&lt;br /&gt;
					~= cfg.pattern.navbox&lt;br /&gt;
			)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- extract text color from css, which is the only permitted inline CSS for the navbar&lt;br /&gt;
	local function extract_color(css_str)&lt;br /&gt;
		-- return nil because navbar takes its argument into mw.html which handles&lt;br /&gt;
		-- nil gracefully, removing the associated style attribute&lt;br /&gt;
		return mw.ustring.match(&#039;;&#039; .. css_str .. &#039;;&#039;, &#039;.*;%s*([Cc][Oo][Ll][Oo][Rr]%s*:%s*.-)%s*;&#039;) or nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function renderNavBar(titleCell)&lt;br /&gt;
		if has_navbar() then&lt;br /&gt;
			local navbar = require(&#039;Module:Navbar&#039;)._navbar&lt;br /&gt;
			titleCell:wikitext(navbar{&lt;br /&gt;
				[cfg.navbar.name] = args[cfg.arg.name],&lt;br /&gt;
				[cfg.navbar.mini] = 1,&lt;br /&gt;
				[cfg.navbar.fontstyle] = extract_color(&lt;br /&gt;
					(args[cfg.arg.basestyle] or &#039;&#039;) .. &#039;;&#039; .. (args[cfg.arg.titlestyle] or &#039;&#039;)&lt;br /&gt;
				)&lt;br /&gt;
			})&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function renderTitleRow(tbl)&lt;br /&gt;
		if not args[cfg.arg.title] then return end&lt;br /&gt;
&lt;br /&gt;
		local titleRow = tbl:tag(&#039;tr&#039;)&lt;br /&gt;
&lt;br /&gt;
		local titleCell = titleRow:tag(&#039;th&#039;):attr(&#039;scope&#039;, &#039;col&#039;)&lt;br /&gt;
&lt;br /&gt;
		local titleColspan = 2&lt;br /&gt;
		if args[cfg.arg.imageleft] then titleColspan = titleColspan + 1 end&lt;br /&gt;
		if args[cfg.arg.image] then titleColspan = titleColspan + 1 end&lt;br /&gt;
&lt;br /&gt;
		titleCell&lt;br /&gt;
			:cssText(args[cfg.arg.basestyle])&lt;br /&gt;
			:cssText(args[cfg.arg.titlestyle])&lt;br /&gt;
			:addClass(cfg.class.navbox_title)&lt;br /&gt;
			:attr(&#039;colspan&#039;, titleColspan)&lt;br /&gt;
&lt;br /&gt;
		renderNavBar(titleCell)&lt;br /&gt;
&lt;br /&gt;
		titleCell&lt;br /&gt;
			:tag(&#039;div&#039;)&lt;br /&gt;
				-- id for aria-labelledby attribute&lt;br /&gt;
				:attr(&#039;id&#039;, mw.uri.anchorEncode(args[cfg.arg.title]) .. args.argHash)&lt;br /&gt;
				:addClass(args[cfg.arg.titleclass])&lt;br /&gt;
				:css(&#039;font-size&#039;, &#039;114%&#039;)&lt;br /&gt;
				:css(&#039;margin&#039;, &#039;0 4em&#039;)&lt;br /&gt;
				:wikitext(processItem(args[cfg.arg.title]))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function getAboveBelowColspan()&lt;br /&gt;
		local ret = 2&lt;br /&gt;
		if args[cfg.arg.imageleft] then ret = ret + 1 end&lt;br /&gt;
		if args[cfg.arg.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)&lt;br /&gt;
		if not args[cfg.arg.above] then return end&lt;br /&gt;
&lt;br /&gt;
		tbl:tag(&#039;tr&#039;)&lt;br /&gt;
			:tag(&#039;td&#039;)&lt;br /&gt;
				:addClass(cfg.class.navbox_abovebelow)&lt;br /&gt;
				:addClass(args[cfg.arg.aboveclass])&lt;br /&gt;
				:cssText(args[cfg.arg.basestyle])&lt;br /&gt;
				:cssText(args[cfg.arg.abovestyle])&lt;br /&gt;
				:attr(&#039;colspan&#039;, getAboveBelowColspan())&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					-- id for aria-labelledby attribute, if no title&lt;br /&gt;
					:attr(&#039;id&#039;, (not args[cfg.arg.title]) and &lt;br /&gt;
						(mw.uri.anchorEncode(args[cfg.arg.above]) .. args.argHash)&lt;br /&gt;
						or nil)&lt;br /&gt;
					:wikitext(processItem(args[cfg.arg.above], args[cfg.arg.nowrapitems]))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function renderBelowRow(tbl)&lt;br /&gt;
		if not args[cfg.arg.below] then return end&lt;br /&gt;
&lt;br /&gt;
		tbl:tag(&#039;tr&#039;)&lt;br /&gt;
			:tag(&#039;td&#039;)&lt;br /&gt;
				:addClass(cfg.class.navbox_abovebelow)&lt;br /&gt;
				:addClass(args[cfg.arg.belowclass])&lt;br /&gt;
				:cssText(args[cfg.arg.basestyle])&lt;br /&gt;
				:cssText(args[cfg.arg.belowstyle])&lt;br /&gt;
				:attr(&#039;colspan&#039;, getAboveBelowColspan())&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:wikitext(processItem(args[cfg.arg.below], args[cfg.arg.nowrapitems]))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function renderListRow(tbl, index, listnum, listnums_size)&lt;br /&gt;
		local row = tbl:tag(&#039;tr&#039;)&lt;br /&gt;
&lt;br /&gt;
		if index == 1 and args[cfg.arg.imageleft] then&lt;br /&gt;
			row&lt;br /&gt;
				:tag(&#039;td&#039;)&lt;br /&gt;
					:addClass(cfg.class.noviewer)&lt;br /&gt;
					:addClass(cfg.class.navbox_image)&lt;br /&gt;
					:addClass(args[cfg.arg.imageclass])&lt;br /&gt;
					:css(&#039;width&#039;, &#039;1px&#039;)               -- Minimize width&lt;br /&gt;
					:css(&#039;padding&#039;, &#039;0 2px 0 0&#039;)&lt;br /&gt;
					:cssText(args[cfg.arg.imageleftstyle])&lt;br /&gt;
					:attr(&#039;rowspan&#039;, listnums_size)&lt;br /&gt;
					:tag(&#039;div&#039;)&lt;br /&gt;
						:wikitext(processItem(args[cfg.arg.imageleft]))&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local group_and_num = andnum(&#039;group&#039;, listnum)&lt;br /&gt;
		local groupstyle_and_num = andnum(&#039;groupstyle&#039;, listnum)&lt;br /&gt;
		if args[group_and_num] then&lt;br /&gt;
			local groupCell = row:tag(&#039;th&#039;)&lt;br /&gt;
&lt;br /&gt;
			-- id for aria-labelledby attribute, if lone group with no title or above&lt;br /&gt;
			if listnum == 1 and not (args[cfg.arg.title] or args[cfg.arg.above] or args[cfg.arg.group2]) then&lt;br /&gt;
				groupCell&lt;br /&gt;
					:attr(&#039;id&#039;, mw.uri.anchorEncode(args[cfg.arg.group1]) .. args.argHash)&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			groupCell&lt;br /&gt;
				:attr(&#039;scope&#039;, &#039;row&#039;)&lt;br /&gt;
				:addClass(cfg.class.navbox_group)&lt;br /&gt;
				:addClass(args[cfg.arg.groupclass])&lt;br /&gt;
				:cssText(args[cfg.arg.basestyle])&lt;br /&gt;
				-- If groupwidth not specified, minimize width&lt;br /&gt;
				:css(&#039;width&#039;, args[cfg.arg.groupwidth] or &#039;1%&#039;)&lt;br /&gt;
&lt;br /&gt;
			groupCell&lt;br /&gt;
				:cssText(args[cfg.arg.groupstyle])&lt;br /&gt;
				:cssText(args[groupstyle_and_num])&lt;br /&gt;
				:wikitext(args[group_and_num])&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local listCell = row:tag(&#039;td&#039;)&lt;br /&gt;
&lt;br /&gt;
		if args[group_and_num] then&lt;br /&gt;
			listCell&lt;br /&gt;
				:addClass(cfg.class.navbox_list_with_group)&lt;br /&gt;
		else&lt;br /&gt;
			listCell:attr(&#039;colspan&#039;, 2)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if not args[cfg.arg.groupwidth] then&lt;br /&gt;
			listCell:css(&#039;width&#039;, &#039;100%&#039;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local rowstyle  -- usually nil so cssText(rowstyle) usually adds nothing&lt;br /&gt;
		if index % 2 == 1 then&lt;br /&gt;
			rowstyle = args[cfg.arg.oddstyle]&lt;br /&gt;
		else&lt;br /&gt;
			rowstyle = args[cfg.arg.evenstyle]&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local list_and_num = andnum(&#039;list&#039;, listnum)&lt;br /&gt;
		local listText = inArray(cfg.keyword.subgroups, args[list_and_num])&lt;br /&gt;
			and getSubgroup(args, listnum, args[list_and_num]) or args[list_and_num]&lt;br /&gt;
&lt;br /&gt;
		local oddEven = cfg.marker.oddeven&lt;br /&gt;
		if listText:sub(1, 12) == &#039;&amp;lt;/div&amp;gt;&amp;lt;table&#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(cfg.pattern.navbox_title) and cfg.marker.restart or cfg.class.navbox_odd_part&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local liststyle_and_num = andnum(&#039;liststyle&#039;, listnum)&lt;br /&gt;
		local listclass_and_num = andnum(&#039;listclass&#039;, listnum)&lt;br /&gt;
		listCell&lt;br /&gt;
			:css(&#039;padding&#039;, &#039;0&#039;)&lt;br /&gt;
			:cssText(args[cfg.arg.liststyle])&lt;br /&gt;
			:cssText(rowstyle)&lt;br /&gt;
			:cssText(args[liststyle_and_num])&lt;br /&gt;
			:addClass(cfg.class.navbox_list)&lt;br /&gt;
			:addClass(cfg.class.navbox_part .. oddEven)&lt;br /&gt;
			:addClass(args[cfg.arg.listclass])&lt;br /&gt;
			:addClass(args[listclass_and_num])&lt;br /&gt;
			:tag(&#039;div&#039;)&lt;br /&gt;
				:css(&#039;padding&#039;,&lt;br /&gt;
					(index == 1 and args[cfg.arg.list1padding]) or args[cfg.arg.listpadding] or &#039;0 0.25em&#039;&lt;br /&gt;
				)&lt;br /&gt;
				:wikitext(processItem(listText, args[cfg.arg.nowrapitems]))&lt;br /&gt;
&lt;br /&gt;
		if index == 1 and args[cfg.arg.image] then&lt;br /&gt;
			row&lt;br /&gt;
				:tag(&#039;td&#039;)&lt;br /&gt;
					:addClass(cfg.class.noviewer)&lt;br /&gt;
					:addClass(cfg.class.navbox_image)&lt;br /&gt;
					:addClass(args[cfg.arg.imageclass])&lt;br /&gt;
					:css(&#039;width&#039;, &#039;1px&#039;)               -- Minimize width&lt;br /&gt;
					:css(&#039;padding&#039;, &#039;0 0 0 2px&#039;)&lt;br /&gt;
					:cssText(args[cfg.arg.imagestyle])&lt;br /&gt;
					:attr(&#039;rowspan&#039;, listnums_size)&lt;br /&gt;
					:tag(&#039;div&#039;)&lt;br /&gt;
						:wikitext(processItem(args[cfg.arg.image]))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function has_list_class(htmlclass)&lt;br /&gt;
		local patterns = {&lt;br /&gt;
			&#039;^&#039; .. htmlclass .. &#039;$&#039;,&lt;br /&gt;
			&#039;%s&#039; .. htmlclass .. &#039;$&#039;,&lt;br /&gt;
			&#039;^&#039; .. htmlclass .. &#039;%s&#039;,&lt;br /&gt;
			&#039;%s&#039; .. htmlclass .. &#039;%s&#039;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		for arg, _ in pairs(args) do&lt;br /&gt;
			if type(arg) == &#039;string&#039; and mw.ustring.find(arg, cfg.pattern.class) then&lt;br /&gt;
				for _, pattern in ipairs(patterns) do&lt;br /&gt;
					if mw.ustring.find(args[arg] or &#039;&#039;, pattern) then&lt;br /&gt;
						return true&lt;br /&gt;
					end&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;
	-- there are a lot of list classes in the wild, so we add their TemplateStyles&lt;br /&gt;
	local function add_list_styles()&lt;br /&gt;
		local frame = mw.getCurrentFrame()&lt;br /&gt;
		local function add_list_templatestyles(htmlclass, templatestyles)&lt;br /&gt;
			if has_list_class(htmlclass) then&lt;br /&gt;
				return frame:extensionTag{&lt;br /&gt;
					name = &#039;templatestyles&#039;, args = { src = templatestyles }&lt;br /&gt;
				}&lt;br /&gt;
			else&lt;br /&gt;
				return &#039;&#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local hlist_styles = add_list_templatestyles(&#039;hlist&#039;, cfg.hlist_templatestyles)&lt;br /&gt;
		local plainlist_styles = add_list_templatestyles(&#039;plainlist&#039;, cfg.plainlist_templatestyles)&lt;br /&gt;
&lt;br /&gt;
		-- a second workaround for [[phab:T303378]]&lt;br /&gt;
		-- when that issue is fixed, we can actually use has_navbar not to emit the&lt;br /&gt;
		-- tag here if we want&lt;br /&gt;
		if has_navbar() and hlist_styles == &#039;&#039; then&lt;br /&gt;
			hlist_styles = frame:extensionTag{&lt;br /&gt;
				name = &#039;templatestyles&#039;, args = { src = cfg.hlist_templatestyles }&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- hlist -&amp;gt; plainlist is best-effort to preserve old Common.css ordering.&lt;br /&gt;
		-- this ordering is not a guarantee because most navboxes will emit only&lt;br /&gt;
		-- one of these classes [hlist_note]&lt;br /&gt;
		return hlist_styles .. plainlist_styles&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function needsHorizontalLists(border)&lt;br /&gt;
		if border == cfg.keyword.border_subgroup or args[cfg.arg.tracking] == cfg.keyword.tracking_no then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
		return not has_list_class(cfg.pattern.hlist) and not has_list_class(cfg.pattern.plainlist)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function hasBackgroundColors()&lt;br /&gt;
		for _, key in ipairs({cfg.arg.titlestyle, cfg.arg.groupstyle,&lt;br /&gt;
			cfg.arg.basestyle, cfg.arg.abovestyle, cfg.arg.belowstyle}) do&lt;br /&gt;
			if tostring(args[key]):find(&#039;background&#039;, 1, true) 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 hasBorders()&lt;br /&gt;
		for _, key in ipairs({cfg.arg.groupstyle, cfg.arg.basestyle,&lt;br /&gt;
			cfg.arg.abovestyle, cfg.arg.belowstyle}) do&lt;br /&gt;
			if tostring(args[key]):find(&#039;border&#039;, 1, true) 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 isIllegible()&lt;br /&gt;
		local styleratio = require(&#039;Module:Color contrast&#039;)._styleratio&lt;br /&gt;
		for key, style in pairs(args) do&lt;br /&gt;
			if tostring(key):match(cfg.pattern.style) 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(border)&lt;br /&gt;
		local cats = {}&lt;br /&gt;
		if needsHorizontalLists(border) then table.insert(cats, cfg.category.horizontal_lists) end&lt;br /&gt;
		if hasBackgroundColors() then table.insert(cats, cfg.category.background_colors) end&lt;br /&gt;
		if isIllegible() then table.insert(cats, cfg.category.illegible) end&lt;br /&gt;
		if hasBorders() then table.insert(cats, cfg.category.borders) end&lt;br /&gt;
		return cats&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function renderTrackingCategories(builder, border)&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 == cfg.keyword.subpage_doc or subpage == cfg.keyword.subpage_sandbox&lt;br /&gt;
			or subpage == cfg.keyword.subpage_testcases then return end&lt;br /&gt;
&lt;br /&gt;
		for _, cat in ipairs(getTrackingCategories(border)) do&lt;br /&gt;
			builder:wikitext(&#039;[[Category:&#039; .. cat .. &#039;]]&#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function renderMainTable(border, listnums)&lt;br /&gt;
		local tbl = mw.html.create(&#039;table&#039;)&lt;br /&gt;
			:addClass(cfg.class.nowraplinks)&lt;br /&gt;
			:addClass(args[cfg.arg.bodyclass])&lt;br /&gt;
&lt;br /&gt;
		local state = args[cfg.arg.state]&lt;br /&gt;
		if args[cfg.arg.title] and state ~= cfg.keyword.state_plain and state ~= cfg.keyword.state_off then&lt;br /&gt;
			if state == cfg.keyword.state_collapsed then&lt;br /&gt;
				state = cfg.class.collapsed&lt;br /&gt;
			end&lt;br /&gt;
			tbl&lt;br /&gt;
				:addClass(cfg.class.collapsible)&lt;br /&gt;
				:addClass(state or cfg.class.autocollapse)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		tbl:css(&#039;border-spacing&#039;, 0)&lt;br /&gt;
		if border == cfg.keyword.border_subgroup or border == cfg.keyword.border_none then&lt;br /&gt;
			tbl&lt;br /&gt;
				:addClass(cfg.class.navbox_subgroup)&lt;br /&gt;
				:cssText(args[cfg.arg.bodystyle])&lt;br /&gt;
				:cssText(args[cfg.arg.style])&lt;br /&gt;
		else  -- regular navbox - bodystyle and style will be applied to the wrapper table&lt;br /&gt;
			tbl&lt;br /&gt;
				:addClass(cfg.class.navbox_inner)&lt;br /&gt;
				:css(&#039;background&#039;, &#039;transparent&#039;)&lt;br /&gt;
				:css(&#039;color&#039;, &#039;inherit&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		tbl:cssText(args[cfg.arg.innerstyle])&lt;br /&gt;
&lt;br /&gt;
		renderTitleRow(tbl)&lt;br /&gt;
		renderAboveRow(tbl)&lt;br /&gt;
		local listnums_size = #listnums&lt;br /&gt;
		for i, listnum in ipairs(listnums) do&lt;br /&gt;
			renderListRow(tbl, i, listnum, listnums_size)&lt;br /&gt;
		end&lt;br /&gt;
		renderBelowRow(tbl)&lt;br /&gt;
&lt;br /&gt;
		return tbl&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function add_navbox_styles(hiding_templatestyles)&lt;br /&gt;
		local frame = mw.getCurrentFrame()&lt;br /&gt;
		-- This is a lambda so that it doesn&#039;t need the frame as a parameter&lt;br /&gt;
		local function add_user_styles(templatestyles)&lt;br /&gt;
			if not isblank(templatestyles) then&lt;br /&gt;
				return frame:extensionTag{&lt;br /&gt;
					name = &#039;templatestyles&#039;, args = { src = templatestyles }&lt;br /&gt;
				}&lt;br /&gt;
			end&lt;br /&gt;
			return &#039;&#039;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- get templatestyles. load base from config so that Lua only needs to do&lt;br /&gt;
		-- the work once of parser tag expansion&lt;br /&gt;
		local base_templatestyles = cfg.templatestyles&lt;br /&gt;
		local templatestyles = add_user_styles(args[cfg.arg.templatestyles])&lt;br /&gt;
		local child_templatestyles = add_user_styles(args[cfg.arg.child_templatestyles])&lt;br /&gt;
&lt;br /&gt;
		-- The &#039;navbox-styles&#039; div exists to wrap the styles to work around T200206&lt;br /&gt;
		-- more elegantly. Instead of combinatorial rules, this ends up being linear&lt;br /&gt;
		-- number of CSS rules.&lt;br /&gt;
		return mw.html.create(&#039;div&#039;)&lt;br /&gt;
			:addClass(cfg.class.navbox_styles)&lt;br /&gt;
			:wikitext(&lt;br /&gt;
				add_list_styles() .. -- see [hlist_note] applied to &#039;before base_templatestyles&#039;&lt;br /&gt;
				base_templatestyles ..&lt;br /&gt;
				templatestyles ..&lt;br /&gt;
				child_templatestyles ..&lt;br /&gt;
				table.concat(hiding_templatestyles)&lt;br /&gt;
			)&lt;br /&gt;
			:done()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- work around [[phab:T303378]]&lt;br /&gt;
	-- for each arg: find all the templatestyles strip markers, insert them into a&lt;br /&gt;
	-- table. then remove all templatestyles markers from the arg&lt;br /&gt;
	local strip_marker_pattern = &#039;(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)&#039;&lt;br /&gt;
	local argHash = 0&lt;br /&gt;
	for k, arg in pairs(args) do&lt;br /&gt;
		if type(arg) == &#039;string&#039; then&lt;br /&gt;
			for marker in string.gfind(arg, strip_marker_pattern) do&lt;br /&gt;
				table.insert(hiding_templatestyles, marker)&lt;br /&gt;
			end&lt;br /&gt;
			argHash = argHash + #arg&lt;br /&gt;
			args[k] = string.gsub(arg, strip_marker_pattern, &#039;&#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not args.argHash then args.argHash = argHash end&lt;br /&gt;
&lt;br /&gt;
	local listnums = {}&lt;br /&gt;
&lt;br /&gt;
	for k, _ in pairs(args) do&lt;br /&gt;
		if type(k) == &#039;string&#039; then&lt;br /&gt;
			local listnum = k:match(cfg.pattern.listnum)&lt;br /&gt;
			if listnum and args[andnum(&#039;list&#039;, tonumber(listnum))] then&lt;br /&gt;
				table.insert(listnums, tonumber(listnum))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(listnums)&lt;br /&gt;
&lt;br /&gt;
	local border = mw.text.trim(args[cfg.arg.border] or args[1] or &#039;&#039;)&lt;br /&gt;
	if border == cfg.keyword.border_child then&lt;br /&gt;
		border = cfg.keyword.border_subgroup&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- render the main body of the navbox&lt;br /&gt;
	local tbl = renderMainTable(border, listnums)&lt;br /&gt;
&lt;br /&gt;
	local res = mw.html.create()&lt;br /&gt;
	-- render the appropriate wrapper for the navbox, based on the border param&lt;br /&gt;
&lt;br /&gt;
	if border == cfg.keyword.border_none then&lt;br /&gt;
		res:node(add_navbox_styles(hiding_templatestyles))&lt;br /&gt;
		local nav = res:tag(&#039;div&#039;)&lt;br /&gt;
			:attr(&#039;role&#039;, &#039;navigation&#039;)&lt;br /&gt;
			:node(tbl)&lt;br /&gt;
		-- aria-labelledby title, otherwise above, otherwise lone group&lt;br /&gt;
		if args[cfg.arg.title] or args[cfg.arg.above] or (args[cfg.arg.group1]&lt;br /&gt;
			and not args[cfg.arg.group2]) then&lt;br /&gt;
			nav:attr(&lt;br /&gt;
				&#039;aria-labelledby&#039;,&lt;br /&gt;
				mw.uri.anchorEncode(&lt;br /&gt;
					args[cfg.arg.title] or args[cfg.arg.above] or args[cfg.arg.group1]&lt;br /&gt;
				) .. args.argHash&lt;br /&gt;
			)&lt;br /&gt;
		else&lt;br /&gt;
			nav:attr(&#039;aria-label&#039;, cfg.aria_label .. args.argHash)&lt;br /&gt;
		end&lt;br /&gt;
	elseif border == cfg.keyword.border_subgroup then&lt;br /&gt;
		-- We assume that this navbox is being rendered in a list cell of a&lt;br /&gt;
		-- parent navbox, and is therefore inside a div with padding:0em 0.25em.&lt;br /&gt;
		-- We start with a &amp;lt;/div&amp;gt; to avoid the padding being applied, and at the&lt;br /&gt;
		-- end add a &amp;lt;div&amp;gt; to balance out the parent&#039;s &amp;lt;/div&amp;gt;&lt;br /&gt;
		res&lt;br /&gt;
			:wikitext(&#039;&amp;lt;/div&amp;gt;&#039;)&lt;br /&gt;
			:node(tbl)&lt;br /&gt;
			:wikitext(&#039;&amp;lt;div&amp;gt;&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		res:node(add_navbox_styles(hiding_templatestyles))&lt;br /&gt;
		local nav = res:tag(&#039;div&#039;)&lt;br /&gt;
			:attr(&#039;role&#039;, &#039;navigation&#039;)&lt;br /&gt;
			:addClass(cfg.class.navbox)&lt;br /&gt;
			:addClass(args[cfg.arg.navboxclass])&lt;br /&gt;
			:cssText(args[cfg.arg.bodystyle])&lt;br /&gt;
			:cssText(args[cfg.arg.style])&lt;br /&gt;
			:css(&#039;padding&#039;, &#039;3px&#039;)&lt;br /&gt;
			:node(tbl)&lt;br /&gt;
		-- aria-labelledby title, otherwise above, otherwise lone group&lt;br /&gt;
		if args[cfg.arg.title] or args[cfg.arg.above]&lt;br /&gt;
			or (args[cfg.arg.group1] and not args[cfg.arg.group2]) then&lt;br /&gt;
			nav:attr(&lt;br /&gt;
				&#039;aria-labelledby&#039;,&lt;br /&gt;
				mw.uri.anchorEncode(&lt;br /&gt;
					args[cfg.arg.title] or args[cfg.arg.above] or args[cfg.arg.group1]&lt;br /&gt;
				) .. args.argHash&lt;br /&gt;
			)&lt;br /&gt;
		else&lt;br /&gt;
			nav:attr(&#039;aria-label&#039;, cfg.aria_label .. args.argHash)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if (args[cfg.arg.nocat] or cfg.keyword.nocat_false):lower() == cfg.keyword.nocat_false then&lt;br /&gt;
		renderTrackingCategories(res, border)&lt;br /&gt;
	end&lt;br /&gt;
	return striped(tostring(res), border)&lt;br /&gt;
end --p._navbox&lt;br /&gt;
&lt;br /&gt;
function p._withCollapsibleGroups(pargs)&lt;br /&gt;
	-- table for args passed to navbox&lt;br /&gt;
	local targs = {}&lt;br /&gt;
&lt;br /&gt;
	-- process args&lt;br /&gt;
	local passthroughLocal = {&lt;br /&gt;
		[cfg.arg.bodystyle] = true,&lt;br /&gt;
		[cfg.arg.border] = true,&lt;br /&gt;
		[cfg.arg.style] = true,&lt;br /&gt;
	}&lt;br /&gt;
	for k,v in pairs(pargs) do&lt;br /&gt;
		if k and type(k) == &#039;string&#039; then&lt;br /&gt;
			if passthrough[k] or passthroughLocal[k] then&lt;br /&gt;
				targs[k] = v&lt;br /&gt;
			elseif (k:match(cfg.pattern.num)) then&lt;br /&gt;
				local n = k:match(cfg.pattern.num)&lt;br /&gt;
				local list_and_num = andnum(&#039;list&#039;, n)&lt;br /&gt;
				if ((k:match(cfg.pattern.listnum) or k:match(cfg.pattern.contentnum))&lt;br /&gt;
						and targs[list_and_num] == nil&lt;br /&gt;
						and pargs[andnum(&#039;group&#039;, n)] == nil&lt;br /&gt;
						and pargs[andnum(&#039;sect&#039;, n)] == nil&lt;br /&gt;
						and pargs[andnum(&#039;section&#039;, n)] == nil) then&lt;br /&gt;
					targs[list_and_num] = concatstrings({&lt;br /&gt;
						pargs[list_and_num] or &#039;&#039;,&lt;br /&gt;
						pargs[andnum(&#039;content&#039;, n)] or &#039;&#039;&lt;br /&gt;
					})&lt;br /&gt;
					if (targs[list_and_num] and inArray(cfg.keyword.subgroups, targs[list_and_num])) then&lt;br /&gt;
						targs[list_and_num] = getSubgroup(pargs, n, targs[list_and_num])&lt;br /&gt;
					end&lt;br /&gt;
				elseif ((k:match(cfg.pattern.groupnum) or k:match(cfg.pattern.sectnum) or k:match(cfg.pattern.sectionnum))&lt;br /&gt;
						and targs[list_and_num] == nil) then&lt;br /&gt;
					local titlestyle = concatstyles({&lt;br /&gt;
						pargs[cfg.arg.groupstyle] or &#039;&#039;,&lt;br /&gt;
						pargs[cfg.arg.secttitlestyle] or &#039;&#039;, &lt;br /&gt;
						pargs[andnum(&#039;groupstyle&#039;, n)] or &#039;&#039;, &lt;br /&gt;
						pargs[andnum(&#039;sectiontitlestyle&#039;, n)] or &#039;&#039;&lt;br /&gt;
					})&lt;br /&gt;
					local liststyle = concatstyles({&lt;br /&gt;
						pargs[cfg.arg.liststyle] or &#039;&#039;,&lt;br /&gt;
						pargs[cfg.arg.contentstyle] or &#039;&#039;, &lt;br /&gt;
						pargs[andnum(&#039;liststyle&#039;, n)] or &#039;&#039;, &lt;br /&gt;
						pargs[andnum(&#039;contentstyle&#039;, n)] or &#039;&#039;&lt;br /&gt;
					})&lt;br /&gt;
					local title = concatstrings({&lt;br /&gt;
						pargs[andnum(&#039;group&#039;, n)] or &#039;&#039;,&lt;br /&gt;
						pargs[andnum(&#039;sect&#039;, n)] or &#039;&#039;,&lt;br /&gt;
						pargs[andnum(&#039;section&#039;, n)] or &#039;&#039;&lt;br /&gt;
					})&lt;br /&gt;
					local list = concatstrings({&lt;br /&gt;
						pargs[list_and_num] or &#039;&#039;, &lt;br /&gt;
						pargs[andnum(&#039;content&#039;, n)] or &#039;&#039;&lt;br /&gt;
					})&lt;br /&gt;
					if list and inArray(cfg.keyword.subgroups, list) then&lt;br /&gt;
						list = getSubgroup(pargs, n, list)&lt;br /&gt;
					end&lt;br /&gt;
					local abbr_and_num = andnum(&#039;abbr&#039;, n)&lt;br /&gt;
					local state = (pargs[abbr_and_num] and pargs[abbr_and_num] == pargs[cfg.arg.selected]) &lt;br /&gt;
						and cfg.keyword.state_uncollapsed&lt;br /&gt;
						or (pargs[andnum(&#039;state&#039;, n)] or cfg.keyword.state_collapsed)&lt;br /&gt;
					&lt;br /&gt;
					targs[list_and_num] =p._navbox({&lt;br /&gt;
						cfg.keyword.border_child,&lt;br /&gt;
						[cfg.arg.navbar] = cfg.keyword.navbar_plain,&lt;br /&gt;
						[cfg.arg.state] = state,&lt;br /&gt;
						[cfg.arg.basestyle] = pargs[cfg.arg.basestyle],&lt;br /&gt;
						[cfg.arg.title] = title,&lt;br /&gt;
						[cfg.arg.titlestyle] = titlestyle,&lt;br /&gt;
						[andnum(&#039;list&#039;, 1)] = list,&lt;br /&gt;
						[cfg.arg.liststyle] = liststyle,&lt;br /&gt;
						[cfg.arg.listclass] = pargs[andnum(&#039;listclass&#039;, n)],&lt;br /&gt;
						[cfg.arg.image] = pargs[andnum(&#039;image&#039;, n)],&lt;br /&gt;
						[cfg.arg.imageleft] = pargs[andnum(&#039;imageleft&#039;, n)],&lt;br /&gt;
						[cfg.arg.listpadding] = pargs[cfg.arg.listpadding],&lt;br /&gt;
						argHash = pargs.argHash&lt;br /&gt;
					})&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- ordering of style and bodystyle&lt;br /&gt;
	targs[cfg.arg.style] = concatstyles({targs[cfg.arg.style] or &#039;&#039;, targs[cfg.arg.bodystyle] or &#039;&#039;})&lt;br /&gt;
	targs[cfg.arg.bodystyle] = nil&lt;br /&gt;
&lt;br /&gt;
	-- child or subgroup&lt;br /&gt;
	if targs[cfg.arg.border] == nil then targs[cfg.arg.border] = pargs[1] end&lt;br /&gt;
&lt;br /&gt;
	return p._navbox(targs)&lt;br /&gt;
end --p._withCollapsibleGroups&lt;br /&gt;
&lt;br /&gt;
function p._withColumns(pargs)&lt;br /&gt;
	-- table for args passed to navbox&lt;br /&gt;
	local targs = {}&lt;br /&gt;
&lt;br /&gt;
	-- tables of column numbers&lt;br /&gt;
	local colheadernums = {}&lt;br /&gt;
	local colnums = {}&lt;br /&gt;
	local colfooternums = {}&lt;br /&gt;
&lt;br /&gt;
	-- process args&lt;br /&gt;
	local passthroughLocal = {&lt;br /&gt;
		[cfg.arg.evenstyle]=true,&lt;br /&gt;
		[cfg.arg.groupstyle]=true,&lt;br /&gt;
		[cfg.arg.liststyle]=true,&lt;br /&gt;
		[cfg.arg.oddstyle]=true,&lt;br /&gt;
		[cfg.arg.state]=true,&lt;br /&gt;
	}&lt;br /&gt;
	for k,v in pairs(pargs) do&lt;br /&gt;
		if passthrough[k] or passthroughLocal[k] then&lt;br /&gt;
			targs[k] = v&lt;br /&gt;
		elseif type(k) == &#039;string&#039; then&lt;br /&gt;
			if k:match(cfg.pattern.listnum) then&lt;br /&gt;
				local n = k:match(cfg.pattern.listnum)&lt;br /&gt;
				targs[andnum(&#039;liststyle&#039;, n + 2)] = pargs[andnum(&#039;liststyle&#039;, n)]&lt;br /&gt;
				targs[andnum(&#039;group&#039;, n + 2)] = pargs[andnum(&#039;group&#039;, n)]&lt;br /&gt;
				targs[andnum(&#039;groupstyle&#039;, n + 2)] = pargs[andnum(&#039;groupstyle&#039;, n)]&lt;br /&gt;
				if v and inArray(cfg.keyword.subgroups, v) then&lt;br /&gt;
					targs[andnum(&#039;list&#039;, n + 2)] = getSubgroup(pargs, n, v)&lt;br /&gt;
				else&lt;br /&gt;
					targs[andnum(&#039;list&#039;, n + 2)] = v&lt;br /&gt;
				end&lt;br /&gt;
			elseif (k:match(cfg.pattern.colheadernum) and v ~= &#039;&#039;) then&lt;br /&gt;
				table.insert(colheadernums, tonumber(k:match(cfg.pattern.colheadernum)))&lt;br /&gt;
			elseif (k:match(cfg.pattern.colnum) and v ~= &#039;&#039;) then&lt;br /&gt;
				table.insert(colnums, tonumber(k:match(cfg.pattern.colnum)))&lt;br /&gt;
			elseif (k:match(cfg.pattern.colfooternum) and v ~= &#039;&#039;) then&lt;br /&gt;
				table.insert(colfooternums, tonumber(k:match(cfg.pattern.colfooternum)))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(colheadernums)&lt;br /&gt;
	table.sort(colnums)&lt;br /&gt;
	table.sort(colfooternums)&lt;br /&gt;
&lt;br /&gt;
	-- HTML table for list1&lt;br /&gt;
	local coltable = mw.html.create( &#039;table&#039; ):addClass(&#039;navbox-columns-table&#039;)&lt;br /&gt;
	local row, col&lt;br /&gt;
&lt;br /&gt;
	local tablestyle = ( (#colheadernums &amp;gt; 0) or (not isblank(pargs[cfg.arg.fullwidth])) )&lt;br /&gt;
		and &#039;width:100%&#039;&lt;br /&gt;
		or &#039;width:auto; margin-left:auto; margin-right:auto&#039;&lt;br /&gt;
&lt;br /&gt;
	coltable:cssText(concatstyles({&lt;br /&gt;
		&#039;border-spacing: 0px; text-align:left&#039;,&lt;br /&gt;
		tablestyle,&lt;br /&gt;
		pargs[cfg.arg.coltablestyle] or &#039;&#039;&lt;br /&gt;
	}))&lt;br /&gt;
&lt;br /&gt;
	--- Header row ---&lt;br /&gt;
	if (#colheadernums &amp;gt; 0) then&lt;br /&gt;
		row = coltable:tag(&#039;tr&#039;)&lt;br /&gt;
		for k, n in ipairs(colheadernums) do&lt;br /&gt;
			col = row:tag(&#039;th&#039;):addClass(&#039;navbox-abovebelow&#039;)&lt;br /&gt;
			col:cssText(concatstyles({&lt;br /&gt;
				(k &amp;gt; 1) and &#039;border-left:2px solid #fdfdfd&#039; or &#039;&#039;,&lt;br /&gt;
				&#039;font-weight:bold&#039;,&lt;br /&gt;
				pargs[cfg.arg.colheaderstyle] or &#039;&#039;,&lt;br /&gt;
				pargs[andnum(&#039;colheaderstyle&#039;, n)] or &#039;&#039;&lt;br /&gt;
			}))&lt;br /&gt;
			col:attr(&#039;colspan&#039;, tonumber(pargs[andnum(&#039;colheadercolspan&#039;, n)]))&lt;br /&gt;
			col:wikitext(pargs[andnum(&#039;colheader&#039;, n)])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--- Main columns ---&lt;br /&gt;
	row = coltable:tag(&#039;tr&#039;):css(&#039;vertical-align&#039;, &#039;top&#039;)&lt;br /&gt;
	for k, n in ipairs(colnums) do&lt;br /&gt;
		if k == 1 and isblank(pargs[andnum(&#039;colheader&#039;, 1)])&lt;br /&gt;
				and isblank(pargs[andnum(&#039;colfooter&#039;, 1)])&lt;br /&gt;
				and isblank(pargs[cfg.arg.fullwidth]) then&lt;br /&gt;
			local nopad = inArray(&lt;br /&gt;
				{&#039;off&#039;, &#039;0&#039;, &#039;0em&#039;, &#039;0px&#039;},&lt;br /&gt;
				mw.ustring.gsub(pargs[cfg.arg.padding] or &#039;&#039;, &#039;[;%%]&#039;, &#039;&#039;))&lt;br /&gt;
			if not nopad then&lt;br /&gt;
				row:tag(&#039;td&#039;):wikitext(&#039;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&#039;)&lt;br /&gt;
					:css(&#039;width&#039;, (pargs[cfg.arg.padding] or &#039;5em&#039;))&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		col = row:tag(&#039;td&#039;):addClass(&#039;navbox-list&#039;)&lt;br /&gt;
		col:cssText(concatstyles({&lt;br /&gt;
			(k &amp;gt; 1) and &#039;border-left:2px solid #fdfdfd&#039; or &#039;&#039;,&lt;br /&gt;
			&#039;padding:0px&#039;,&lt;br /&gt;
			pargs[cfg.arg.colstyle] or &#039;&#039;,&lt;br /&gt;
			((n%2 == 0) and pargs[cfg.arg.evencolstyle] or pargs[cfg.arg.oddcolstyle]) or &#039;&#039;,&lt;br /&gt;
			pargs[andnum(&#039;colstyle&#039;, n)] or &#039;&#039;,&lt;br /&gt;
			&#039;width:&#039; .. (pargs[andnum(&#039;colwidth&#039;, n)] or pargs[cfg.arg.colwidth] or &#039;10em&#039;)&lt;br /&gt;
		}))&lt;br /&gt;
		local wt = pargs[andnum(&#039;col&#039;, n)]&lt;br /&gt;
		if wt and inArray(cfg.keyword.subgroups, wt) then&lt;br /&gt;
			wt = getSubgroup(pargs, n, wt, cfg.arg.col_and_num)&lt;br /&gt;
		end&lt;br /&gt;
		col:tag(&#039;div&#039;):newline():wikitext(wt):newline()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--- Footer row ---&lt;br /&gt;
	if (#colfooternums &amp;gt; 0) then&lt;br /&gt;
		row = coltable:tag(&#039;tr&#039;)&lt;br /&gt;
		for k, n in ipairs(colfooternums) do&lt;br /&gt;
			col = row:tag(&#039;td&#039;):addClass(&#039;navbox-abovebelow&#039;)&lt;br /&gt;
			col:cssText(concatstyles({&lt;br /&gt;
				(k &amp;gt; 1) and &#039;border-left:2px solid #fdfdfd&#039; or &#039;&#039;,&lt;br /&gt;
				&#039;font-weight:bold&#039;,&lt;br /&gt;
				pargs[cfg.arg.colfooterstyle] or &#039;&#039;,&lt;br /&gt;
				pargs[andnum(&#039;colfooterstyle&#039;, n)] or &#039;&#039;&lt;br /&gt;
			}))&lt;br /&gt;
			col:attr(&#039;colspan&#039;, tonumber(pargs[andnum(&#039;colfootercolspan&#039;, n)]))&lt;br /&gt;
			col:wikitext(pargs[andnum(&#039;colfooter&#039;, n)])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- assign table to list1&lt;br /&gt;
	targs[andnum(&#039;list&#039;, 1)] = tostring(coltable)&lt;br /&gt;
	if isblank(pargs[andnum(&#039;colheader&#039;, 1)]) &lt;br /&gt;
			and isblank(pargs[andnum(&#039;col&#039;, 1)])&lt;br /&gt;
			and isblank(pargs[andnum(&#039;colfooter&#039;, 1)]) then&lt;br /&gt;
		targs[andnum(&#039;list&#039;, 1)] = targs[andnum(&#039;list&#039;, 1)] ..&lt;br /&gt;
			cfg.category.without_first_col&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Other parameters&lt;br /&gt;
	targs[cfg.arg.border] = pargs[cfg.arg.border] or pargs[1]&lt;br /&gt;
	targs[cfg.arg.evenodd] = (not isblank(pargs[cfg.arg.evenodd])) and pargs[cfg.arg.evenodd] or nil&lt;br /&gt;
	targs[cfg.arg.list1padding] = &#039;0px&#039;&lt;br /&gt;
	targs[andnum(&#039;liststyle&#039;, 1)] = &#039;background:transparent;color:inherit;&#039;&lt;br /&gt;
	targs[cfg.arg.style] = concatstyles({pargs[cfg.arg.style], pargs[cfg.arg.bodystyle]})&lt;br /&gt;
	targs[cfg.arg.tracking] = &#039;no&#039;&lt;br /&gt;
	&lt;br /&gt;
	return p._navbox(targs)&lt;br /&gt;
end --p._withColumns&lt;br /&gt;
&lt;br /&gt;
-- Template entry points&lt;br /&gt;
function p.navbox (frame, boxtype)&lt;br /&gt;
	local function readArgs(args, prefix)&lt;br /&gt;
		local function readSubgroups(element, i)&lt;br /&gt;
			if inArray(cfg.keyword.subgroups, args[prefix .. andnum(element, i)]) then&lt;br /&gt;
				for _, v in ipairs(cfg.arg.subgroups_and_num) do&lt;br /&gt;
					readArgs(args, prefix .. string.format(v, i) .. &amp;quot;_&amp;quot;)&lt;br /&gt;
				end&lt;br /&gt;
				readArgs(args, prefix .. andnum(&#039;col&#039;, i) .. &amp;quot;_&amp;quot;)&lt;br /&gt;
			end&lt;br /&gt;
		end	&lt;br /&gt;
		-- Read the arguments in the order they&#039;ll be output in, to make references&lt;br /&gt;
		-- number in the right order.&lt;br /&gt;
		local _&lt;br /&gt;
		_ = args[prefix .. cfg.arg.title]&lt;br /&gt;
		_ = args[prefix .. cfg.arg.above]&lt;br /&gt;
		-- Limit this to 20 as covering &#039;most&#039; cases (that&#039;s a SWAG) and because&lt;br /&gt;
		-- iterator approach won&#039;t work here&lt;br /&gt;
		local boxtype = args.type or cfg.keyword[boxtype]&lt;br /&gt;
		if boxtype == cfg.keyword.with_columns then&lt;br /&gt;
			for i = 1, 20 do&lt;br /&gt;
				_ = args[prefix .. andnum(&#039;colheader&#039;, i)]&lt;br /&gt;
			end		&lt;br /&gt;
			for i = 1, 20 do&lt;br /&gt;
				readSubgroups(&#039;col&#039;, i)&lt;br /&gt;
			end		&lt;br /&gt;
			for i = 1, 20 do&lt;br /&gt;
				_ = args[prefix .. andnum(&#039;colfooter&#039;, i)]&lt;br /&gt;
			end		&lt;br /&gt;
		end&lt;br /&gt;
		for i = 1, 20 do&lt;br /&gt;
			_ = args[prefix .. andnum(&#039;group&#039;, i)]&lt;br /&gt;
			readSubgroups(&#039;list&#039;, i)&lt;br /&gt;
		end&lt;br /&gt;
		_ = args[prefix .. cfg.arg.below]&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not getArgs then&lt;br /&gt;
		getArgs = require(&#039;Module:Arguments&#039;).getArgs&lt;br /&gt;
	end&lt;br /&gt;
	local args = getArgs(frame, {wrappers = {cfg.pattern[boxtype or &#039;navbox&#039;]}})&lt;br /&gt;
	readArgs(args, &amp;quot;&amp;quot;)&lt;br /&gt;
	args.argHash = nil -- we shouldn&#039;t accept argHash passed from a template&lt;br /&gt;
	args.type = args.type or cfg.keyword[boxtype]&lt;br /&gt;
	return p[&#039;_navbox&#039;](args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[cfg.keyword.with_collapsible_groups] = function (frame)&lt;br /&gt;
	return p.navbox(frame, &#039;with_collapsible_groups&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[cfg.keyword.with_columns] = function (frame)&lt;br /&gt;
	return p.navbox(frame, &#039;with_columns&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Test&amp;diff=517</id>
		<title>Модуль:Test</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Test&amp;diff=517"/>
		<updated>2026-01-20T03:04:21Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Новая страница: «local p = {}  function p.hello()     return &amp;quot;Hello from Lua!&amp;quot; end  return p»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.hello()&lt;br /&gt;
    return &amp;quot;Hello from Lua!&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%91%D0%BB%D0%BE%D0%BA_%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%92%D0%B5%D0%B1%D0%9B%D0%98%D0%9C%D0%A1_%C2%AB%D0%A2%D1%80%D0%B8%D1%82%D0%B5%D1%8F%C2%BB&amp;diff=516</id>
		<title>Шаблон:Блок документов ВебЛИМС «Тритея»</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD:%D0%91%D0%BB%D0%BE%D0%BA_%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2_%D0%92%D0%B5%D0%B1%D0%9B%D0%98%D0%9C%D0%A1_%C2%AB%D0%A2%D1%80%D0%B8%D1%82%D0%B5%D1%8F%C2%BB&amp;diff=516"/>
		<updated>2026-01-20T01:29:55Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Новая страница: «{{Навигационная таблица |имя = Блок документов ВебЛИМС «Тритея» |state = &amp;lt;includeonly&amp;gt;{{{state|autocollapse}}}&amp;lt;/includeonly&amp;gt; |заголовок = Блок документов ВебЛИМС «Тритея» |класс_тела = hlist hlist-items-nowrap  |группа1 = Дизайнер&amp;lt;br&amp;gt;документов |список1 = child   | 1_группа1 = Контролы   | 1_список1 =      * ...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Навигационная таблица&lt;br /&gt;
|имя = Блок документов ВебЛИМС «Тритея»&lt;br /&gt;
|state = &amp;lt;includeonly&amp;gt;{{{state|autocollapse}}}&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
|заголовок = Блок документов ВебЛИМС «Тритея»&lt;br /&gt;
|класс_тела = hlist hlist-items-nowrap&lt;br /&gt;
&lt;br /&gt;
|группа1 = Дизайнер&amp;lt;br&amp;gt;документов&lt;br /&gt;
|список1 = child&lt;br /&gt;
  | 1_группа1 = Контролы&lt;br /&gt;
  | 1_список1 = &lt;br /&gt;
    * [[Оформление страницы|Оформление страницы]]&lt;br /&gt;
    * [[Текстовое поле|Текстовое поле]]&lt;br /&gt;
    * [[Форматированный текст|Форматированный текст]]&lt;br /&gt;
    * [[Таблица|Таблица]]&lt;br /&gt;
    * [[Табликс|Табликс]]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D1%8B%D1%85_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%BE%D0%B2&amp;diff=302</id>
		<title>Описание готовых шаблонов</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D1%8B%D1%85_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%BE%D0%B2&amp;diff=302"/>
		<updated>2025-12-26T04:52:03Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: &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;
#[[Информация по спискам показателей объектов и нормативов]]&lt;br /&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;
===Формулы===&lt;br /&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;
#[[Список мест выбранного типа]]&lt;br /&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;
&lt;br /&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;
#[[Графическое изображение результатов]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Внутренняя документация]]&lt;br /&gt;
[[Category:Тритея]]&lt;br /&gt;
[[Category:Дизайнер_документов]]&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B&amp;diff=301</id>
		<title>Параметры</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9F%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B&amp;diff=301"/>
		<updated>2025-12-26T04:51:50Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: &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;
*добавить еще один [[Набор_данных|&amp;lt;code&amp;gt;DataSet&amp;lt;/code&amp;gt;]] (п. 1.4, рис. 1.5-1.10), например, &amp;lt;code&amp;gt;FilterLaboratory&amp;lt;/code&amp;gt;;&lt;br /&gt;
*в качестве SQL-запроса в поле &amp;lt;code&amp;gt;Query&amp;lt;/code&amp;gt; набора данных &amp;lt;code&amp;gt;FilterLaboratory&amp;lt;/code&amp;gt; можно использовать SQL-запрос из набора данных &amp;lt;code&amp;gt;MainDataSet&amp;lt;/code&amp;gt; или, по возможности, его упрощенный вариант (исключение неиспользуемых полей и соединений таблиц);&lt;br /&gt;
*добавить параметр в дереве отчета (рис. 5.1);&lt;br /&gt;
[[Файл:Parameter.png|center]]&lt;br /&gt;
*в открывшемся окне на вкладке &amp;lt;code&amp;gt;General&amp;lt;/code&amp;gt; (рис. 5.2) &lt;br /&gt;
**в поле &amp;lt;code&amp;gt;Name&amp;lt;/code&amp;gt; ввести название параметра, например, &amp;lt;code&amp;gt;ReportParameterLaboratory&amp;lt;/code&amp;gt; (по умолчанию –  &amp;lt;code&amp;gt;ReportParameter1&amp;lt;/code&amp;gt;);&lt;br /&gt;
**в поле &amp;lt;code&amp;gt;Text for prompting users for a value:&amp;lt;/code&amp;gt; ввести текст-приглашение для выбора значения пользователем, например, «Выберите лабораторию:» (по умолчанию – &amp;lt;code&amp;gt;ReportParameter1&amp;lt;/code&amp;gt;);&lt;br /&gt;
[[Файл:Parameter2.png|center|thumb]]&lt;br /&gt;
*в открывшемся окне на вкладке &amp;lt;code&amp;gt;General&amp;lt;/code&amp;gt; (рис. 5.3) &lt;br /&gt;
**установить переключатель в значение &amp;lt;code&amp;gt;From query&amp;lt;/code&amp;gt; (по умолчанию – &amp;lt;code&amp;gt;Non-queried&amp;lt;/code&amp;gt;);&lt;br /&gt;
**в поле &amp;lt;code&amp;gt;Dataset:&amp;lt;/code&amp;gt; выбрать используемый набор данных &amp;lt;code&amp;gt;FilterLaboratory&amp;lt;/code&amp;gt;;&lt;br /&gt;
**в полях &amp;lt;code&amp;gt;Value field:&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;Label field:&amp;lt;/code&amp;gt; установить необходимое поле из набора данных (например, &amp;lt;code&amp;gt;lab_name&amp;lt;/code&amp;gt;);&lt;br /&gt;
**в поле &amp;lt;code&amp;gt;Condition:&amp;lt;/code&amp;gt; установить значение &amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;Label&amp;lt;/code&amp;gt; (если в полях &amp;lt;code&amp;gt;Value field:&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;Label field:&amp;lt;/code&amp;gt; указано одно и то же значение, то любой вариант);&lt;br /&gt;
**в поле &amp;lt;code&amp;gt;Direction:&amp;lt;/code&amp;gt; указать желаемый вариант сортировки (&amp;lt;code&amp;gt;Ascending&amp;lt;/code&amp;gt; – по возрастанию, &amp;lt;code&amp;gt;Descending&amp;lt;/code&amp;gt; – по убыванию); &lt;br /&gt;
**нажать &amp;lt;code&amp;gt;OK&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[Файл:Parameter3.png|center|thumb]]&lt;br /&gt;
&lt;br /&gt;
==Подключение параметра к таблице==&lt;br /&gt;
*выделить таблицу на основном поле конструктора или в дереве;&lt;br /&gt;
*нажать на кнопку диалогового окна свойств &amp;lt;code&amp;gt;Property dialog…&amp;lt;/code&amp;gt;;&lt;br /&gt;
*в открывшемся окне в левом столбце перейти на вкладку &amp;lt;code&amp;gt;Table - Filters&amp;lt;/code&amp;gt; и нажать на кнопку &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt; (рис. 5.4);&lt;br /&gt;
[[Файл:Parameter4.png|center|thumb]]&lt;br /&gt;
*в результате появится «пустой» параметр, не имеющий свойств;&lt;br /&gt;
*для добавления свойств нажать на стрелку поля &amp;lt;code&amp;gt;Expression&amp;lt;/code&amp;gt; и в раскрывшемся списке выбрать поле из &amp;lt;code&amp;gt;DataSet&amp;lt;/code&amp;gt; (например, &amp;lt;code&amp;gt;=Fields!lab_name.Value&amp;lt;/code&amp;gt;), по которому будет проводиться группировка (рис. 5.5);&lt;br /&gt;
[[Файл:Parameter5.png|center|thumb]]&lt;br /&gt;
*в поле &amp;lt;code&amp;gt;Operator:&amp;lt;/code&amp;gt; выбрать оператор &amp;lt;code&amp;gt;Equal&amp;lt;/code&amp;gt; (рис. 5.6);&lt;br /&gt;
[[Файл:Parameter6.png|center|thumb]]&lt;br /&gt;
*в разделе &amp;lt;code&amp;gt;Values&amp;lt;/code&amp;gt; в поле &amp;lt;code&amp;gt;Expression&amp;lt;/code&amp;gt; нажать стрелку меню и выбрать из списка значение &amp;lt;code&amp;gt;Expression…&amp;lt;/code&amp;gt; (рис. 5.6);&lt;br /&gt;
*в открывшемся окне &amp;lt;code&amp;gt;Expression Editor&amp;lt;/code&amp;gt; в левой части окна в области &amp;lt;code&amp;gt;Fields:&amp;lt;/code&amp;gt; раскрыть группу &amp;lt;code&amp;gt;Parameters&amp;lt;/code&amp;gt; и выбрать пункт &amp;lt;code&amp;gt;ReportParameterLaboratory&amp;lt;/code&amp;gt; (рис. 5.7);&lt;br /&gt;
[[Файл:Parameter7.png|center|thumb]]&lt;br /&gt;
*двойным кликом или кнопкой &amp;lt;code&amp;gt;Append&amp;lt;/code&amp;gt; добавить пункт &amp;lt;code&amp;gt;ReportParameterLaboratory&amp;lt;/code&amp;gt; в область &amp;lt;code&amp;gt;Expression:&amp;lt;/code&amp;gt;;&lt;br /&gt;
*нажать кнопку &amp;lt;code&amp;gt;ОК&amp;lt;/code&amp;gt; в окне &amp;lt;code&amp;gt;Expression Editor&amp;lt;/code&amp;gt;; &lt;br /&gt;
*нажать кнопку &amp;lt;code&amp;gt;ОК&amp;lt;/code&amp;gt; в окне &amp;lt;code&amp;gt;Table - Filters&amp;lt;/code&amp;gt;;&lt;br /&gt;
*при формировании отчета перед выводом документа на экран появится колонка с параметром в качестве параметра (рис. 5.8).&lt;br /&gt;
[[Файл:Parameter8.png|center]]&lt;br /&gt;
&lt;br /&gt;
==Создание каскадного параметра==&lt;br /&gt;
Если список значений параметра зависит от значения другого параметра, отчёт собирает необходимое значение параметра и использует его для создания списка значений для второго параметра.&lt;br /&gt;
Такой каскад значений параметров иногда называют зависимыми, связанными или иерархическими параметрами.&lt;br /&gt;
Чтобы создать каскадные параметры на странице или в отчёте, выполните следующие действия:&lt;br /&gt;
*для создания каскадного параметра на первом этапе создается [[простой параметр]]&lt;br /&gt;
**создаем новый набор данных &amp;lt;code&amp;gt;FilterFio&amp;lt;/code&amp;gt; с таким же или более коротким SQL-запросом;&lt;br /&gt;
**создаем параметр &amp;lt;code&amp;gt;ReportParameterFio&amp;lt;/code&amp;gt; (с принимаемым из набора данных значением &amp;lt;code&amp;gt;fio&amp;lt;/code&amp;gt;);&lt;br /&gt;
**при необходимости фильтрации таблицы по данному критерию подключаем созданный параметр к таблице с общим значением параметра &amp;lt;code&amp;gt;=[fio] In (=Parameters!ReportParameterFio.Value)&amp;lt;/code&amp;gt;; &lt;br /&gt;
**если значение ФИО нужно только для однократного вывода на экран (например, для подписи документа), то шаг подключения параметра к таблице пропускается;&lt;br /&gt;
*в результате создается второй параметр со значениями, не зависящими от первого;&lt;br /&gt;
*для добавления зависимости необходимо в дереве отчета выбрать набор данных &amp;lt;code&amp;gt;FilterFio&amp;lt;/code&amp;gt; правой кнопкой выбрать пункт меню &amp;lt;code&amp;gt;Edit&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Parameter9.png|center]]&lt;br /&gt;
*в отрывшемся окне в левой части выбрать раздел &amp;lt;code&amp;gt;DataSet - Parameters&amp;lt;/code&amp;gt; и нажать на кнопку &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Parameter10.png|center|thumb]]&lt;br /&gt;
*в отрывшемся окне в поле &amp;lt;code&amp;gt;Name&amp;lt;/code&amp;gt; ввести имя параметра (например, &amp;lt;code&amp;gt;SelectedLaboratory&amp;lt;/code&amp;gt;);&lt;br /&gt;
[[Файл:Parameter11.png|center|thumb]]&lt;br /&gt;
*в поле &amp;lt;code&amp;gt;Value&amp;lt;/code&amp;gt; нажать стрелку меню и выбрать пункт &amp;lt;code&amp;gt;Expression…&amp;lt;/code&amp;gt;;&lt;br /&gt;
*в левой части окна в области &amp;lt;code&amp;gt;Fields:&amp;lt;/code&amp;gt; раскрыть группу &amp;lt;code&amp;gt;Parameters&amp;lt;/code&amp;gt; и выбрать пункт &amp;lt;code&amp;gt;ReportParameterLaboratory&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Parameter12.png|center|thumb]]&lt;br /&gt;
*двойным кликом или кнопкой &amp;lt;code&amp;gt;Append&amp;lt;/code&amp;gt; добавить пункт &amp;lt;code&amp;gt;ReportParameterLaboratory&amp;lt;/code&amp;gt; в область &amp;lt;code&amp;gt;Expression:&amp;lt;/code&amp;gt;;&lt;br /&gt;
*нажать кнопку &amp;lt;code&amp;gt;OK&amp;lt;/code&amp;gt;;&lt;br /&gt;
*в оставшемся открытым окне свойств набора данных в левой части окна выбрать раздел &amp;lt;code&amp;gt;DataSet - Query&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Parameter13.png|center|thumb]]&lt;br /&gt;
*в поле &amp;lt;code&amp;gt;Query:&amp;lt;/code&amp;gt; в конце запроса добавить условие &amp;lt;code&amp;gt;WHERE fio In (@SelectedLaboratory)&amp;lt;/code&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
Таким образом, итоговые записи данного запроса будут браться не напрямую из набора данных БД, а после предварительной фильтрации на основе лаборатории, выбранной в первом параметре.&lt;br /&gt;
&lt;br /&gt;
В результате связанный параметр функции не активен, пока не будет определено значение основного параметра лаборатории.&lt;br /&gt;
[[Файл:Parameter14.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Внутренняя документация]]&lt;br /&gt;
[[Category:Тритея]]&lt;br /&gt;
[[Category:Дизайнер_документов]]&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%A2%D0%B0%D0%B1%D0%BB%D0%B8%D0%BA%D1%81&amp;diff=300</id>
		<title>Табликс</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%A2%D0%B0%D0%B1%D0%BB%D0%B8%D0%BA%D1%81&amp;diff=300"/>
		<updated>2025-12-26T04:51:43Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Табликс&#039;&#039;&#039; (&amp;lt;code&amp;gt;Tablix&amp;lt;/code&amp;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;
*элемент &amp;lt;code&amp;gt;Tablix&amp;lt;/code&amp;gt; состоит из четырёх областей, обозначенных пунктирными линиями на поверхности элемента - &#039;&#039;угла&#039;&#039;, &#039;&#039;области группы строк&#039;&#039;, &#039;&#039;области группы столбцов&#039;&#039; и &#039;&#039;основной области&#039;&#039; – «тела» или «Body» (рис. 7.1).&lt;br /&gt;
[[Файл:Tablix.png|center]]&lt;br /&gt;
&lt;br /&gt;
===Угол===&lt;br /&gt;
*может содержать только статические ячейки, которые отображаются в &amp;lt;code&amp;gt;Tablix&amp;lt;/code&amp;gt; только один раз.&lt;br /&gt;
&lt;br /&gt;
===Группа столбцов===&lt;br /&gt;
*обозначается квадратными скобками над столбцами (рис. 7.1, табл. 7.1).&lt;br /&gt;
&lt;br /&gt;
===Группа строк===&lt;br /&gt;
*обозначается квадратными скобками в левой части строк (рис. 7.1, табл. 7.1).&lt;br /&gt;
&lt;br /&gt;
===Основная область===&lt;br /&gt;
*используется для отображения агрегированных данных в отчёте, сгруппированных по строкам и столбцам; &lt;br /&gt;
*может содержать только статические ячейки, которые отображаются в &amp;lt;code&amp;gt;Tablix&amp;lt;/code&amp;gt; только один раз.&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Отображение !!Описание&lt;br /&gt;
|-&lt;br /&gt;
|[[Файл:Tablix3.png|center]] ||Строка или столбец с одной внешней группой&lt;br /&gt;
|-&lt;br /&gt;
|[[Файл:Tablix4.png|center]] ||Одна внешняя группа и одна внутренняя группа&lt;br /&gt;
|-&lt;br /&gt;
|[[Файл:Tablix5.png|center]] ||Одна внешняя группа с дополнительной строкой для итоговых значений и одна внутренняя группа&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Виды строк==&lt;br /&gt;
*cтроки или столбцы в области данных &amp;lt;code&amp;gt;Tablix&amp;lt;/code&amp;gt; могут быть &#039;&#039;статическими&#039;&#039; или &#039;&#039;динамическими&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
[[Файл:Tablix2.png|center]]&lt;br /&gt;
&lt;br /&gt;
===Статическая строка или столбец=== &lt;br /&gt;
*не связаны с какими-либо групповыми данными; &lt;br /&gt;
*при запуске отчета статическая строка или столбец отображаются только один раз;&lt;br /&gt;
*заголовки и итоговые значения отображаются с помощью статических строк или столбцов в области данных &amp;lt;code&amp;gt;Tablix&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Динамическая строка или столбец=== &lt;br /&gt;
*связаны с одной или несколькими группами и отображаются один раз для каждого уникального значения в группе.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Внутренняя документация]]&lt;br /&gt;
[[Category:Тритея]]&lt;br /&gt;
[[Category:Дизайнер_документов]]&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%A2%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0&amp;diff=299</id>
		<title>Таблица</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%A2%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0&amp;diff=299"/>
		<updated>2025-12-26T04:51:03Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Таблица&#039;&#039;&#039; (&amp;lt;code&amp;gt;Table&amp;lt;/code&amp;gt;) - область данных, которая используется для отображения информации в табличном формате в табличных отчётах. &lt;br /&gt;
&lt;br /&gt;
==Общие сведения==&lt;br /&gt;
*таблица состоит из столбцов и строк, в которых организованы данные; &lt;br /&gt;
*по умолчанию в таблице три столбца и три строки, всего девять ячеек, каждая из которых заполнена [[TextBox|текстовым полем]]; &lt;br /&gt;
*во время разработки вы можете добавлять или удалять столбцы, строки и группы в соответствии с вашими потребностями; &lt;br /&gt;
*в ячейки таблицы можно встраивать другие области данных ([[Текстовое_поле|текстовые поля]], [[Форматированный_текст|поля форматированного текста]], картинки и др.).&lt;br /&gt;
&lt;br /&gt;
==Создание таблицы==&lt;br /&gt;
*для добавления таблицы необходимо в левой части окна Дизайнера левой кнопкой мыши нажать на элемент &amp;lt;code&amp;gt;Table&amp;lt;/code&amp;gt; и, не отпуская, перенести его в желаемое место и отпустить кнопку мыши;&lt;br /&gt;
[[Файл:Table.png|center|thumb]]&lt;br /&gt;
*по умолчанию в таблице три столбца и три строки, всего девять ячеек, каждая из которых заполнена текстовым полем;&lt;br /&gt;
*по умолчанию в таблице три столбца и три строки, всего девять ячеек, каждая из которых заполнена текстовым полем;&lt;br /&gt;
[[Файл:Table2.png|center|thumb]]&lt;br /&gt;
*первая строка &amp;lt;code&amp;gt;Table Header&amp;lt;/code&amp;gt; является строкой заголовка, может располагаться только на первой странице или повторяться на всех;&lt;br /&gt;
*вторая строка &amp;lt;code&amp;gt;Table Details&amp;lt;/code&amp;gt; является строкой собственно данных;&lt;br /&gt;
*третья строка &amp;lt;code&amp;gt;Table Footer&amp;lt;/code&amp;gt; является результирующей (можно использовать для итоговых вычислений), также может располагаться только на первой странице или повторяться на всех;&lt;br /&gt;
*для скрытия результирующей строки в контекстном меню таблицы отжать значение &amp;lt;code&amp;gt;Table Footer&amp;lt;/code&amp;gt;; &lt;br /&gt;
[[Файл:Table3.png|center|thumb]]&lt;br /&gt;
*аналогичным образом можно регулировать отображение остальных разделов строк (&amp;lt;code&amp;gt;Table Header&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Table Details&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
==Изменение размера таблицы==&lt;br /&gt;
*для изменения размера таблицы необходимо левой кнопкой мыши перетащить узловую точку границы таблицы в желаемое место и отпустить кнопку мыши;&lt;br /&gt;
[[Файл:Table4.png|center|thumb]]&lt;br /&gt;
*также для изменения размера таблицы можно использовать окно свойств таблицы, пункт меню &amp;lt;code&amp;gt;Layout &amp;gt;&amp;gt; Size&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[Файл:Table5.png|center]]&lt;br /&gt;
&lt;br /&gt;
==Изменение высоты строк==&lt;br /&gt;
*для изменения высоты строк необходимо выбрать одну или несколько строк таблицы, перейти в окно свойств таблицы, пункт меню &amp;lt;code&amp;gt;Layout &amp;gt;&amp;gt; Height&amp;lt;/code&amp;gt; и ввести необходимые данные (например, 0,55).&lt;br /&gt;
[[Файл:Table6.png|center]]&lt;br /&gt;
&lt;br /&gt;
==Создание и удаление столбцов==&lt;br /&gt;
*для добавления столбцов в таблицу необходимо выбрать один из столбцов таблицы, нажать правую клавишу мыши и в контекстном меню выбрать добавление столбца справа &amp;lt;code&amp;gt;Insert Column to the Right&amp;lt;/code&amp;gt; или слева &amp;lt;code&amp;gt;Insert Column to the Left&amp;lt;/code&amp;gt; от выделенного столбца;&lt;br /&gt;
[[Файл:Table7.png|center|thumb]]&lt;br /&gt;
*для удаления столбцов в таблицу необходимо выбрать один или несколько столбцов, нажать правую клавишу мыши и в контекстном меню выбрать удаление столбца &amp;lt;code&amp;gt;Delete Columns&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Объединение и разделение ячеек==&lt;br /&gt;
*для объединения необходимо выделить объединяемые ячейки, вызвать правой кнопкой мышки контекстное меню, выбрать пункт &amp;lt;code&amp;gt;Merge Cells&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Table8.png|center]]&lt;br /&gt;
*для разделения необходимо выделить разделяемую ячейку, вызвать правой кнопкой мышки контекстное меню, выбрать пункт &amp;lt;code&amp;gt;Split Cells&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[Файл:Table9.png|center]]&lt;br /&gt;
&lt;br /&gt;
==Объединение соседних ячеек с одинаковыми значениями==&lt;br /&gt;
*левой кнопкой мыши выделить необходимую ячейку таблицы;&lt;br /&gt;
*в разделе свойств элемента &amp;lt;code&amp;gt;Layout &amp;gt;&amp;gt; AutoMergeMode&amp;lt;/code&amp;gt; нажать левой кнопкой мыши на стрелку;&lt;br /&gt;
[[Файл:Table11.png|center]]&lt;br /&gt;
*выбрать значение из списка: &amp;lt;code&amp;gt;Never&amp;lt;/code&amp;gt; (по умолчанию, никогда не объединяются),  &amp;lt;code&amp;gt;Always&amp;lt;/code&amp;gt; (всегда объединяются) и &amp;lt;code&amp;gt;Restricted&amp;lt;/code&amp;gt; (объединяются только в том случае, если соответствующие ячейки в предыдущих столбцах объединены аналогичным образом – &amp;lt;code&amp;gt;Always&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;Restricted&amp;lt;/code&amp;gt;).&lt;br /&gt;
[[Файл:Table10.png|center|thumb]]&lt;br /&gt;
&lt;br /&gt;
==Изменение свойств границ==&lt;br /&gt;
Для отображения всех границ таблицы:  &lt;br /&gt;
*выделить всю таблицу на основном поле конструктора или в дереве отчета &amp;lt;code&amp;gt;ReportSection1 &amp;gt;&amp;gt; Body &amp;gt;&amp;gt; Table1&amp;lt;/code&amp;gt;;&lt;br /&gt;
*перейти в окно свойств таблицы, в пункте меню &amp;lt;code&amp;gt;Appearance &amp;gt;&amp;gt; BorderStyle&amp;lt;/code&amp;gt;; &lt;br /&gt;
[[Файл:Table12.png|center]]&lt;br /&gt;
*в раскрывающемся списке выбрать значение &amp;lt;code&amp;gt;Solid&amp;lt;/code&amp;gt; или другое требуемое (по умолчанию при создании таблицы границы не отображаются – значение &amp;lt;code&amp;gt;None&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Также можно настроить отображение каждой границы ячейки отдельно. Для этого:&lt;br /&gt;
*выбрать одну или несколько ячеек; &lt;br /&gt;
*раскрыть пункт меню &amp;lt;code&amp;gt;Appearance &amp;gt;&amp;gt; BorderStyle&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Table13.png|center]]&lt;br /&gt;
*в раскрывающемся списке выбрать значение &amp;lt;code&amp;gt;Solid&amp;lt;/code&amp;gt; для любой из четырех границ (в данном случае значение &amp;lt;code&amp;gt;Solid&amp;lt;/code&amp;gt; установлено для нижней границы).&lt;br /&gt;
&lt;br /&gt;
==Наименование и форматирование заголовков==&lt;br /&gt;
По умолчанию каждая ячейка таблицы является текстовым полем, соответственно форматирование содержимого такое же:&lt;br /&gt;
[[Файл:Table14.png|center]]&lt;br /&gt;
Для шрифта вносятся изменения в следующие свойства:&lt;br /&gt;
*стиль &amp;lt;code&amp;gt;Appearance &amp;gt;&amp;gt; Font &amp;gt;&amp;gt; FontStyle&amp;lt;/code&amp;gt; – нормальный &amp;lt;code&amp;gt;Normal&amp;lt;/code&amp;gt; или курсив &amp;lt;code&amp;gt;Italic&amp;lt;/code&amp;gt;; &lt;br /&gt;
*название &amp;lt;code&amp;gt;Appearance &amp;gt;&amp;gt; Font &amp;gt;&amp;gt; FontFamily&amp;lt;/code&amp;gt;;&lt;br /&gt;
*размер &amp;lt;code&amp;gt;Appearance &amp;gt;&amp;gt; Font &amp;gt;&amp;gt; FontSize&amp;lt;/code&amp;gt;;&lt;br /&gt;
*толщина &amp;lt;code&amp;gt;Appearance &amp;gt;&amp;gt; Font &amp;gt;&amp;gt; FontWeight&amp;lt;/code&amp;gt; – нормальный &amp;lt;code&amp;gt;Normal&amp;lt;/code&amp;gt;, жирный &amp;lt;code&amp;gt;Bold&amp;lt;/code&amp;gt; и другие. &lt;br /&gt;
Выравнивание текста:&lt;br /&gt;
*по горизонтали &amp;lt;code&amp;gt;Appearance &amp;gt;&amp;gt; Font &amp;gt;&amp;gt; TextAlign&amp;lt;/code&amp;gt;; &lt;br /&gt;
*выравнивание текста по вертикали &amp;lt;code&amp;gt;Appearance &amp;gt;&amp;gt; Font &amp;gt;&amp;gt; VerticalAlign&amp;lt;/code&amp;gt;. &lt;br /&gt;
Изменение имени текстового поля:&lt;br /&gt;
*&amp;lt;code&amp;gt;Data &amp;gt;&amp;gt; DataElementName&amp;lt;/code&amp;gt;;&lt;br /&gt;
*&amp;lt;code&amp;gt;Design &amp;gt;&amp;gt; Name&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Определение нумерации строк==&lt;br /&gt;
*на ячейке данных, в которой будут выводиться номера строк (в данном случае – первый столбец, первая строка после заголовка) правой кнопкой вызвать контекстное меню;&lt;br /&gt;
*выбрать пункт &amp;lt;code&amp;gt;Expression…&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Table15.png|center]]&lt;br /&gt;
*в появившемся окне &amp;lt;code&amp;gt;Expression Editor&amp;lt;/code&amp;gt; в поле &amp;lt;code&amp;gt;Expression:&amp;lt;/code&amp;gt; ввести с клавиатуры &amp;lt;code&amp;gt;=RowNumber()&amp;lt;/code&amp;gt; или выбрать (двойной клик) данную функцию из меню &amp;lt;code&amp;gt;Fields: &amp;gt;&amp;gt; Common Functions &amp;gt;&amp;gt; Miscellaneous &amp;gt;&amp;gt; RowNumber&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Table16.png|center|thumb]]&lt;br /&gt;
*в дальнейшем, при необходимости, можно создать фильтр &amp;lt;code&amp;gt;ReportParametrNumberFirstString&amp;lt;/code&amp;gt; для ввода начального значения первой строки пользователем; в таком случае выражение будет иметь вид &amp;lt;code&amp;gt;=RowNumber() + Parameters!ReportParametrNumberFirstString.Value – 1&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Добавление данных БД в ячейки из DataSet==&lt;br /&gt;
*для ввода простого значения из подключенного [[Набор_данных|набора данных &amp;lt;code&amp;gt;DataSet&amp;lt;/code&amp;gt;]] необходимо выбрать желаемую конечную ячейку таблицы;&lt;br /&gt;
*в правой верхней части ячейки левой кнопкой мыши нажать на три горизонтальных синих черточки;&lt;br /&gt;
[[Файл:Table17.png|center]]&lt;br /&gt;
*в появившемся списке всех доступных в &amp;lt;code&amp;gt;DataSet&amp;lt;/code&amp;gt; полей выбрать необходимое поле;&lt;br /&gt;
*при этом значение поля в &amp;lt;code&amp;gt;DataSet&amp;lt;/code&amp;gt; имеет ряд синонимов&lt;br /&gt;
**в списке название фигурирует как &amp;lt;code&amp;gt;fio&amp;lt;/code&amp;gt;;&lt;br /&gt;
**в ячейке после выбора будет отображаться в сокращенном формате как &amp;lt;code&amp;gt;=[fio]&amp;lt;/code&amp;gt;;&lt;br /&gt;
**в окне &amp;lt;code&amp;gt;Expression Editor&amp;lt;/code&amp;gt; будет отображаться в полном формате как &amp;lt;code&amp;gt;=Fields!fio.Value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Группировка данных таблицы==&lt;br /&gt;
===Создание группировки таблицы===&lt;br /&gt;
*выделить таблицу на основном поле конструктора или в дереве;&lt;br /&gt;
*нажать на кнопку диалогового окна свойств &amp;lt;code&amp;gt;Property dialog…&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Table19.png|center|thumb]]&lt;br /&gt;
*в открывшемся окне в левом столбце перейти на вкладку &amp;lt;code&amp;gt;Table - Groups&amp;lt;/code&amp;gt; и нажать на кнопку &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Table20.png|center|thumb]]&lt;br /&gt;
*в результате появится группа &amp;lt;code&amp;gt;MainTable_Group1&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Table21.png|center|thumb]]&lt;br /&gt;
*в области &amp;lt;code&amp;gt;Group on:&amp;lt;/code&amp;gt; нажать на стрелку поля &amp;lt;code&amp;gt;Expression&amp;lt;/code&amp;gt; и в раскрывшемся списке выбрать поле из &amp;lt;code&amp;gt;DataSet&amp;lt;/code&amp;gt;, по которому будет проводиться группировка;&lt;br /&gt;
*в результате на основном поле конструктора выше и ниже основной строки с данными появятся строки добавленной группировки.&lt;br /&gt;
[[Файл:Table22.png|center|thumb]]&lt;br /&gt;
&lt;br /&gt;
===Удаление результирующей строки группировки===&lt;br /&gt;
*выделить таблицу на основном поле конструктора или в дереве;&lt;br /&gt;
*нажать на кнопку диалогового окна свойств &amp;lt;code&amp;gt;Property dialog…&amp;lt;/code&amp;gt; (рис. 4.19);&lt;br /&gt;
[[Файл:Table19.png|center|thumb]]&lt;br /&gt;
*в открывшемся окне в левом столбце перейти на вкладку &amp;lt;code&amp;gt;Table - Groups&amp;lt;/code&amp;gt;;&lt;br /&gt;
*в правом разделе окна перейти на вкладку &amp;lt;code&amp;gt;Layout&amp;lt;/code&amp;gt; (рис. 4.23);&lt;br /&gt;
[[Файл:Table23.png|center|thumb]]&lt;br /&gt;
*убрать галочку из поля &amp;lt;code&amp;gt;Include group footer&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Нумерация==&lt;br /&gt;
===Сквозная нумерация строк===&lt;br /&gt;
*левой кнопкой мыши выделить ячейку таблицы (обычно крайнюю левую);&lt;br /&gt;
*правой кнопкой мыши вызвать контекстное меню&lt;br /&gt;
*выбрать пункт &amp;lt;code&amp;gt;Expression…&amp;lt;/code&amp;gt;;&lt;br /&gt;
*в появившемся окне &amp;lt;code&amp;gt;Expression Editor&amp;lt;/code&amp;gt; в левой части окна в области &amp;lt;code&amp;gt;Fields:&amp;lt;/code&amp;gt; выбрать пункт &amp;lt;code&amp;gt;Common Function &amp;gt;&amp;gt; Miscellaneous &amp;gt;&amp;gt; RowNumber&amp;lt;/code&amp;gt; и двойным кликом или кнопкой &amp;lt;code&amp;gt;Append&amp;lt;/code&amp;gt; добавить пункт &amp;lt;code&amp;gt;RowNumber&amp;lt;/code&amp;gt; в область &amp;lt;code&amp;gt;Expression:&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Table24.png|center|thumb]]&lt;br /&gt;
*также можно с клавиатуры в поле &amp;lt;code&amp;gt;Expression:&amp;lt;/code&amp;gt; ввести &amp;lt;code&amp;gt;=RowNumber()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Сквозная нумерация строк со значения, заданного пользователем===&lt;br /&gt;
*создать [[простой фильтр]] &amp;lt;code&amp;gt;ReportParametrNumberFirstString&amp;lt;/code&amp;gt;;&lt;br /&gt;
*задать имя фильтра, тип данных &amp;lt;code&amp;gt;Integer&amp;lt;/code&amp;gt; и текст-приглашение для ввода данных на вкладке &amp;lt;code&amp;gt;Report – Parameters &amp;gt;&amp;gt; General&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Table25.png|center|thumb]]&lt;br /&gt;
*задать значение по умолчанию &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;, тип данных &amp;lt;code&amp;gt;Integer&amp;lt;/code&amp;gt; и текст-приглашение для ввода данных на вкладке &amp;lt;code&amp;gt;Report – Parameters &amp;gt;&amp;gt; DefaultValues&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Table26.png|center|thumb]]&lt;br /&gt;
*левой кнопкой мыши выбрать ячейку таблицы (обычно крайнюю левую);&lt;br /&gt;
*правой кнопкой мыши вызвать контекстное меню;&lt;br /&gt;
*выбрать пункт &amp;lt;code&amp;gt;Expression…&amp;lt;/code&amp;gt;;&lt;br /&gt;
*в поле &amp;lt;code&amp;gt;Expression:&amp;lt;/code&amp;gt; ввести с клавиатуры &amp;lt;code&amp;gt;=RowNumber() + Parameters!ReportParametrNumberFirstString.Value - 1&amp;lt;/code&amp;gt; или выбрать соответствующие элементы в поле &amp;lt;code&amp;gt;Fields:&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Table27.png|center|thumb]]&lt;br /&gt;
*в результате получится простой фильтр.&lt;br /&gt;
[[Файл:Table28.png|center]]&lt;br /&gt;
&lt;br /&gt;
===Нумерация групп и строк внутри групп===&lt;br /&gt;
*для нумерации групп и строк групп необходимо дважды провести [[группировку таблицы]];&lt;br /&gt;
[[Файл:Table29.png|center|thumb]]&lt;br /&gt;
*создать группу верхнего уровня &amp;lt;code&amp;gt;Type_Group&amp;lt;/code&amp;gt; («Тип объекта анализа») на основании поля &amp;lt;code&amp;gt;type_name&amp;lt;/code&amp;gt; из текущего набора данных;&lt;br /&gt;
[[Файл:Table30.png|center|thumb]] &lt;br /&gt;
*левой кнопкой мыши выбрать ячейку таблицы (обычно крайнюю левую);&lt;br /&gt;
*правой кнопкой мыши вызвать контекстное меню;&lt;br /&gt;
*выбрать пункт &amp;lt;code&amp;gt;Expression…&amp;lt;/code&amp;gt;;&lt;br /&gt;
*в поле &amp;lt;code&amp;gt;Expression:&amp;lt;/code&amp;gt; ввести с клавиатуры (или выбрать в поле &amp;lt;code&amp;gt;Fields:&amp;lt;/code&amp;gt;) &amp;lt;code&amp;gt;=GroupIndex(&amp;quot;Type_Group&amp;quot;) + 1 &amp;amp; &amp;quot;. &amp;quot; &amp;amp; Fields.type_name.Value&amp;lt;/code&amp;gt;;&lt;br /&gt;
*создается группа второго уровня &amp;lt;code&amp;gt;AO_Group&amp;lt;/code&amp;gt; («Объект анализа») на основании поля &amp;lt;code&amp;gt;ao_name&amp;lt;/code&amp;gt; из текущего набора данных; &lt;br /&gt;
[[Файл:Table31.png|center|thumb]]&lt;br /&gt;
*левой кнопкой мыши выбрать ячейку таблицы (обычно крайнюю левую);&lt;br /&gt;
*правой кнопкой мыши вызвать контекстное меню;&lt;br /&gt;
*выбрать пункт &amp;lt;code&amp;gt;Expression…&amp;lt;/code&amp;gt;;&lt;br /&gt;
*в поле &amp;lt;code&amp;gt;Expression:&amp;lt;/code&amp;gt; ввести с клавиатуры (или выбрать в поле &amp;lt;code&amp;gt;Fields:&amp;lt;/code&amp;gt;) &amp;lt;code&amp;gt;=GroupIndex(&amp;quot;Type_Group&amp;quot;) + 1 &amp;amp; &amp;quot;.&amp;quot; &amp;amp; GroupIndex(&amp;quot;AO_Group&amp;quot;) + 1 &amp;amp; &amp;quot;. &amp;quot; &amp;amp; Fields!ao_name.Value&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Внутренняя документация]]&lt;br /&gt;
[[Category:Тритея]]&lt;br /&gt;
[[Category:Дизайнер_документов]]&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%A4%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D1%82%D0%B5%D0%BA%D1%81%D1%82&amp;diff=298</id>
		<title>Форматированный текст</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%A4%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9_%D1%82%D0%B5%D0%BA%D1%81%D1%82&amp;diff=298"/>
		<updated>2025-12-26T04:50:42Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Форматированный текст&#039;&#039;&#039; (&amp;lt;code&amp;gt;FormattedText&amp;lt;/code&amp;gt;) - элемент отображения текстовых данных с форматированием.&lt;br /&gt;
&lt;br /&gt;
==Общие сведения==&lt;br /&gt;
*может выполнять операции слияния данных;&lt;br /&gt;
*может отображать форматированный текст в формате HTML (например – при отображении формул или единиц измерения, содержащих надстрочные и/или подстрочные символы).&lt;br /&gt;
&lt;br /&gt;
==Ввод текста==&lt;br /&gt;
*выбрать у элемента &amp;lt;code&amp;gt;FormattedText&amp;lt;/code&amp;gt; свойство &amp;lt;code&amp;gt;Data &amp;gt;&amp;gt; Html&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Formatted.png|center]]&lt;br /&gt;
*вызвать с помощью пункта &amp;lt;code&amp;gt;Expression…&amp;lt;/code&amp;gt; (рис. 6.1) окно &amp;lt;code&amp;gt;Expression Editor&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Formatted2.png|center]]&lt;br /&gt;
*ввести HTML-код в поле &amp;lt;code&amp;gt;Expression:&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Особенности== &lt;br /&gt;
*элемент FormattedText отображает введенный HTML-текст с применённым форматированием (итоговый вариант можно увидеть в режиме предварительного просмотра &amp;lt;code&amp;gt;Preview&amp;lt;/code&amp;gt;;&lt;br /&gt;
*весь текст, написанный в свойстве Html, должен быть заключен в тег &amp;lt;code&amp;gt;&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/code&amp;gt;;&lt;br /&gt;
*в поле ввода текста «Expression:» возможно использование почти все HTML-теги и атрибуты из спецификации XHTML 1.1 (подробнее см. https://www.w3.org/TR/xhtml11/) с некоторыми расширениями для частичной поддержки спецификации HTML5 (подробнее см. https://www.w3.org/TR/2011/WD-html5-20110405/); &lt;br /&gt;
*элемент управления &amp;lt;code&amp;gt;FormattedText&amp;lt;/code&amp;gt; поддерживает многие (но не все) стили CSS;&lt;br /&gt;
*при использовании допустимых HTML-тегов, которые не поддерживаются дизайнером, они будут игнорироваться.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Внутренняя документация]]&lt;br /&gt;
[[Category:Тритея]]&lt;br /&gt;
[[Category:Дизайнер_документов]]&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%A2%D0%B5%D0%BA%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B5_%D0%BF%D0%BE%D0%BB%D0%B5&amp;diff=297</id>
		<title>Текстовое поле</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%A2%D0%B5%D0%BA%D1%81%D1%82%D0%BE%D0%B2%D0%BE%D0%B5_%D0%BF%D0%BE%D0%BB%D0%B5&amp;diff=297"/>
		<updated>2025-12-26T04:50:32Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Текстовое поле&#039;&#039;&#039; (&amp;lt;code&amp;gt;TextBox&amp;lt;/code&amp;gt;) — это наиболее часто используемый элемент управления отчётом, который отображает текстовые данные в любом отчёте.&lt;br /&gt;
&lt;br /&gt;
==Общие сведения==&lt;br /&gt;
*выражение в текстовом поле может отображать поля из базы данных, вычислять значение или визуально отображать данные;&lt;br /&gt;
*в отчётах текстовое поле по умолчанию отображается в каждой ячейке области данных [[Таблица|Table (Таблица)]] или [[Табликс|Tablix (Табликс)]]; &lt;br /&gt;
*чтобы ввести текст непосредственно в текстовое поле, просто дважды щёлкните внутри элемента управления на поверхности конструктора отчёта.&lt;br /&gt;
&lt;br /&gt;
==Создание текстового поля==&lt;br /&gt;
*для добавления текстового поля необходимо в левой части окна Дизайнера (рис. 3.1) левой кнопкой мыши нажать на элемент &amp;lt;code&amp;gt;TextBox&amp;lt;/code&amp;gt; и, не отпуская, перенести его в желаемое место (не обязательно точно, хотя бы в желаемый раздел, расположение элемента позже можно будет откорректировать), в данном случае – в верхнюю левую часть верхнего колонтитула;&lt;br /&gt;
[[Файл:Text.png|center|thumb]]&lt;br /&gt;
В результате созданный текстовый элемент появится &lt;br /&gt;
*в верхней левой части верхнего колонтитула (рис. 3.2)&lt;br /&gt;
[[Файл:Text2.png|center|thumb]]&lt;br /&gt;
*в дереве отчета (рис. 3.3);&lt;br /&gt;
[[Файл:Text3.png|center]]&lt;br /&gt;
*по умолчанию имя элемента создается в формате &amp;lt;code&amp;gt;TextBoxN&amp;lt;/code&amp;gt;, где &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; автоматически посчитанный порядковый номер текстового элемента в данном отчете.&lt;br /&gt;
&lt;br /&gt;
==Изменение имени текстового поля==&lt;br /&gt;
*для изменения имени текстового поля необходимо внести изменения в двух свойствах текстового элемента – &amp;lt;code&amp;gt;Data &amp;gt;&amp;gt; DataElementName&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;Design &amp;gt;&amp;gt; (Name)&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[Файл:Text.png|center|thumb]]&lt;br /&gt;
&lt;br /&gt;
==Изменение шрифта==&lt;br /&gt;
*для изменения свойств шрифта текстового поля в свойствах текстового элемента разворачиваем вкладку &amp;lt;code&amp;gt;Appearance &amp;gt;&amp;gt; Font&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Text5.png|center]]&lt;br /&gt;
*для изменения названия шрифта нажимаем на наименование свойства или значение свойства &amp;lt;code&amp;gt;Appearance &amp;gt;&amp;gt; Font &amp;gt;&amp;gt; FontFamily&amp;lt;/code&amp;gt;, после чего нажимаем стрелку меню и выбираем название шрифта;&lt;br /&gt;
[[Файл:Text6.png|center]]&lt;br /&gt;
*аналогично выбирается размер шрифта (вкладка &amp;lt;code&amp;gt;Appearance &amp;gt;&amp;gt; Font &amp;gt;&amp;gt; FontSize&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Text7.png|center]]&lt;br /&gt;
*аналогично выбирается стиль шрифта (вкладка &amp;lt;code&amp;gt;Appearance &amp;gt;&amp;gt; Font &amp;gt;&amp;gt; FontStyle&amp;lt;/code&amp;gt; – нормальный (&amp;lt;code&amp;gt;Normal&amp;lt;/code&amp;gt;) или курсив (&amp;lt;code&amp;gt;Italic&amp;lt;/code&amp;gt;); &lt;br /&gt;
[[Файл:Text8.png|center]]&lt;br /&gt;
*аналогично выбирается толщина шрифта (вкладка &amp;lt;code&amp;gt;Appearance &amp;gt;&amp;gt; Font &amp;gt;&amp;gt; FontWeight&amp;lt;/code&amp;gt; – нормальный (&amp;lt;code&amp;gt;Normal&amp;lt;/code&amp;gt;), жирный (&amp;lt;code&amp;gt;Bold&amp;lt;/code&amp;gt;) и другие.&lt;br /&gt;
[[Файл:Text9.png|center]]&lt;br /&gt;
&lt;br /&gt;
==Выравнивание текста==&lt;br /&gt;
*для выравнивания текста по горизонтали используется вкладка &amp;lt;code&amp;gt;Appearance &amp;gt;&amp;gt; Font &amp;gt;&amp;gt; TextAlign&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Text10.png|center]]&lt;br /&gt;
*для выравнивания текста по вертикали используется вкладка &amp;lt;code&amp;gt;Appearance &amp;gt;&amp;gt; Font &amp;gt;&amp;gt; VerticalAlign&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[Файл:Text11.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Внутренняя документация]]&lt;br /&gt;
[[Category:Тритея]]&lt;br /&gt;
[[Category:Дизайнер_документов]]&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9E%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B&amp;diff=296</id>
		<title>Оформление страницы</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9E%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B&amp;diff=296"/>
		<updated>2025-12-26T04:49:41Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Оформление страницы&#039;&#039;&#039; - включает в себя ориентацию страницы, размеры полей, размеры и содержание колонтитулов, разрывы разделов страницы (печать с новой страницы), отображение элементов на четных/нечетных страницах.&lt;br /&gt;
&lt;br /&gt;
==Ориентация страницы==&lt;br /&gt;
Для вывода отчетов используются два типа ориентации страницы &amp;lt;code&amp;gt;Portrait&amp;lt;/code&amp;gt; (&#039;&#039;«портретная»&#039;&#039;, &#039;&#039;вертикальная&#039;&#039;) и &amp;lt;code&amp;gt;Landscape&amp;lt;/code&amp;gt; (&#039;&#039;«пейзажная»&#039;&#039;, &#039;&#039;горизонтальная&#039;&#039;). Для изменения:&lt;br /&gt;
*в разделе «дерева» (структуры) отчета &amp;lt;code&amp;gt;Report&amp;lt;/code&amp;gt; найти раздел &amp;lt;code&amp;gt;ReportSection1&amp;lt;/code&amp;gt; (по умолчанию – название основной секции отчета);&lt;br /&gt;
[[Файл:ReportSection.png|center]]&lt;br /&gt;
*нажать левой кнопкой мыши (при этом в правой нижней части основного экрана Дизайнера появятся свойства выбранного элемента);&lt;br /&gt;
[[Файл:WindowDesigner.png|center|thumb]]&lt;br /&gt;
*в разделе свойств элемента &amp;lt;code&amp;gt;ReportSection1&amp;lt;/code&amp;gt; по умолчанию установлена ориентация страницы &amp;lt;code&amp;gt;Portrait&amp;lt;/code&amp;gt; (вертикальная);&lt;br /&gt;
*при необходимости изменения ориентации страницы нажать левой кнопкой мыши в проекцию названия свойства или его значения;&lt;br /&gt;
[[Файл:PaperOrientation.png|center]]&lt;br /&gt;
*после чего появится стрелка меню для выбора ориентации страницы;&lt;br /&gt;
[[Файл:PaperOrientation2.png|center]]&lt;br /&gt;
*при нажатии левой кнопкой мыши на стрелку меню появятся варианты выбора ориентации страницы – &amp;lt;code&amp;gt;Portrait&amp;lt;/code&amp;gt; («портретная», вертикальная) и &amp;lt;code&amp;gt;Landscape&amp;lt;/code&amp;gt; («пейзажная», горизонтальная);&lt;br /&gt;
[[Файл:PaperOrientation3.png|center]]&lt;br /&gt;
*после выбора соответствующего варианта ориентации также автоматически изменятся размеры ширины и высоты: 21 х 29,7 см для вертикальной ориентации; 29,7 х 21 см для горизонтальной ориентации.&lt;br /&gt;
&lt;br /&gt;
==Размер полей страницы==&lt;br /&gt;
Поля документа не отображаются на основном рабочем поле конструктора, но видны при предпросмотре (Preview) и печати документа. Для их изменения:&lt;br /&gt;
*в разделе свойств элемента &amp;lt;code&amp;gt;ReportSection1 &amp;gt;&amp;gt;  Layout &amp;gt;&amp;gt; Margins&amp;lt;/code&amp;gt; нажать левой кнопкой мыши на стрелку;&lt;br /&gt;
[[Файл:Margins.png|center]]&lt;br /&gt;
*появится список всех полей страницы – &amp;lt;code&amp;gt;Left&amp;lt;/code&amp;gt; (левая), &amp;lt;code&amp;gt;Right&amp;lt;/code&amp;gt; (правая), &amp;lt;code&amp;gt;Top&amp;lt;/code&amp;gt; (верхняя), &amp;lt;code&amp;gt;Bottom&amp;lt;/code&amp;gt; (нижняя); по умолчанию размер всех полей страницы по 2,5 см;&lt;br /&gt;
[[Файл:Margins2.png|center]]&lt;br /&gt;
*для изменения размеров полей в разделе свойств элемента &amp;lt;code&amp;gt;ReportSection1 &amp;gt;&amp;gt;  Layout &amp;gt;&amp;gt; Margins&amp;lt;/code&amp;gt; установить необходимые значения (дробные значения не чувствительны к точке и запятой – преобразуются автоматически; целые значения автоматически округляются).&lt;br /&gt;
[[Файл:Margins3.png|center]]&lt;br /&gt;
&lt;br /&gt;
==Колонтитулы==&lt;br /&gt;
&#039;&#039;&#039;Колонтитулы&#039;&#039;&#039; в документе применяются для улучшения навигации (нумерация страниц), структурирования информации (название главы или раздела) и придания документу определенного внешнего вида (наименование организации, логотип и др.).&lt;br /&gt;
&lt;br /&gt;
По умолчанию новый документ создается без колонтитулов.&lt;br /&gt;
&lt;br /&gt;
===Добавление верхнего колонтитула===&lt;br /&gt;
*нажать правой кнопкой мыши на элемент &amp;lt;code&amp;gt;ReportSection1&amp;lt;/code&amp;gt;;&lt;br /&gt;
*в раскрывшемся меню выбрать пункт &amp;lt;code&amp;gt;Page Header&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Headers.png|center]]&lt;br /&gt;
*при этом в дереве отчета в составе основной секции документа &amp;lt;code&amp;gt;ReportSection1&amp;lt;/code&amp;gt; появится элемент &amp;lt;code&amp;gt;Page Header&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[Файл:Headers2.png|center]]&lt;br /&gt;
&lt;br /&gt;
===Изменение размеров верхнего колонтитула===&lt;br /&gt;
*в дереве отчета в составе основной секции документа &amp;lt;code&amp;gt;ReportSection1&amp;lt;/code&amp;gt; выбрать элемент &amp;lt;code&amp;gt;PageHeader&amp;lt;/code&amp;gt;;&lt;br /&gt;
*в свойствах элемента &amp;lt;code&amp;gt;PageHeader&amp;lt;/code&amp;gt; нажать на стрелку выбора меню в элементе &amp;lt;code&amp;gt;Layout &amp;gt;&amp;gt; Size&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Headers3.png|center]]&lt;br /&gt;
*для изменения высоты колонтитула в поле &amp;lt;code&amp;gt;Height&amp;lt;/code&amp;gt; установить требуемое значение (например, 0.85cm) вместо используемого по умолчанию (1cm);&lt;br /&gt;
*ширина колонтитула меняется аналогичным образом (поле &amp;lt;code&amp;gt;Width&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
===Добавление нижнего колонтитула===&lt;br /&gt;
*нажать правой кнопкой мыши на элемент &amp;lt;code&amp;gt;ReportSection1&amp;lt;/code&amp;gt;;&lt;br /&gt;
*в раскрывшемся меню выбрать пункт &amp;lt;code&amp;gt;Page Footer&amp;lt;/code&amp;gt; (рис. 2.12);&lt;br /&gt;
[[Файл:Footers.png|center]]&lt;br /&gt;
*при этом в дереве отчета в составе основной секции документа &amp;lt;code&amp;gt;ReportSection1&amp;lt;/code&amp;gt; появится элемент &amp;lt;code&amp;gt;Page Footer&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[Файл:Footers2.png|center]]&lt;br /&gt;
&lt;br /&gt;
===Изменение размеров нижнего колонтитула===&lt;br /&gt;
*в дереве отчета в составе основной секции документа &amp;lt;code&amp;gt;ReportSection1&amp;lt;/code&amp;gt; выбрать элемент &amp;lt;code&amp;gt;PageFooter&amp;lt;/code&amp;gt;;&lt;br /&gt;
*в свойствах элемента &amp;lt;code&amp;gt;PageFooter&amp;lt;/code&amp;gt; нажать на стрелку выбора меню в элементе &amp;lt;code&amp;gt;Layout &amp;gt;&amp;gt; Size&amp;lt;/code&amp;gt;;&lt;br /&gt;
*для изменения высоты колонтитула в поле &amp;lt;code&amp;gt;Height&amp;lt;/code&amp;gt; установить требуемое значение (например, 0.85cm) вместо используемого по умолчанию (1cm);&lt;br /&gt;
[[Файл:Headers.png|center]]&lt;br /&gt;
*ширина колонтитула меняется аналогичным образом (поле &amp;lt;code&amp;gt;Width&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
===Печать колонтитулов на первой странице===&lt;br /&gt;
*как верхний, так и нижний колонтитул могут не выводиться на просмотр и печать на первую и/или последнюю страницы;&lt;br /&gt;
*за их отображение отвечают параметры &amp;lt;code&amp;gt;Misc &amp;gt;&amp;gt; PrintOnFirstPage&amp;lt;/code&amp;gt; (печатать на первой странице) и &amp;lt;code&amp;gt;Misc &amp;gt;&amp;gt; PrintOnLastPage&amp;lt;/code&amp;gt; (печатать на последней странице);&lt;br /&gt;
*по умолчанию оба параметра имеют значение &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; (печатать);&lt;br /&gt;
[[Файл:Footers3.png|center]]&lt;br /&gt;
*если отображение колонтитула не требуется, параметру необходимо установить значение &amp;lt;code&amp;gt;False&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Печать элементов с новой страницы==&lt;br /&gt;
По умолчанию все элементы отчета печатаются последовательно один за другим в порядке расположения их на странице конструктора. При этом разрывы страниц выполняются автоматически. &lt;br /&gt;
В конструкторе есть возможность задать принудительный разрыв страницы.&lt;br /&gt;
*добавление разрыва страницы и перенос элемента при печати на следующую страницу регулируется свойством элемента &amp;lt;code&amp;gt;Layout &amp;gt;&amp;gt; PageBreakAtStart&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Break.png|center]]&lt;br /&gt;
*свойство имеет только два возможных значения – &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; (установлен перенос) и &amp;lt;code&amp;gt;False&amp;lt;/code&amp;gt; (перенос отсутствует, значение по умолчанию);&lt;br /&gt;
*свойство присутствует у сложных элементов – [[Таблица|&amp;lt;code&amp;gt;Table&amp;lt;/code&amp;gt;]], [[Табликс|&amp;lt;code&amp;gt;Tablix&amp;lt;/code&amp;gt;]], &amp;lt;code&amp;gt;Container&amp;lt;/code&amp;gt;;&lt;br /&gt;
*простые элементы, нуждающиеся в переносе и не имеющие свойства &amp;lt;code&amp;gt;PageBreakAtStart&amp;lt;/code&amp;gt;, необходимо разместить внутри контейнера;&lt;br /&gt;
[[Файл:Break2.png|center|thumb]]&lt;br /&gt;
*для контейнера установить у свойства &amp;lt;code&amp;gt;PageBreakAtStart&amp;lt;/code&amp;gt; значение &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Отображение элементов на четных/нечетных страницах==&lt;br /&gt;
По умолчанию все элементы отображаются как на нечетных, так и на четных страницах. Для изменения их отображения необходимо: &lt;br /&gt;
*левой кнопкой мыши выделить необходимый элемент;&lt;br /&gt;
*в свойствах элемента &amp;lt;code&amp;gt;Appearance &amp;gt;&amp;gt; Visibility &amp;gt;&amp;gt; Hidden&amp;lt;/code&amp;gt; выбрать значение &amp;lt;code&amp;gt;Expression…&amp;lt;/code&amp;gt; (рис. 2.18);&lt;br /&gt;
[[Файл:Visibility.png|center]]&lt;br /&gt;
*в открывшемся окне &amp;lt;code&amp;gt;Expression Editor&amp;lt;/code&amp;gt; в поле &amp;lt;code&amp;gt;Expression:&amp;lt;/code&amp;gt; ввести формулу &amp;lt;code&amp;gt;=IIF(Globals!PageNumber MOD 2 = 0, True, False)&amp;lt;/code&amp;gt; (рис. 2.19);&lt;br /&gt;
[[Файл:Visibility2.png|center]]&lt;br /&gt;
*в результате элемент будет отображаться на нечетных страницах и исчезать на четных;&lt;br /&gt;
*для отображения на четных и исчезновения на нечетных необходимо поменять местами &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;False&amp;lt;/code&amp;gt;, тогда выражение примет вид &amp;lt;code&amp;gt;=IIF(Globals!PageNumber MOD 2 = 0, False, True)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Расположение страниц в Z- или N-образном порядке==&lt;br /&gt;
Если в отчете на нескольких страницах во время предварительного просмотра отображаются данные, увеличивающиеся по горизонтали или вертикали, вы можете захотеть, чтобы страницы отчета отображались в определенном порядке. &lt;br /&gt;
В дизайнере поддерживается два типа порядка размещения страниц: Z-образный или N-образный.&lt;br /&gt;
&lt;br /&gt;
===Z-Порядок===&lt;br /&gt;
Z-порядок отображает отчет в виде алфавитной буквы «Z». Это означает, что в отчете в первую очередь отображаются горизонтально расширяющиеся данные, во вторую – данные, расширяющиеся по вертикали: &amp;lt;code&amp;gt;1A &amp;gt;&amp;gt; 1B &amp;gt;&amp;gt; 1С &amp;gt;&amp;gt; 2А &amp;gt;&amp;gt; 2В &amp;gt;&amp;gt; 2С &amp;gt;&amp;gt;3А &amp;gt;&amp;gt; 3В &amp;gt;&amp;gt; 3С&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Multiple-pages-z-order.png|center]]&lt;br /&gt;
&lt;br /&gt;
===N-Порядок===&lt;br /&gt;
Порядок N отображает отчет в виде алфавитной буквы «N». Это означает, что в отчете в первую очередь данные расширяются по вертикали, во вторую – по горизонтали: &amp;lt;code&amp;gt;1A &amp;gt;&amp;gt; 2A &amp;gt;&amp;gt; 3A &amp;gt;&amp;gt; 1B &amp;gt;&amp;gt; 2B &amp;gt;&amp;gt; 3B &amp;gt;&amp;gt; 1C &amp;gt;&amp;gt; 2C &amp;gt;&amp;gt; 3C&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:N-page-layout.png|center]]&lt;br /&gt;
&lt;br /&gt;
===Установка Z-образного или N-образного порядка в отчете===&lt;br /&gt;
*в проводнике отчетов выбрать узел отчета &amp;lt;code&amp;gt;Report&amp;lt;/code&amp;gt;; &lt;br /&gt;
*перейти на панель свойств &amp;lt;code&amp;gt;Layout &amp;gt;&amp;gt; LayoutPagesOrder&amp;lt;/code&amp;gt;;&lt;br /&gt;
*установить для свойства &amp;lt;code&amp;gt;LayoutPagesOrder&amp;lt;/code&amp;gt; значение &amp;lt;code&amp;gt;ZOrder&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;NOrder&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[Файл:Order.png|center]]&lt;br /&gt;
&lt;br /&gt;
==Удаление лишних пробелов в конце отчета==&lt;br /&gt;
Свойство &amp;lt;code&amp;gt;ConsumeContainerWhitespace&amp;lt;/code&amp;gt; в отчетах определяет, следует ли удалять лишние пробелы в конце контейнеров отчета (таких как тело отчета или прямоугольники), т.е. предотвращает появление пустых страниц после основных элементов ([[Таблица|таблицы]], [[Табликс|табликса]] и др.). &lt;br /&gt;
Для изменения свойства:&lt;br /&gt;
*в проводнике отчетов выбрать узел отчета &amp;lt;code&amp;gt;Report&amp;lt;/code&amp;gt;; &lt;br /&gt;
*перейти на панель свойств &amp;lt;code&amp;gt;Misc &amp;gt;&amp;gt; ConsumeContainerWhitespace&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Whitespace.png|center]]&lt;br /&gt;
*установить для свойства &amp;lt;code&amp;gt;ConsumeContainerWhitespace&amp;lt;/code&amp;gt; значение &amp;lt;code&amp;gt;False&amp;lt;/code&amp;gt; (установлено по умолчанию, не убирает лишние пробелы в конце отчета) или &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; (убирает лишние пробелы).&lt;br /&gt;
&lt;br /&gt;
[[Category:Внутренняя документация]]&lt;br /&gt;
[[Category:Тритея]]&lt;br /&gt;
[[Category:Дизайнер_документов]]&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9E%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B&amp;diff=295</id>
		<title>Оформление страницы</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9E%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B&amp;diff=295"/>
		<updated>2025-12-26T04:49:19Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Оформление страницы&#039;&#039;&#039; - включает в себя ориентацию страницы, размеры полей, размеры и содержание колонтитулов, разрывы разделов страницы (печать с новой страницы), отображение элементов на четных/нечетных страницах.&lt;br /&gt;
&lt;br /&gt;
==Ориентация страницы==&lt;br /&gt;
Для вывода отчетов используются два типа ориентации страницы &amp;lt;code&amp;gt;Portrait&amp;lt;/code&amp;gt; (&#039;&#039;«портретная»&#039;&#039;, &#039;&#039;вертикальная&#039;&#039;) и &amp;lt;code&amp;gt;Landscape&amp;lt;/code&amp;gt; (&#039;&#039;«пейзажная»&#039;&#039;, &#039;&#039;горизонтальная&#039;&#039;). Для изменения:&lt;br /&gt;
*в разделе «дерева» (структуры) отчета &amp;lt;code&amp;gt;Report&amp;lt;/code&amp;gt; найти раздел &amp;lt;code&amp;gt;ReportSection1&amp;lt;/code&amp;gt; (по умолчанию – название основной секции отчета);&lt;br /&gt;
[[Файл:ReportSection.png|center]]&lt;br /&gt;
*нажать левой кнопкой мыши (при этом в правой нижней части основного экрана Дизайнера появятся свойства выбранного элемента);&lt;br /&gt;
[[Файл:WindowDesigner.png|center|thumb]]&lt;br /&gt;
*в разделе свойств элемента &amp;lt;code&amp;gt;ReportSection1&amp;lt;/code&amp;gt; по умолчанию установлена ориентация страницы &amp;lt;code&amp;gt;Portrait&amp;lt;/code&amp;gt; (вертикальная);&lt;br /&gt;
*при необходимости изменения ориентации страницы нажать левой кнопкой мыши в проекцию названия свойства или его значения;&lt;br /&gt;
[[Файл:PaperOrientation.png|center]]&lt;br /&gt;
*после чего появится стрелка меню для выбора ориентации страницы;&lt;br /&gt;
[[Файл:PaperOrientation2.png|center]]&lt;br /&gt;
*при нажатии левой кнопкой мыши на стрелку меню появятся варианты выбора ориентации страницы – &amp;lt;code&amp;gt;Portrait&amp;lt;/code&amp;gt; («портретная», вертикальная) и &amp;lt;code&amp;gt;Landscape&amp;lt;/code&amp;gt; («пейзажная», горизонтальная);&lt;br /&gt;
[[Файл:PaperOrientation3.png|center]]&lt;br /&gt;
*после выбора соответствующего варианта ориентации также автоматически изменятся размеры ширины и высоты: 21 х 29,7 см для вертикальной ориентации; 29,7 х 21 см для горизонтальной ориентации.&lt;br /&gt;
&lt;br /&gt;
==Размер полей страницы==&lt;br /&gt;
Поля документа не отображаются на основном рабочем поле конструктора, но видны при предпросмотре (Preview) и печати документа. Для их изменения:&lt;br /&gt;
*в разделе свойств элемента &amp;lt;code&amp;gt;ReportSection1 &amp;gt;&amp;gt;  Layout &amp;gt;&amp;gt; Margins&amp;lt;/code&amp;gt; нажать левой кнопкой мыши на стрелку;&lt;br /&gt;
[[Файл:Margins.png|center]]&lt;br /&gt;
*появится список всех полей страницы – &amp;lt;code&amp;gt;Left&amp;lt;/code&amp;gt; (левая), &amp;lt;code&amp;gt;Right&amp;lt;/code&amp;gt; (правая), &amp;lt;code&amp;gt;Top&amp;lt;/code&amp;gt; (верхняя), &amp;lt;code&amp;gt;Bottom&amp;lt;/code&amp;gt; (нижняя); по умолчанию размер всех полей страницы по 2,5 см;&lt;br /&gt;
[[Файл:Margins2.png|center]]&lt;br /&gt;
*для изменения размеров полей в разделе свойств элемента &amp;lt;code&amp;gt;ReportSection1 &amp;gt;&amp;gt;  Layout &amp;gt;&amp;gt; Margins&amp;lt;/code&amp;gt; установить необходимые значения (дробные значения не чувствительны к точке и запятой – преобразуются автоматически; целые значения автоматически округляются).&lt;br /&gt;
[[Файл:Margins3.png|center]]&lt;br /&gt;
&lt;br /&gt;
==Колонтитулы==&lt;br /&gt;
&#039;&#039;&#039;Колонтитулы&#039;&#039;&#039; в документе применяются для улучшения навигации (нумерация страниц), структурирования информации (название главы или раздела) и придания документу определенного внешнего вида (наименование организации, логотип и др.).&lt;br /&gt;
&lt;br /&gt;
По умолчанию новый документ создается без колонтитулов.&lt;br /&gt;
&lt;br /&gt;
===Добавление верхнего колонтитула===&lt;br /&gt;
*нажать правой кнопкой мыши на элемент &amp;lt;code&amp;gt;ReportSection1&amp;lt;/code&amp;gt;;&lt;br /&gt;
*в раскрывшемся меню выбрать пункт &amp;lt;code&amp;gt;Page Header&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Headers.png|center]]&lt;br /&gt;
*при этом в дереве отчета в составе основной секции документа &amp;lt;code&amp;gt;ReportSection1&amp;lt;/code&amp;gt; появится элемент &amp;lt;code&amp;gt;Page Header&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[Файл:Headers2.png|center]]&lt;br /&gt;
&lt;br /&gt;
===Изменение размеров верхнего колонтитула===&lt;br /&gt;
*в дереве отчета в составе основной секции документа &amp;lt;code&amp;gt;ReportSection1&amp;lt;/code&amp;gt; выбрать элемент &amp;lt;code&amp;gt;PageHeader&amp;lt;/code&amp;gt;;&lt;br /&gt;
*в свойствах элемента &amp;lt;code&amp;gt;PageHeader&amp;lt;/code&amp;gt; нажать на стрелку выбора меню в элементе &amp;lt;code&amp;gt;Layout &amp;gt;&amp;gt; Size&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Headers3.png|center]]&lt;br /&gt;
*для изменения высоты колонтитула в поле &amp;lt;code&amp;gt;Height&amp;lt;/code&amp;gt; установить требуемое значение (например, 0.85cm) вместо используемого по умолчанию (1cm);&lt;br /&gt;
*ширина колонтитула меняется аналогичным образом (поле &amp;lt;code&amp;gt;Width&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
===Добавление нижнего колонтитула===&lt;br /&gt;
*нажать правой кнопкой мыши на элемент &amp;lt;code&amp;gt;ReportSection1&amp;lt;/code&amp;gt;;&lt;br /&gt;
*в раскрывшемся меню выбрать пункт &amp;lt;code&amp;gt;Page Footer&amp;lt;/code&amp;gt; (рис. 2.12);&lt;br /&gt;
[[Файл:Footers.png|center]]&lt;br /&gt;
*при этом в дереве отчета в составе основной секции документа &amp;lt;code&amp;gt;ReportSection1&amp;lt;/code&amp;gt; появится элемент &amp;lt;code&amp;gt;Page Footer&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[Файл:Footers2.png|center]]&lt;br /&gt;
&lt;br /&gt;
===Изменение размеров нижнего колонтитула===&lt;br /&gt;
*в дереве отчета в составе основной секции документа &amp;lt;code&amp;gt;ReportSection1&amp;lt;/code&amp;gt; выбрать элемент &amp;lt;code&amp;gt;PageFooter&amp;lt;/code&amp;gt;;&lt;br /&gt;
*в свойствах элемента &amp;lt;code&amp;gt;PageFooter&amp;lt;/code&amp;gt; нажать на стрелку выбора меню в элементе &amp;lt;code&amp;gt;Layout &amp;gt;&amp;gt; Size&amp;lt;/code&amp;gt;;&lt;br /&gt;
*для изменения высоты колонтитула в поле &amp;lt;code&amp;gt;Height&amp;lt;/code&amp;gt; установить требуемое значение (например, 0.85cm) вместо используемого по умолчанию (1cm);&lt;br /&gt;
[[Файл:Headers.png|center]]&lt;br /&gt;
*ширина колонтитула меняется аналогичным образом (поле &amp;lt;code&amp;gt;Width&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
===Печать колонтитулов на первой странице===&lt;br /&gt;
*как верхний, так и нижний колонтитул могут не выводиться на просмотр и печать на первую и/или последнюю страницы;&lt;br /&gt;
*за их отображение отвечают параметры &amp;lt;code&amp;gt;Misc &amp;gt;&amp;gt; PrintOnFirstPage&amp;lt;/code&amp;gt; (печатать на первой странице) и &amp;lt;code&amp;gt;Misc &amp;gt;&amp;gt; PrintOnLastPage&amp;lt;/code&amp;gt; (печатать на последней странице);&lt;br /&gt;
*по умолчанию оба параметра имеют значение &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; (печатать);&lt;br /&gt;
[[Файл:Footers3.png|center]]&lt;br /&gt;
*если отображение колонтитула не требуется, параметру необходимо установить значение &amp;lt;code&amp;gt;False&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Печать элементов с новой страницы==&lt;br /&gt;
По умолчанию все элементы отчета печатаются последовательно один за другим в порядке расположения их на странице конструктора. При этом разрывы страниц выполняются автоматически. &lt;br /&gt;
В конструкторе есть возможность задать принудительный разрыв страницы.&lt;br /&gt;
*добавление разрыва страницы и перенос элемента при печати на следующую страницу регулируется свойством элемента &amp;lt;code&amp;gt;Layout &amp;gt;&amp;gt; PageBreakAtStart&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Break.png|center]]&lt;br /&gt;
*свойство имеет только два возможных значения – &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; (установлен перенос) и &amp;lt;code&amp;gt;False&amp;lt;/code&amp;gt; (перенос отсутствует, значение по умолчанию);&lt;br /&gt;
*свойство присутствует у сложных элементов – [[Таблица|&amp;lt;code&amp;gt;Table&amp;lt;/code&amp;gt;]], [[Табликс|&amp;lt;code&amp;gt;Tablix&amp;lt;/code&amp;gt;]], &amp;lt;code&amp;gt;Container&amp;lt;/code&amp;gt;;&lt;br /&gt;
*простые элементы, нуждающиеся в переносе и не имеющие свойства &amp;lt;code&amp;gt;PageBreakAtStart&amp;lt;/code&amp;gt;, необходимо разместить внутри контейнера;&lt;br /&gt;
[[Файл:Break2.png|center|thumb]]&lt;br /&gt;
*для контейнера установить у свойства &amp;lt;code&amp;gt;PageBreakAtStart&amp;lt;/code&amp;gt; значение &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Отображение элементов на четных/нечетных страницах==&lt;br /&gt;
По умолчанию все элементы отображаются как на нечетных, так и на четных страницах. Для изменения их отображения необходимо: &lt;br /&gt;
*левой кнопкой мыши выделить необходимый элемент;&lt;br /&gt;
*в свойствах элемента &amp;lt;code&amp;gt;Appearance &amp;gt;&amp;gt; Visibility &amp;gt;&amp;gt; Hidden&amp;lt;/code&amp;gt; выбрать значение &amp;lt;code&amp;gt;Expression…&amp;lt;/code&amp;gt; (рис. 2.18);&lt;br /&gt;
[[Файл:Visibility.png|center]]&lt;br /&gt;
*в открывшемся окне &amp;lt;code&amp;gt;Expression Editor&amp;lt;/code&amp;gt; в поле &amp;lt;code&amp;gt;Expression:&amp;lt;/code&amp;gt; ввести формулу &amp;lt;code&amp;gt;=IIF(Globals!PageNumber MOD 2 = 0, True, False)&amp;lt;/code&amp;gt; (рис. 2.19);&lt;br /&gt;
[[Файл:Visibility2.png|center]]&lt;br /&gt;
*в результате элемент будет отображаться на нечетных страницах и исчезать на четных;&lt;br /&gt;
*для отображения на четных и исчезновения на нечетных необходимо поменять местами &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;False&amp;lt;/code&amp;gt;, тогда выражение примет вид &amp;lt;code&amp;gt;=IIF(Globals!PageNumber MOD 2 = 0, False, True)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Расположение страниц в Z- или N-образном порядке==&lt;br /&gt;
Если в отчете на нескольких страницах во время предварительного просмотра отображаются данные, увеличивающиеся по горизонтали или вертикали, вы можете захотеть, чтобы страницы отчета отображались в определенном порядке. &lt;br /&gt;
В дизайнере поддерживается два типа порядка размещения страниц: Z-образный или N-образный.&lt;br /&gt;
&lt;br /&gt;
===Z-Порядок===&lt;br /&gt;
Z-порядок отображает отчет в виде алфавитной буквы «Z». Это означает, что в отчете в первую очередь отображаются горизонтально расширяющиеся данные, во вторую – данные, расширяющиеся по вертикали: &amp;lt;code&amp;gt;1A &amp;gt;&amp;gt; 1B &amp;gt;&amp;gt; 1С &amp;gt;&amp;gt; 2А &amp;gt;&amp;gt; 2В &amp;gt;&amp;gt; 2С &amp;gt;&amp;gt;3А &amp;gt;&amp;gt; 3В &amp;gt;&amp;gt; 3С&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Multiple-pages-z-order.png|center]]&lt;br /&gt;
&lt;br /&gt;
===N-Порядок===&lt;br /&gt;
Порядок N отображает отчет в виде алфавитной буквы «N». Это означает, что в отчете в первую очередь данные расширяются по вертикали, во вторую – по горизонтали: &amp;lt;code&amp;gt;1A &amp;gt;&amp;gt; 2A &amp;gt;&amp;gt; 3A &amp;gt;&amp;gt; 1B &amp;gt;&amp;gt; 2B &amp;gt;&amp;gt; 3B &amp;gt;&amp;gt; 1C &amp;gt;&amp;gt; 2C &amp;gt;&amp;gt; 3C&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:N-page-layout.png|center]]&lt;br /&gt;
&lt;br /&gt;
===Установка Z-образного или N-образного порядка в отчете===&lt;br /&gt;
*в проводнике отчетов выбрать узел отчета &amp;lt;code&amp;gt;Report&amp;lt;/code&amp;gt;; &lt;br /&gt;
*перейти на панель свойств &amp;lt;code&amp;gt;Layout &amp;gt;&amp;gt; LayoutPagesOrder&amp;lt;/code&amp;gt;;&lt;br /&gt;
*установить для свойства &amp;lt;code&amp;gt;LayoutPagesOrder&amp;lt;/code&amp;gt; значение &amp;lt;code&amp;gt;ZOrder&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;NOrder&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[Файл:Order.png|center]]&lt;br /&gt;
&lt;br /&gt;
==Удаление лишних пробелов в конце отчета==&lt;br /&gt;
Свойство &amp;lt;code&amp;gt;ConsumeContainerWhitespace&amp;lt;/code&amp;gt; в отчетах определяет, следует ли удалять лишние пробелы в конце контейнеров отчета (таких как тело отчета или прямоугольники), т.е. предотвращает появление пустых страниц после основных элементов ([[Таблица|таблицы]], [[Табликс|табликса]] и др.). &lt;br /&gt;
Для изменения свойства:&lt;br /&gt;
*в проводнике отчетов выбрать узел отчета &amp;lt;code&amp;gt;Report&amp;lt;/code&amp;gt;; &lt;br /&gt;
*перейти на панель свойств &amp;lt;code&amp;gt;Misc &amp;gt;&amp;gt; ConsumeContainerWhitespace&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Whitespace.png|center]]&lt;br /&gt;
*установить для свойства &amp;lt;code&amp;gt;ConsumeContainerWhitespace&amp;lt;/code&amp;gt; значение &amp;lt;code&amp;gt;False&amp;lt;/code&amp;gt; (установлено по умолчанию, не убирает лишние пробелы в конце отчета) или &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; (убирает лишние пробелы).&lt;br /&gt;
&lt;br /&gt;
[[Category:Внутренняя документация]]&lt;br /&gt;
[[Category:Тритея|Дизайнер_документов]]&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%A2%D1%80%D0%B8%D1%82%D0%B5%D1%8F&amp;diff=294</id>
		<title>Категория:Тритея</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%A2%D1%80%D0%B8%D1%82%D0%B5%D1%8F&amp;diff=294"/>
		<updated>2025-12-26T04:44:57Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Новая страница: «В данной категории располагаются статьи, относящиеся к ВебЛИС «Тритея».»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В данной категории располагаются статьи, относящиеся к ВебЛИС «Тритея».&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%94%D0%B8%D0%B7%D0%B0%D0%B9%D0%BD%D0%B5%D1%80_%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2&amp;diff=293</id>
		<title>Категория:Дизайнер документов</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%94%D0%B8%D0%B7%D0%B0%D0%B9%D0%BD%D0%B5%D1%80_%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2&amp;diff=293"/>
		<updated>2025-12-26T04:43:07Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Новая страница: «В данной категории находятся материалы, посвящённые дизайнеру документов ВебЛИС «Тритея».»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В данной категории находятся материалы, посвящённые дизайнеру документов ВебЛИС «Тритея».&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9E%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B&amp;diff=292</id>
		<title>Оформление страницы</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9E%D1%84%D0%BE%D1%80%D0%BC%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B&amp;diff=292"/>
		<updated>2025-12-26T04:40:12Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Оформление страницы&#039;&#039;&#039; - включает в себя ориентацию страницы, размеры полей, размеры и содержание колонтитулов, разрывы разделов страницы (печать с новой страницы), отображение элементов на четных/нечетных страницах.&lt;br /&gt;
&lt;br /&gt;
==Ориентация страницы==&lt;br /&gt;
Для вывода отчетов используются два типа ориентации страницы &amp;lt;code&amp;gt;Portrait&amp;lt;/code&amp;gt; (&#039;&#039;«портретная»&#039;&#039;, &#039;&#039;вертикальная&#039;&#039;) и &amp;lt;code&amp;gt;Landscape&amp;lt;/code&amp;gt; (&#039;&#039;«пейзажная»&#039;&#039;, &#039;&#039;горизонтальная&#039;&#039;). Для изменения:&lt;br /&gt;
*в разделе «дерева» (структуры) отчета &amp;lt;code&amp;gt;Report&amp;lt;/code&amp;gt; найти раздел &amp;lt;code&amp;gt;ReportSection1&amp;lt;/code&amp;gt; (по умолчанию – название основной секции отчета);&lt;br /&gt;
[[Файл:ReportSection.png|center]]&lt;br /&gt;
*нажать левой кнопкой мыши (при этом в правой нижней части основного экрана Дизайнера появятся свойства выбранного элемента);&lt;br /&gt;
[[Файл:WindowDesigner.png|center|thumb]]&lt;br /&gt;
*в разделе свойств элемента &amp;lt;code&amp;gt;ReportSection1&amp;lt;/code&amp;gt; по умолчанию установлена ориентация страницы &amp;lt;code&amp;gt;Portrait&amp;lt;/code&amp;gt; (вертикальная);&lt;br /&gt;
*при необходимости изменения ориентации страницы нажать левой кнопкой мыши в проекцию названия свойства или его значения;&lt;br /&gt;
[[Файл:PaperOrientation.png|center]]&lt;br /&gt;
*после чего появится стрелка меню для выбора ориентации страницы;&lt;br /&gt;
[[Файл:PaperOrientation2.png|center]]&lt;br /&gt;
*при нажатии левой кнопкой мыши на стрелку меню появятся варианты выбора ориентации страницы – &amp;lt;code&amp;gt;Portrait&amp;lt;/code&amp;gt; («портретная», вертикальная) и &amp;lt;code&amp;gt;Landscape&amp;lt;/code&amp;gt; («пейзажная», горизонтальная);&lt;br /&gt;
[[Файл:PaperOrientation3.png|center]]&lt;br /&gt;
*после выбора соответствующего варианта ориентации также автоматически изменятся размеры ширины и высоты: 21 х 29,7 см для вертикальной ориентации; 29,7 х 21 см для горизонтальной ориентации.&lt;br /&gt;
&lt;br /&gt;
==Размер полей страницы==&lt;br /&gt;
Поля документа не отображаются на основном рабочем поле конструктора, но видны при предпросмотре (Preview) и печати документа. Для их изменения:&lt;br /&gt;
*в разделе свойств элемента &amp;lt;code&amp;gt;ReportSection1 &amp;gt;&amp;gt;  Layout &amp;gt;&amp;gt; Margins&amp;lt;/code&amp;gt; нажать левой кнопкой мыши на стрелку;&lt;br /&gt;
[[Файл:Margins.png|center]]&lt;br /&gt;
*появится список всех полей страницы – &amp;lt;code&amp;gt;Left&amp;lt;/code&amp;gt; (левая), &amp;lt;code&amp;gt;Right&amp;lt;/code&amp;gt; (правая), &amp;lt;code&amp;gt;Top&amp;lt;/code&amp;gt; (верхняя), &amp;lt;code&amp;gt;Bottom&amp;lt;/code&amp;gt; (нижняя); по умолчанию размер всех полей страницы по 2,5 см;&lt;br /&gt;
[[Файл:Margins2.png|center]]&lt;br /&gt;
*для изменения размеров полей в разделе свойств элемента &amp;lt;code&amp;gt;ReportSection1 &amp;gt;&amp;gt;  Layout &amp;gt;&amp;gt; Margins&amp;lt;/code&amp;gt; установить необходимые значения (дробные значения не чувствительны к точке и запятой – преобразуются автоматически; целые значения автоматически округляются).&lt;br /&gt;
[[Файл:Margins3.png|center]]&lt;br /&gt;
&lt;br /&gt;
==Колонтитулы==&lt;br /&gt;
&#039;&#039;&#039;Колонтитулы&#039;&#039;&#039; в документе применяются для улучшения навигации (нумерация страниц), структурирования информации (название главы или раздела) и придания документу определенного внешнего вида (наименование организации, логотип и др.).&lt;br /&gt;
&lt;br /&gt;
По умолчанию новый документ создается без колонтитулов.&lt;br /&gt;
&lt;br /&gt;
===Добавление верхнего колонтитула===&lt;br /&gt;
*нажать правой кнопкой мыши на элемент &amp;lt;code&amp;gt;ReportSection1&amp;lt;/code&amp;gt;;&lt;br /&gt;
*в раскрывшемся меню выбрать пункт &amp;lt;code&amp;gt;Page Header&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Headers.png|center]]&lt;br /&gt;
*при этом в дереве отчета в составе основной секции документа &amp;lt;code&amp;gt;ReportSection1&amp;lt;/code&amp;gt; появится элемент &amp;lt;code&amp;gt;Page Header&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[Файл:Headers2.png|center]]&lt;br /&gt;
&lt;br /&gt;
===Изменение размеров верхнего колонтитула===&lt;br /&gt;
*в дереве отчета в составе основной секции документа &amp;lt;code&amp;gt;ReportSection1&amp;lt;/code&amp;gt; выбрать элемент &amp;lt;code&amp;gt;PageHeader&amp;lt;/code&amp;gt;;&lt;br /&gt;
*в свойствах элемента &amp;lt;code&amp;gt;PageHeader&amp;lt;/code&amp;gt; нажать на стрелку выбора меню в элементе &amp;lt;code&amp;gt;Layout &amp;gt;&amp;gt; Size&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Headers3.png|center]]&lt;br /&gt;
*для изменения высоты колонтитула в поле &amp;lt;code&amp;gt;Height&amp;lt;/code&amp;gt; установить требуемое значение (например, 0.85cm) вместо используемого по умолчанию (1cm);&lt;br /&gt;
*ширина колонтитула меняется аналогичным образом (поле &amp;lt;code&amp;gt;Width&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
===Добавление нижнего колонтитула===&lt;br /&gt;
*нажать правой кнопкой мыши на элемент &amp;lt;code&amp;gt;ReportSection1&amp;lt;/code&amp;gt;;&lt;br /&gt;
*в раскрывшемся меню выбрать пункт &amp;lt;code&amp;gt;Page Footer&amp;lt;/code&amp;gt; (рис. 2.12);&lt;br /&gt;
[[Файл:Footers.png|center]]&lt;br /&gt;
*при этом в дереве отчета в составе основной секции документа &amp;lt;code&amp;gt;ReportSection1&amp;lt;/code&amp;gt; появится элемент &amp;lt;code&amp;gt;Page Footer&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[Файл:Footers2.png|center]]&lt;br /&gt;
&lt;br /&gt;
===Изменение размеров нижнего колонтитула===&lt;br /&gt;
*в дереве отчета в составе основной секции документа &amp;lt;code&amp;gt;ReportSection1&amp;lt;/code&amp;gt; выбрать элемент &amp;lt;code&amp;gt;PageFooter&amp;lt;/code&amp;gt;;&lt;br /&gt;
*в свойствах элемента &amp;lt;code&amp;gt;PageFooter&amp;lt;/code&amp;gt; нажать на стрелку выбора меню в элементе &amp;lt;code&amp;gt;Layout &amp;gt;&amp;gt; Size&amp;lt;/code&amp;gt;;&lt;br /&gt;
*для изменения высоты колонтитула в поле &amp;lt;code&amp;gt;Height&amp;lt;/code&amp;gt; установить требуемое значение (например, 0.85cm) вместо используемого по умолчанию (1cm);&lt;br /&gt;
[[Файл:Headers.png|center]]&lt;br /&gt;
*ширина колонтитула меняется аналогичным образом (поле &amp;lt;code&amp;gt;Width&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
===Печать колонтитулов на первой странице===&lt;br /&gt;
*как верхний, так и нижний колонтитул могут не выводиться на просмотр и печать на первую и/или последнюю страницы;&lt;br /&gt;
*за их отображение отвечают параметры &amp;lt;code&amp;gt;Misc &amp;gt;&amp;gt; PrintOnFirstPage&amp;lt;/code&amp;gt; (печатать на первой странице) и &amp;lt;code&amp;gt;Misc &amp;gt;&amp;gt; PrintOnLastPage&amp;lt;/code&amp;gt; (печатать на последней странице);&lt;br /&gt;
*по умолчанию оба параметра имеют значение &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; (печатать);&lt;br /&gt;
[[Файл:Footers3.png|center]]&lt;br /&gt;
*если отображение колонтитула не требуется, параметру необходимо установить значение &amp;lt;code&amp;gt;False&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Печать элементов с новой страницы==&lt;br /&gt;
По умолчанию все элементы отчета печатаются последовательно один за другим в порядке расположения их на странице конструктора. При этом разрывы страниц выполняются автоматически. &lt;br /&gt;
В конструкторе есть возможность задать принудительный разрыв страницы.&lt;br /&gt;
*добавление разрыва страницы и перенос элемента при печати на следующую страницу регулируется свойством элемента &amp;lt;code&amp;gt;Layout &amp;gt;&amp;gt; PageBreakAtStart&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Break.png|center]]&lt;br /&gt;
*свойство имеет только два возможных значения – &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; (установлен перенос) и &amp;lt;code&amp;gt;False&amp;lt;/code&amp;gt; (перенос отсутствует, значение по умолчанию);&lt;br /&gt;
*свойство присутствует у сложных элементов – [[Таблица|&amp;lt;code&amp;gt;Table&amp;lt;/code&amp;gt;]], [[Табликс|&amp;lt;code&amp;gt;Tablix&amp;lt;/code&amp;gt;]], &amp;lt;code&amp;gt;Container&amp;lt;/code&amp;gt;;&lt;br /&gt;
*простые элементы, нуждающиеся в переносе и не имеющие свойства &amp;lt;code&amp;gt;PageBreakAtStart&amp;lt;/code&amp;gt;, необходимо разместить внутри контейнера;&lt;br /&gt;
[[Файл:Break2.png|center|thumb]]&lt;br /&gt;
*для контейнера установить у свойства &amp;lt;code&amp;gt;PageBreakAtStart&amp;lt;/code&amp;gt; значение &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Отображение элементов на четных/нечетных страницах==&lt;br /&gt;
По умолчанию все элементы отображаются как на нечетных, так и на четных страницах. Для изменения их отображения необходимо: &lt;br /&gt;
*левой кнопкой мыши выделить необходимый элемент;&lt;br /&gt;
*в свойствах элемента &amp;lt;code&amp;gt;Appearance &amp;gt;&amp;gt; Visibility &amp;gt;&amp;gt; Hidden&amp;lt;/code&amp;gt; выбрать значение &amp;lt;code&amp;gt;Expression…&amp;lt;/code&amp;gt; (рис. 2.18);&lt;br /&gt;
[[Файл:Visibility.png|center]]&lt;br /&gt;
*в открывшемся окне &amp;lt;code&amp;gt;Expression Editor&amp;lt;/code&amp;gt; в поле &amp;lt;code&amp;gt;Expression:&amp;lt;/code&amp;gt; ввести формулу &amp;lt;code&amp;gt;=IIF(Globals!PageNumber MOD 2 = 0, True, False)&amp;lt;/code&amp;gt; (рис. 2.19);&lt;br /&gt;
[[Файл:Visibility2.png|center]]&lt;br /&gt;
*в результате элемент будет отображаться на нечетных страницах и исчезать на четных;&lt;br /&gt;
*для отображения на четных и исчезновения на нечетных необходимо поменять местами &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;False&amp;lt;/code&amp;gt;, тогда выражение примет вид &amp;lt;code&amp;gt;=IIF(Globals!PageNumber MOD 2 = 0, False, True)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Расположение страниц в Z- или N-образном порядке==&lt;br /&gt;
Если в отчете на нескольких страницах во время предварительного просмотра отображаются данные, увеличивающиеся по горизонтали или вертикали, вы можете захотеть, чтобы страницы отчета отображались в определенном порядке. &lt;br /&gt;
В дизайнере поддерживается два типа порядка размещения страниц: Z-образный или N-образный.&lt;br /&gt;
&lt;br /&gt;
===Z-Порядок===&lt;br /&gt;
Z-порядок отображает отчет в виде алфавитной буквы «Z». Это означает, что в отчете в первую очередь отображаются горизонтально расширяющиеся данные, во вторую – данные, расширяющиеся по вертикали: &amp;lt;code&amp;gt;1A &amp;gt;&amp;gt; 1B &amp;gt;&amp;gt; 1С &amp;gt;&amp;gt; 2А &amp;gt;&amp;gt; 2В &amp;gt;&amp;gt; 2С &amp;gt;&amp;gt;3А &amp;gt;&amp;gt; 3В &amp;gt;&amp;gt; 3С&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Multiple-pages-z-order.png|center]]&lt;br /&gt;
&lt;br /&gt;
===N-Порядок===&lt;br /&gt;
Порядок N отображает отчет в виде алфавитной буквы «N». Это означает, что в отчете в первую очередь данные расширяются по вертикали, во вторую – по горизонтали: &amp;lt;code&amp;gt;1A &amp;gt;&amp;gt; 2A &amp;gt;&amp;gt; 3A &amp;gt;&amp;gt; 1B &amp;gt;&amp;gt; 2B &amp;gt;&amp;gt; 3B &amp;gt;&amp;gt; 1C &amp;gt;&amp;gt; 2C &amp;gt;&amp;gt; 3C&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:N-page-layout.png|center]]&lt;br /&gt;
&lt;br /&gt;
===Установка Z-образного или N-образного порядка в отчете===&lt;br /&gt;
*в проводнике отчетов выбрать узел отчета &amp;lt;code&amp;gt;Report&amp;lt;/code&amp;gt;; &lt;br /&gt;
*перейти на панель свойств &amp;lt;code&amp;gt;Layout &amp;gt;&amp;gt; LayoutPagesOrder&amp;lt;/code&amp;gt;;&lt;br /&gt;
*установить для свойства &amp;lt;code&amp;gt;LayoutPagesOrder&amp;lt;/code&amp;gt; значение &amp;lt;code&amp;gt;ZOrder&amp;lt;/code&amp;gt; или &amp;lt;code&amp;gt;NOrder&amp;lt;/code&amp;gt;.&lt;br /&gt;
[[Файл:Order.png|center]]&lt;br /&gt;
&lt;br /&gt;
==Удаление лишних пробелов в конце отчета==&lt;br /&gt;
Свойство &amp;lt;code&amp;gt;ConsumeContainerWhitespace&amp;lt;/code&amp;gt; в отчетах определяет, следует ли удалять лишние пробелы в конце контейнеров отчета (таких как тело отчета или прямоугольники), т.е. предотвращает появление пустых страниц после основных элементов ([[Таблица|таблицы]], [[Табликс|табликса]] и др.). &lt;br /&gt;
Для изменения свойства:&lt;br /&gt;
*в проводнике отчетов выбрать узел отчета &amp;lt;code&amp;gt;Report&amp;lt;/code&amp;gt;; &lt;br /&gt;
*перейти на панель свойств &amp;lt;code&amp;gt;Misc &amp;gt;&amp;gt; ConsumeContainerWhitespace&amp;lt;/code&amp;gt;;&lt;br /&gt;
[[Файл:Whitespace.png|center]]&lt;br /&gt;
*установить для свойства &amp;lt;code&amp;gt;ConsumeContainerWhitespace&amp;lt;/code&amp;gt; значение &amp;lt;code&amp;gt;False&amp;lt;/code&amp;gt; (установлено по умолчанию, не убирает лишние пробелы в конце отчета) или &amp;lt;code&amp;gt;True&amp;lt;/code&amp;gt; (убирает лишние пробелы).&lt;br /&gt;
&lt;br /&gt;
[[Category:Внутренняя документация]]&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
	<entry>
		<id>https://wiki.chemsoft.ru/index.php?title=%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%92%D0%BD%D1%83%D1%82%D1%80%D0%B5%D0%BD%D0%BD%D1%8F%D1%8F_%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=291</id>
		<title>Категория:Внутренняя документация</title>
		<link rel="alternate" type="text/html" href="https://wiki.chemsoft.ru/index.php?title=%D0%9A%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D1%8F:%D0%92%D0%BD%D1%83%D1%82%D1%80%D0%B5%D0%BD%D0%BD%D1%8F%D1%8F_%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D1%8F&amp;diff=291"/>
		<updated>2025-12-26T04:39:30Z</updated>

		<summary type="html">&lt;p&gt;Sonikku: Новая страница: «В данной категории находятся все страницы, относящиеся ко внутренней документации ООО «Химсофт».»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;В данной категории находятся все страницы, относящиеся ко внутренней документации ООО «Химсофт».&lt;/div&gt;</summary>
		<author><name>Sonikku</name></author>
	</entry>
</feed>