<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.fetbuk.ru/w/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3ARoutemap</id>
	<title>Модуль:Routemap - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.fetbuk.ru/w/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3ARoutemap"/>
	<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Routemap&amp;action=history"/>
	<updated>2026-05-06T16:11:13Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Routemap&amp;diff=98&amp;oldid=prev</id>
		<title>WerySkok: 1 версия импортирована</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Routemap&amp;diff=98&amp;oldid=prev"/>
		<updated>2021-05-21T20:36:22Z</updated>

		<summary type="html">&lt;p&gt;1 версия импортирована&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия 20:36, 21 мая 2021&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>WerySkok</name></author>
	</entry>
	<entry>
		<id>https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Routemap&amp;diff=97&amp;oldid=prev</id>
		<title>вп&gt;Sunpriat: Lint errors: внутрь вставляют div, что разрывает span; в en:Module:Routemap на этих местах div</title>
		<link rel="alternate" type="text/html" href="https://wiki.fetbuk.ru/w/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Routemap&amp;diff=97&amp;oldid=prev"/>
		<updated>2019-05-10T10:27:54Z</updated>

		<summary type="html">&lt;p&gt;Lint errors: внутрь вставляют div, что разрывает span; в en:Module:Routemap на этих местах div&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local i18n = {&lt;br /&gt;
    errors = {&lt;br /&gt;
        [&amp;quot;parameter-missing&amp;quot;] = &amp;quot;Не указан обязательный параметр!&amp;quot;,&lt;br /&gt;
        [&amp;quot;collapsible-block-not-closed&amp;quot;] = &amp;quot;Сворачивающийся блок не закрыт!&amp;quot;,&lt;br /&gt;
        [&amp;quot;collapsible-block-not-open&amp;quot;] = &amp;quot;Сворачивающийся блок не был открыт, либо лишняя команда закрытия&amp;quot;,&lt;br /&gt;
        [&amp;quot;collapsible-block-empty&amp;quot;] = &amp;quot;Невозможно создать пустой сворачивающийся блок!&amp;quot;,&lt;br /&gt;
        [&amp;quot;collapsible-block-no-first-row&amp;quot;] = &amp;quot;Нет первой строки для сворачивающегося блока!&amp;quot;,&lt;br /&gt;
        [&amp;quot;collapsible-block-no-replacement&amp;quot;] = &amp;quot;Нет строки замещения для сворачивающегося блока!&amp;quot;,&lt;br /&gt;
        [&amp;quot;colspan-less-rows-than-set&amp;quot;] = &amp;quot;Строк меньше, чем указано к объединению!&amp;quot;,&lt;br /&gt;
    },&lt;br /&gt;
    [&amp;quot;error-categories&amp;quot;] = {&lt;br /&gt;
        default = &amp;#039;[[Категория:Википедия:Статьи с неверно заполненными маршрутными картами]]&amp;#039;&lt;br /&gt;
    },&lt;br /&gt;
    html = {&lt;br /&gt;
        [&amp;quot;cell-icon-fmt&amp;quot;] = &amp;#039;\&lt;br /&gt;
|[[File:BSicon_%s.svg|x20px|link=%s|alt=]]&amp;#039;,&lt;br /&gt;
        [&amp;quot;cell-overlapicon-fmt&amp;quot;] = &amp;#039;&amp;lt;div style=&amp;quot;position:absolute;left:0px;top:0px;padding:0&amp;quot;&amp;gt;[[File:BSicon_%s.svg|x20px|link=%s|alt=]]&amp;lt;/div&amp;gt;&amp;#039;,&lt;br /&gt;
        [&amp;quot;cell-icon-fmt-with-overlap&amp;quot;] = &amp;#039;\&lt;br /&gt;
|&amp;lt;div style=&amp;quot;position:relative&amp;quot;&amp;gt;%s&amp;lt;/div&amp;gt;[[File:BSicon_%s.svg|x20px|link=|alt=]]&amp;#039;,&lt;br /&gt;
        [&amp;quot;cell-filler-fmt&amp;quot;] = &amp;#039;\n|style=&amp;quot;width:8px&amp;quot;| ||style=&amp;quot;width:4px !important; background-color:%s&amp;quot;| ||style=&amp;quot;width:8px&amp;quot;|&amp;#039;,&lt;br /&gt;
        [&amp;quot;cell-filler-empty-fmt&amp;quot;] = &amp;#039;\n|style=&amp;quot;width:%s;min-width:%s&amp;quot;|&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
        [&amp;quot;row-linfo4-fmt&amp;quot;] = &amp;#039;\&lt;br /&gt;
|style=&amp;quot;padding-right:3px;text-align:left;%s&amp;quot;|&amp;lt;div style=&amp;quot;font-size:90%%;&amp;quot;&amp;gt;%s&amp;lt;/div&amp;gt;&amp;#039;,-- parameters:linfo4-width, linfo4&lt;br /&gt;
        [&amp;quot;row-linfo3-fmt&amp;quot;] = &amp;#039;&amp;lt;div style=&amp;quot;font-size:90%%;&amp;quot;&amp;gt;%s&amp;lt;/div&amp;gt; &amp;#039;,&lt;br /&gt;
        [&amp;quot;row-rinfo3-fmt&amp;quot;] = &amp;#039; &amp;lt;div style=&amp;quot;font-size:90%%;&amp;quot;&amp;gt;%s&amp;lt;/div&amp;gt;&amp;#039;,&lt;br /&gt;
        [&amp;quot;row-rinfo4-fmt&amp;quot;] = &amp;#039;\&lt;br /&gt;
|style=&amp;quot;padding-left:3px;text-align:right;%s&amp;quot;|&amp;lt;div style=&amp;quot;font-size:90%%;&amp;quot;&amp;gt;%s&amp;lt;/div&amp;gt;&amp;#039;,-- parameters:rinfo4-width, rinfo4&lt;br /&gt;
&lt;br /&gt;
        -- в «margin:auto !important» у таблицы «!important» — для мобильного вида&lt;br /&gt;
        [&amp;quot;row-general-fmt&amp;quot;] = &amp;#039;\&lt;br /&gt;
|-%s\&lt;br /&gt;
|colspan=&amp;quot;%s&amp;quot; style=&amp;quot;text-align:right;%s&amp;quot;|%s\&lt;br /&gt;
|style=&amp;quot;text-align:left;padding:0 %s;%s&amp;quot;|&amp;lt;div style=&amp;quot;font-size:90%%;&amp;quot;&amp;gt;%s&amp;lt;/div&amp;gt;\&lt;br /&gt;
|style=&amp;quot;padding:0;background-color:%s&amp;quot;|\&lt;br /&gt;
{|cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;0&amp;quot; style=&amp;quot;margin:auto !important; text-align:center; line-height: 0px !important; padding:0 !important;&amp;quot;\&lt;br /&gt;
|-%s\&lt;br /&gt;
|}\&lt;br /&gt;
|style=&amp;quot;text-align:right;padding:0 %s;%s&amp;quot;|&amp;lt;div style=&amp;quot;font-size:90%%;&amp;quot;&amp;gt;%s&amp;lt;/div&amp;gt;\&lt;br /&gt;
|colspan=&amp;quot;%s&amp;quot; style=&amp;quot;text-align:left;%s&amp;quot;|%s%s&amp;#039;,-- parameters: linfo4-fmt, colspan-left, linfo3+2-width, linfo3+2, linfo1-pad, linfo1-width, linfo1, bg, cells, rinfo1-pad, rinfo1-width, rinfo1, colspan-right, rinfo2+3-width, rinfo2+3, rinfo4-fmt&lt;br /&gt;
&lt;br /&gt;
        [&amp;quot;row-collapsible-begin-fmt&amp;quot;] = &amp;#039;\&lt;br /&gt;
|-\&lt;br /&gt;
|colspan=&amp;quot;7&amp;quot; style=&amp;quot;padding:0 !important;background-color:%s&amp;quot;|\&lt;br /&gt;
{|class=&amp;quot;%s%s&amp;quot; cellpadding=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; style=&amp;quot;%s padding:0 !important;vertical-align:middle;margin:none !important;white-space:nowrap&amp;quot;&amp;#039;,-- parameters: bg, &amp;quot;collapsible &amp;quot;/&amp;quot;mw-collapsible mw-&amp;quot;, collapse-state, &amp;quot;float:right;&amp;quot; / &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        [&amp;quot;row-collapsible-end-fmt&amp;quot;] = &amp;#039;\n|}&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
        [&amp;quot;row-collapsible-left-button-width&amp;quot;] = &amp;#039;50px&amp;#039;,-- 50px is the minimal width for [показать] / [скрыть] button. Use 40px for [show] / [hide]&lt;br /&gt;
        [&amp;quot;row-collapsible-left-button-fmt&amp;quot;] = &amp;#039;\n! style=&amp;quot;padding-right:3px;min-width:%s;%s&amp;quot; |&amp;#039;,--parameters: left-button-width, linfo4-width&lt;br /&gt;
        [&amp;quot;row-collapsible-left-linfo4+3+2-fmt&amp;quot;] = &amp;#039;\&lt;br /&gt;
{|cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;0&amp;quot; width=&amp;quot;100%%&amp;quot;\&lt;br /&gt;
|style=&amp;quot;padding:0 3px 0 1px;text-align:left;&amp;quot;| &amp;lt;div style=&amp;quot;font-size:90%%;&amp;quot;&amp;gt;%s&amp;lt;/div&amp;gt;\&lt;br /&gt;
|style=&amp;quot;text-align:right&amp;quot;| %s\&lt;br /&gt;
|}&amp;#039;,-- parameters: linfo4, linfo3+2&lt;br /&gt;
        [&amp;quot;row-collapsible-right-button-width&amp;quot;] = &amp;#039;72px&amp;#039;,-- 72px is the minimal width for [развернуть] / [свернуть] button at 90%. Use 58px for [expand] / [collapse]&lt;br /&gt;
        [&amp;quot;row-collapsible-right-rinfo2+3+4-fmt&amp;quot;] = &amp;#039;\&lt;br /&gt;
{|cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;0&amp;quot; width=&amp;quot;100%%&amp;quot;\&lt;br /&gt;
|style=&amp;quot;text-align:left&amp;quot;| %s\&lt;br /&gt;
|style=&amp;quot;padding:0 1px 0 3px;text-align:right;&amp;quot;| &amp;lt;div style=&amp;quot;font-size:90%%;&amp;quot;&amp;gt;%s&amp;lt;/div&amp;gt;\&lt;br /&gt;
|}&amp;#039;,-- parameters: rinfo2+3, linfo4&lt;br /&gt;
        [&amp;quot;row-collapsible-right-button-fmt&amp;quot;] = &amp;#039;\n| style=&amp;quot;padding-left:3px;font-size:90%%;min-width:%s;%s&amp;quot; |&amp;#039;,--parameters: right-button-width, rinfo4-width&lt;br /&gt;
 &lt;br /&gt;
        [&amp;quot;row-collapsible-replace-begin-fmt&amp;quot;] = &amp;#039;\&lt;br /&gt;
|-\&lt;br /&gt;
|colspan=&amp;quot;7&amp;quot; style=&amp;quot;padding:0 %s&amp;quot;|&amp;lt;div style=&amp;quot;position:relative&amp;quot;&amp;gt;\&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;0&amp;quot; style=&amp;quot;position:absolute;bottom:0px;%s vertical-align:middle;white-space:nowrap;background-color:%s&amp;quot;&amp;#039;,-- parameters: &amp;quot;right-button-width 0 0&amp;quot; / &amp;quot;0 0 left-button-width&amp;quot;, &amp;quot;right:0px&amp;quot; / &amp;quot;&amp;quot;, bg&lt;br /&gt;
        [&amp;quot;row-collapsible-replace-end-fmt&amp;quot;] = &amp;#039;\n|}&amp;lt;/div&amp;gt;&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
        [&amp;quot;colspan-fmt&amp;quot;] = &amp;#039;%s\n|-\n| colspan=&amp;quot;7&amp;quot; style=&amp;quot;background-color:%s;text-align:%s;%s&amp;quot;|\n%s&amp;#039;,&lt;br /&gt;
        [&amp;quot;empty-row-fmt&amp;quot;] = &amp;#039;\n|-\n| style=&amp;quot;padding-right:3px;%s&amp;quot; |\n| style=&amp;quot;%s&amp;quot; |\n| style=&amp;quot;padding:0 %s;%s&amp;quot; |\n|\n| style=&amp;quot;padding:0 %s;%s&amp;quot; |\n| style=&amp;quot;%s&amp;quot; |\n| style=&amp;quot;padding-left:3px;%s&amp;quot; |&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
local p,q={},{}&lt;br /&gt;
&lt;br /&gt;
local function formaterror(key,param)&lt;br /&gt;
    local result = mw.ustring.format(i18n.html[&amp;#039;colspan-fmt&amp;#039;], &amp;#039;&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;&amp;#039; .. mw.ustring.format(i18n.errors[key] or (tostring(key) .. &amp;#039; %s&amp;#039;),&lt;br /&gt;
        tostring(param or &amp;#039;&amp;#039;)) .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;)&lt;br /&gt;
    if mw.site.namespaces[mw.title.getCurrentTitle().namespace].isContent then result = result .. (i18n[&amp;#039;errors-categories&amp;#039;][key] or i18n[&amp;#039;errors-categories&amp;#039;].default or &amp;#039;&amp;#039;) end&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function RGBbyCode(code)-- RGB codes for BSicon sets at Commons:Category:Icons for railway descriptions/other colors&lt;br /&gt;
    local colors = {--       Any changes should be discussed at Commons:Talk:BSicon/Colors&lt;br /&gt;
        bahn     = &amp;#039;BE2D2C&amp;#039;, ex          = &amp;#039;D77F7E&amp;#039;,&lt;br /&gt;
        u        = &amp;#039;003399&amp;#039;, uex         = &amp;#039;6281C0&amp;#039;,&lt;br /&gt;
        f        = &amp;#039;008000&amp;#039;, fex         = &amp;#039;64B164&amp;#039;,&lt;br /&gt;
        g        = &amp;#039;2CA05A&amp;#039;, gex         = &amp;#039;7EC49A&amp;#039;,&lt;br /&gt;
        azure    = &amp;#039;3399FF&amp;#039;, ex_azure    = &amp;#039;99CCFF&amp;#039;,&lt;br /&gt;
        black    = &amp;#039;000000&amp;#039;, ex_black    = &amp;#039;646464&amp;#039;,&lt;br /&gt;
        blue     = &amp;#039;0078BE&amp;#039;, ex_blue     = &amp;#039;64ACD6&amp;#039;,&lt;br /&gt;
        brown    = &amp;#039;8D5B2D&amp;#039;, ex_brown    = &amp;#039;B89A7F&amp;#039;,&lt;br /&gt;
        carrot   = &amp;#039;ED9121&amp;#039;, ex_carrot   = &amp;#039;F1BA76&amp;#039;,&lt;br /&gt;
        cerulean = &amp;#039;1A8BB9&amp;#039;, ex_cerulean = &amp;#039;73B7D3&amp;#039;,&lt;br /&gt;
        cyan     = &amp;#039;40E0D0&amp;#039;, ex_cyan     = &amp;#039;8AEAE1&amp;#039;,&lt;br /&gt;
        deepsky  = &amp;#039;00BFFF&amp;#039;, ex_deepsky  = &amp;#039;63D6FC&amp;#039;,&lt;br /&gt;
        denim    = &amp;#039;00619F&amp;#039;, ex_denim    = &amp;#039;649EC3&amp;#039;,&lt;br /&gt;
        fuchsia  = &amp;#039;B5198D&amp;#039;, ex_fuchsia  = &amp;#039;D173B8&amp;#039;,&lt;br /&gt;
        golden   = &amp;#039;D7C447&amp;#039;, ex_golden   = &amp;#039;E5DA8E&amp;#039;,&lt;br /&gt;
        green    = &amp;#039;2DBE2C&amp;#039;, ex_green    = &amp;#039;7FD67E&amp;#039;,&lt;br /&gt;
        grey     = &amp;#039;999999&amp;#039;, ex_grey     = &amp;#039;C0C0C0&amp;#039;,&lt;br /&gt;
        jade     = &amp;#039;53B147&amp;#039;, ex_jade     = &amp;#039;95CE8E&amp;#039;,&lt;br /&gt;
        lavender = &amp;#039;9999FF&amp;#039;, ex_lavender = &amp;#039;C0C0FF&amp;#039;,&lt;br /&gt;
        lime     = &amp;#039;99CC00&amp;#039;, ex_lime     = &amp;#039;D1E681&amp;#039;,&lt;br /&gt;
        maroon   = &amp;#039;800000&amp;#039;, ex_maroon   = &amp;#039;B16464&amp;#039;,&lt;br /&gt;
        ochre    = &amp;#039;CC6600&amp;#039;, ex_ochre    = &amp;#039;DEA164&amp;#039;,&lt;br /&gt;
        olive    = &amp;#039;837902&amp;#039;, ex_olive    = &amp;#039;B2AC64&amp;#039;,&lt;br /&gt;
        orange   = &amp;#039;FF6600&amp;#039;, ex_orange   = &amp;#039;FF9955&amp;#039;,&lt;br /&gt;
        pink     = &amp;#039;F0668D&amp;#039;, ex_pink     = &amp;#039;F4A1B8&amp;#039;,&lt;br /&gt;
        purple   = &amp;#039;8171AC&amp;#039;, ex_purple   = &amp;#039;B1A8CB&amp;#039;,&lt;br /&gt;
        red      = &amp;#039;EF161E&amp;#039;, ex_red      = &amp;#039;F37176&amp;#039;,&lt;br /&gt;
        ruby     = &amp;#039;CC0066&amp;#039;, ex_ruby     = &amp;#039;DE64A1&amp;#039;, ex_exruby = &amp;#039;E89FC4&amp;#039;,&lt;br /&gt;
        saffron  = &amp;#039;FFAB2E&amp;#039;, ex_saffron  = &amp;#039;FFC969&amp;#039;,&lt;br /&gt;
        sky      = &amp;#039;069DD3&amp;#039;, ex_sky      = &amp;#039;67C2E3&amp;#039;,&lt;br /&gt;
        steel    = &amp;#039;A1B3D4&amp;#039;, ex_steel    = &amp;#039;C6D1E5&amp;#039;,&lt;br /&gt;
        teal     = &amp;#039;339999&amp;#039;, ex_teal     = &amp;#039;82C0C0&amp;#039;, ex_exteal = &amp;#039;B1D6D6&amp;#039;,&lt;br /&gt;
        violet   = &amp;#039;800080&amp;#039;, ex_violet   = &amp;#039;B164B1&amp;#039;,&lt;br /&gt;
        yellow   = &amp;#039;FFD702&amp;#039;, ex_yellow   = &amp;#039;FFEB81&amp;#039;,&lt;br /&gt;
    }&lt;br /&gt;
    return colors[code] or colors.bahn&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function cell(icon,overlapIcons)&lt;br /&gt;
--Icon handling. Each icon is defined as in the following example:&lt;br /&gt;
--icon ID!~overlap icon ID!@image link target&lt;br /&gt;
--No limit on overlap icons, just separate them by &amp;quot;!~&amp;quot;.&lt;br /&gt;
    local tmp,link={},&amp;#039;&amp;#039;&lt;br /&gt;
    if #overlapIcons&amp;gt;0 then&lt;br /&gt;
        tmp = mw.text.split(overlapIcons[#overlapIcons], &amp;#039;!@&amp;#039;)&lt;br /&gt;
        overlapIcons[#overlapIcons] = tmp[1]&lt;br /&gt;
        if #tmp &amp;gt; 1 then link = tmp[2] end&lt;br /&gt;
        tmp = {}&lt;br /&gt;
        for i,v in ipairs(overlapIcons) do&lt;br /&gt;
            if i==#overlapIcons then local link=link else local link=&amp;#039;&amp;#039; end&lt;br /&gt;
            table.insert(tmp,mw.ustring.format(i18n.html[&amp;#039;cell-overlapicon-fmt&amp;#039;],mw.text.trim(v),link))end&lt;br /&gt;
        return mw.ustring.format(i18n.html[&amp;#039;cell-icon-fmt-with-overlap&amp;#039;],mw.text.trim(table.concat(tmp)),icon)&lt;br /&gt;
    end&lt;br /&gt;
    tmp = mw.text.split(icon, &amp;#039;!@&amp;#039;)&lt;br /&gt;
    icon = mw.text.trim(tmp[1])&lt;br /&gt;
    if #tmp &amp;gt; 1 then link = tmp[2] end&lt;br /&gt;
    if icon ~= &amp;#039;&amp;#039; then&lt;br /&gt;
    	return mw.ustring.format(i18n.html[&amp;#039;cell-icon-fmt&amp;#039;], icon, link)&lt;br /&gt;
    else&lt;br /&gt;
    	return mw.ustring.format(i18n.html[&amp;#039;cell-filler-empty-fmt&amp;#039;], &amp;#039;20px&amp;#039;, &amp;#039;20px&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
local function fillercell(code)&lt;br /&gt;
    if code == &amp;#039;&amp;#039; then&lt;br /&gt;
    	return mw.ustring.format(i18n.html[&amp;#039;cell-filler-empty-fmt&amp;#039;], &amp;#039;20px&amp;#039;, &amp;#039;20px&amp;#039;)&lt;br /&gt;
    elseif code == &amp;#039;d&amp;#039; then&lt;br /&gt;
    	return mw.ustring.format(i18n.html[&amp;#039;cell-filler-empty-fmt&amp;#039;], &amp;#039;10px&amp;#039;, &amp;#039;10px&amp;#039;)&lt;br /&gt;
    elseif string.sub(code,1,1) == &amp;#039;#&amp;#039; then&lt;br /&gt;
    	return mw.ustring.format(i18n.html[&amp;#039;cell-filler-fmt&amp;#039;], code)&lt;br /&gt;
    else&lt;br /&gt;
    	return mw.ustring.format(i18n.html[&amp;#039;cell-filler-fmt&amp;#039;],&amp;#039;#&amp;#039; .. RGBbyCode(code))&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
local function properties(str)&lt;br /&gt;
--str is a combination of properties with following syntax:&lt;br /&gt;
--[property name=value[!@property name1=value1[!@property name1=value1]]] and so on&lt;br /&gt;
    local result = {}&lt;br /&gt;
    for i, v in ipairs(mw.text.split(str, &amp;#039;!@&amp;#039;)) do&lt;br /&gt;
        if v ~= &amp;#039;&amp;#039; then&lt;br /&gt;
            local t = mw.text.split(v, &amp;#039;=&amp;#039;)&lt;br /&gt;
            table.insert(result, t[1])&lt;br /&gt;
            result[t[1]] = table.concat(t, &amp;#039;=&amp;#039;, 2) or &amp;#039;&amp;#039;--fill table with pairs &amp;quot;property&amp;quot;=&amp;quot;value&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function row(pattern,noformatting,filler)&lt;br /&gt;
--Row handling. Each row looks like the following:&lt;br /&gt;
--row properties~~linfo4~~linfo3~~linfo2~~linfo1! !(icon pattern)~~rinfo1~~rinfo2~~rinfo3~~rinfo4~~row properties&lt;br /&gt;
    local result = {[&amp;#039;linfo4&amp;#039;] = &amp;#039;&amp;#039;, [&amp;#039;linfo3+2&amp;#039;] = &amp;#039;&amp;#039;, [&amp;#039;linfo1&amp;#039;] = &amp;#039;&amp;#039;, [&amp;#039;cells&amp;#039;] = {}, [&amp;#039;rinfo1&amp;#039;] = &amp;#039;&amp;#039;, [&amp;#039;rinfo2+3&amp;#039;] = &amp;#039;&amp;#039;, [&amp;#039;rinfo4&amp;#039;] = &amp;#039;&amp;#039;, [&amp;#039;rowProp&amp;#039;] = {}}&lt;br /&gt;
    local lcolspan, rcolspan, linfo4_fmt, rinfo4_fmt = &amp;#039;2&amp;#039;, &amp;#039;2&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;&amp;#039;&lt;br /&gt;
    local left, rigth, icons, overlapIcons, tmp = {}, {}, {}, {}, mw.text.split(pattern, &amp;#039;! !&amp;#039;)&lt;br /&gt;
    if #tmp &amp;gt; 1 then--splitting the pattern by &amp;#039;! !&amp;#039;&lt;br /&gt;
        left = tmp[1] ; right = tmp[2]&lt;br /&gt;
    else&lt;br /&gt;
        left = &amp;#039;&amp;#039; ; right = tmp[1] or &amp;#039;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    tmp = mw.text.split(left, &amp;#039;~~&amp;#039;)--analysing the left part&lt;br /&gt;
    if #tmp &amp;gt; 1 then--if there are several ~~&lt;br /&gt;
        result[&amp;#039;linfo1&amp;#039;] = mw.getCurrentFrame():preprocess(mw.text.trim(tmp[#tmp]))&lt;br /&gt;
        result[&amp;#039;linfo3+2&amp;#039;] = mw.text.trim(tmp[#tmp - 1])&lt;br /&gt;
        if #tmp &amp;gt; 2 then&lt;br /&gt;
            tmp[#tmp - 2] = mw.text.trim(tmp[#tmp - 2])&lt;br /&gt;
            if tmp[#tmp - 2] ~= &amp;#039;&amp;#039; then result[&amp;#039;linfo3+2&amp;#039;] = mw.ustring.format(i18n.html[&amp;#039;row-linfo3-fmt&amp;#039;], tmp[#tmp - 2]) .. result[&amp;#039;linfo3+2&amp;#039;] end&lt;br /&gt;
            if #tmp &amp;gt; 3 then&lt;br /&gt;
                tmp[#tmp - 3] = mw.text.trim(tmp[#tmp - 3])&lt;br /&gt;
                if tmp[#tmp - 3] ~= &amp;#039;&amp;#039; then&lt;br /&gt;
                    result[&amp;#039;linfo4&amp;#039;] = mw.getCurrentFrame():preprocess(tmp[#tmp - 3])&lt;br /&gt;
                    lcolspan = &amp;#039;1&amp;#039;&lt;br /&gt;
                    linfo4_fmt = mw.ustring.format(i18n.html[&amp;#039;row-linfo4-fmt&amp;#039;], &amp;#039;&amp;#039;, result[&amp;#039;linfo4&amp;#039;])&lt;br /&gt;
                end&lt;br /&gt;
                if #tmp &amp;gt; 4 then result[&amp;#039;rowProp&amp;#039;] = properties(mw.text.trim(tmp[#tmp - 4])) end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    else--assume only linfo2 was provided.&lt;br /&gt;
        result[&amp;#039;linfo3+2&amp;#039;] = mw.text.trim(tmp[1])&lt;br /&gt;
    end&lt;br /&gt;
    result[&amp;#039;linfo3+2&amp;#039;] = mw.getCurrentFrame():preprocess(result[&amp;#039;linfo3+2&amp;#039;])--expand possible templates in info.&lt;br /&gt;
 &lt;br /&gt;
    tmp = mw.text.split(right, &amp;#039;~~&amp;#039;)--analysing the right part&lt;br /&gt;
    if #tmp &amp;gt; 2 then&lt;br /&gt;
        result[&amp;#039;rinfo1&amp;#039;] = mw.getCurrentFrame():preprocess(mw.text.trim(tmp[2]))&lt;br /&gt;
        result[&amp;#039;rinfo2+3&amp;#039;] = mw.text.trim(tmp[3])&lt;br /&gt;
        if #tmp &amp;gt; 3 then&lt;br /&gt;
            tmp[4] = mw.text.trim(tmp[4])&lt;br /&gt;
            if tmp[4] ~= &amp;#039;&amp;#039; then result[&amp;#039;rinfo2+3&amp;#039;] = result[&amp;#039;rinfo2+3&amp;#039;] .. mw.ustring.format(i18n.html[&amp;#039;row-rinfo3-fmt&amp;#039;], tmp[4]) end&lt;br /&gt;
            if #tmp &amp;gt; 4 then&lt;br /&gt;
                tmp[5] = mw.text.trim(tmp[5])&lt;br /&gt;
                if tmp[5] ~= &amp;#039;&amp;#039; then&lt;br /&gt;
                    result[&amp;#039;rinfo4&amp;#039;] = mw.getCurrentFrame():preprocess(tmp[5])&lt;br /&gt;
                    rcolspan = &amp;#039;1&amp;#039;&lt;br /&gt;
                    rinfo4_fmt = mw.ustring.format(i18n.html[&amp;#039;row-rinfo4-fmt&amp;#039;], &amp;#039;&amp;#039;, result[&amp;#039;rinfo4&amp;#039;])&lt;br /&gt;
                end&lt;br /&gt;
                if #tmp &amp;gt; 5 then result[&amp;#039;rowProp&amp;#039;] = properties(mw.text.trim(tmp[6])) end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    else--assume only rinfo2 was provided.&lt;br /&gt;
        result[&amp;#039;rinfo2+3&amp;#039;] = mw.text.trim(tmp[2] or &amp;#039;&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
    result[&amp;#039;rinfo2+3&amp;#039;] = mw.getCurrentFrame():preprocess(result[&amp;#039;rinfo2+3&amp;#039;])&lt;br /&gt;
&lt;br /&gt;
    icons = mw.text.split(tmp[1], &amp;#039;\\&amp;#039;)--splitting the string of icons first by &amp;quot;\&amp;quot;&lt;br /&gt;
    if type(filler) == &amp;#039;string&amp;#039; then&lt;br /&gt;
    	result[&amp;#039;cells&amp;#039;][1] = &amp;#039;style=&amp;quot;height:&amp;#039; .. filler .. &amp;#039;&amp;quot;&amp;#039;--row parameter before any cells&lt;br /&gt;
        for i, v in ipairs(icons) do table.insert(result[&amp;#039;cells&amp;#039;], fillercell(v)) end--no !@ or !~ for filler row&lt;br /&gt;
    else&lt;br /&gt;
        for i, v in ipairs(icons) do&lt;br /&gt;
            tmp = mw.text.split(v, &amp;#039;!~&amp;#039;)&lt;br /&gt;
            icons[i] = tmp[1]&lt;br /&gt;
            table.remove(tmp, 1)&lt;br /&gt;
            table.insert(overlapIcons, tmp)&lt;br /&gt;
        end&lt;br /&gt;
        for i, v in ipairs(icons) do table.insert(result[&amp;#039;cells&amp;#039;], cell(v, overlapIcons[i])) end&lt;br /&gt;
    end&lt;br /&gt;
    result[&amp;#039;cells&amp;#039;] = table.concat(result[&amp;#039;cells&amp;#039;])&lt;br /&gt;
    if result[&amp;#039;rowProp&amp;#039;][&amp;#039;bg&amp;#039;] == nil or result[&amp;#039;rowProp&amp;#039;][&amp;#039;bg&amp;#039;] == &amp;#039;&amp;#039; then result[&amp;#039;rowProp&amp;#039;][&amp;#039;bg&amp;#039;] = &amp;#039;transparent&amp;#039; end&lt;br /&gt;
&lt;br /&gt;
    if noformatting then&lt;br /&gt;
    	return result&lt;br /&gt;
    else&lt;br /&gt;
    	return  mw.ustring.format(i18n.html[&amp;#039;row-general-fmt&amp;#039;], linfo4_fmt, lcolspan, &amp;#039;&amp;#039;, result[&amp;#039;linfo3+2&amp;#039;], q.linfo1_pad, &amp;#039;&amp;#039;, result[&amp;#039;linfo1&amp;#039;], result[&amp;#039;rowProp&amp;#039;][&amp;#039;bg&amp;#039;],&lt;br /&gt;
    		result[&amp;#039;cells&amp;#039;], q.rinfo1_pad, &amp;#039;&amp;#039;, result[&amp;#039;rinfo1&amp;#039;], rcolspan, &amp;#039;&amp;#039;, result[&amp;#039;rinfo2+3&amp;#039;], rinfo4_fmt)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
q = {collapsibles = -1, text_width = {&amp;#039;&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;&amp;#039;}, linfo1_pad = &amp;#039;3px&amp;#039;, rinfo1_pad = &amp;#039;3px&amp;#039;, bg = &amp;#039;#f9f9f9&amp;#039;}&lt;br /&gt;
q.isKeyword = function(pattern, i, rows, justTest)&lt;br /&gt;
    if string.sub(pattern, 1, 1) ~= &amp;#039;-&amp;#039; then if justTest then return false else return nil end end--not a valid keyword&lt;br /&gt;
    local tmp = mw.text.split(string.sub(pattern, 2), &amp;#039;%-&amp;#039;)&lt;br /&gt;
    if type(q[tmp[1]])==&amp;quot;function&amp;quot; and tmp[1] ~= &amp;#039;isKeyword&amp;#039; then&lt;br /&gt;
        if justTest then return tmp[1] else return q[tmp[1]](tmp, i, rows) end--valid keyword&lt;br /&gt;
    else&lt;br /&gt;
        if justTest then return false else return nil end&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
q[&amp;#039;startCollapsible&amp;#039;] = function(params, i, rows)&lt;br /&gt;
    table.remove(rows, i)&lt;br /&gt;
    local tmp = q.isKeyword(rows[i], i, rows, true)&lt;br /&gt;
    if tmp then&lt;br /&gt;
    	if tmp == &amp;#039;endCollapsible&amp;#039; then return formaterror(&amp;#039;collapsible-block-empty&amp;#039;)&lt;br /&gt;
        else return formaterror(&amp;#039;collapsible-block-no-first-row&amp;#039;) ..  q.isKeyword(rows[i], i, rows) --no valid keywords that can follow &amp;quot;startCollapsible&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if q.collapsibles == -1 then q.collapsibles = 1 else q.collapsibles = q.collapsibles + 1 end--q.collapsibles == -1 means there are no collapsibles at all; 0 - all closed; &amp;gt;0 - some not closed&lt;br /&gt;
    local collapsed, replace, props = params[2], params[3] or &amp;#039;&amp;#039;, properties(table.concat(params, &amp;#039;-&amp;#039;, 4))--params[1] is the keyword name so all indices are shifted by one.&lt;br /&gt;
    if collapsed == nil or collapsed == &amp;#039;&amp;#039; then collapsed = &amp;#039;collapsed&amp;#039; end&lt;br /&gt;
    if props[&amp;#039;bg&amp;#039;] == nil or props[&amp;#039;bg&amp;#039;] == &amp;#039;&amp;#039; then props[&amp;#039;bg&amp;#039;] = &amp;#039;transparent&amp;#039; ; props[&amp;#039;bg-replace&amp;#039;] = q.bg else props[&amp;#039;bg-replace&amp;#039;] = props[&amp;#039;bg&amp;#039;] end&lt;br /&gt;
    local mode, float, result&lt;br /&gt;
    if q.rinfo1_pad == &amp;#039;&amp;#039; then mode = &amp;#039;collapsible &amp;#039; ; float = &amp;#039;float:right;&amp;#039;&lt;br /&gt;
    else mode = &amp;#039;mw-collapsible mw-&amp;#039; ; float = &amp;#039;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    result = mw.ustring.format(i18n.html[&amp;quot;row-collapsible-begin-fmt&amp;quot;], props[&amp;#039;bg&amp;#039;], mode, collapsed, float)&lt;br /&gt;
    tmp = row(rows[i], true, nil)&lt;br /&gt;
    local linfo4_3_2_fmt, rinfo2_3_4_fmt = &amp;#039;&amp;#039;, &amp;#039;&amp;#039;&lt;br /&gt;
    if q.rinfo1_pad == &amp;#039;&amp;#039; then&lt;br /&gt;
        if tmp[&amp;#039;linfo4&amp;#039;] ~= &amp;#039;&amp;#039; or tmp[&amp;#039;linfo3+2&amp;#039;] ~= &amp;#039;&amp;#039; then linfo4_3_2_fmt = mw.ustring.format(i18n.html[&amp;#039;row-collapsible-left-linfo4+3+2-fmt&amp;#039;], tmp[&amp;#039;linfo4&amp;#039;], tmp[&amp;#039;linfo3+2&amp;#039;]) end&lt;br /&gt;
        result = result .. mw.ustring.format(i18n.html[&amp;#039;row-general-fmt&amp;#039;], mw.ustring.format(i18n.html[&amp;#039;row-collapsible-left-button-fmt&amp;#039;], i18n.html[&amp;#039;row-collapsible-left-button-width&amp;#039;], q.text_width[1]),&lt;br /&gt;
        	&amp;#039;1&amp;#039;, q.text_width[2], linfo4_3_2_fmt, q.linfo1_pad, q.text_width[3], tmp[&amp;#039;linfo1&amp;#039;], tmp[&amp;#039;rowProp&amp;#039;][&amp;#039;bg&amp;#039;], tmp[&amp;#039;cells&amp;#039;], &amp;#039;&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;1&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;&amp;#039;, mw.ustring.format(i18n.html[&amp;#039;row-rinfo4-fmt&amp;#039;], &amp;#039;&amp;#039;, &amp;#039;&amp;#039;))&lt;br /&gt;
    else&lt;br /&gt;
        if tmp[&amp;#039;rinfo4&amp;#039;] ~= &amp;#039;&amp;#039; or tmp[&amp;#039;rinfo2+3&amp;#039;] ~= &amp;#039;&amp;#039; then rinfo2_3_4_fmt = mw.ustring.format(i18n.html[&amp;#039;row-collapsible-right-rinfo2+3+4-fmt&amp;#039;], tmp[&amp;#039;rinfo2+3&amp;#039;], tmp[&amp;#039;rinfo4&amp;#039;]) end&lt;br /&gt;
        result = result .. mw.ustring.format(i18n.html[&amp;#039;row-general-fmt&amp;#039;], mw.ustring.format(i18n.html[&amp;#039;row-linfo4-fmt&amp;#039;], q.text_width[1], tmp[&amp;#039;linfo4&amp;#039;]),&lt;br /&gt;
        	&amp;#039;1&amp;#039;, q.text_width[2], tmp[&amp;#039;linfo3+2&amp;#039;], q.linfo1_pad, q.text_width[3], tmp[&amp;#039;linfo1&amp;#039;], tmp[&amp;#039;rowProp&amp;#039;][&amp;#039;bg&amp;#039;], tmp[&amp;#039;cells&amp;#039;], q.rinfo1_pad, q.text_width[4], tmp[&amp;#039;rinfo1&amp;#039;],&lt;br /&gt;
        	&amp;#039;1&amp;#039;, q.text_width[5], rinfo2_3_4_fmt, mw.ustring.format(i18n.html[&amp;#039;row-collapsible-right-button-fmt&amp;#039;], i18n.html[&amp;#039;row-collapsible-right-button-width&amp;#039;], q.text_width[6]))&lt;br /&gt;
    end&lt;br /&gt;
    if replace ~= &amp;#039;&amp;#039; then&lt;br /&gt;
        if q.isKeyword(rows[i + 1], i, rows, true) then return result .. formaterror(&amp;#039;collapsible-block-no-replacement&amp;#039;) end--a plain row needed for replacement&lt;br /&gt;
        table.remove(rows, i)&lt;br /&gt;
        tmp = row(rows[i], true, nil)&lt;br /&gt;
        local padding, right = i18n.html[&amp;#039;row-collapsible-right-button-width&amp;#039;] .. &amp;#039; 0 0&amp;#039;, &amp;#039;&amp;#039;&lt;br /&gt;
        if q.rinfo1_pad == &amp;#039;&amp;#039; then padding = &amp;#039;0 0 &amp;#039; .. i18n.html[&amp;#039;row-collapsible-left-button-width&amp;#039;] ; right = &amp;#039;right:0px;&amp;#039; end&lt;br /&gt;
        result = result .. mw.ustring.format(i18n.html[&amp;#039;row-collapsible-replace-begin-fmt&amp;#039;], padding, right, props[&amp;#039;bg-replace&amp;#039;])&lt;br /&gt;
        linfo4_3_2_fmt = &amp;#039;&amp;#039; ; rinfo2_3_4_fmt = &amp;#039;&amp;#039;&lt;br /&gt;
        if q.rinfo1_pad == &amp;#039;&amp;#039; then&lt;br /&gt;
            if tmp[&amp;#039;linfo4&amp;#039;] ~= &amp;#039;&amp;#039; or tmp[&amp;#039;linfo3+2&amp;#039;] ~= &amp;#039;&amp;#039; then linfo4_3_2_fmt = mw.ustring.format(i18n.html[&amp;#039;row-collapsible-left-linfo4+3+2-fmt&amp;#039;], tmp[&amp;#039;linfo4&amp;#039;], tmp[&amp;#039;linfo3+2&amp;#039;]) end&lt;br /&gt;
            result = result .. mw.ustring.format(i18n.html[&amp;#039;row-general-fmt&amp;#039;], mw.ustring.format(i18n.html[&amp;#039;row-linfo4-fmt&amp;#039;], &amp;#039;&amp;#039;, &amp;#039;&amp;#039;), &amp;#039;1&amp;#039;, q.text_width[2], linfo4_3_2_fmt,&lt;br /&gt;
            	q.linfo1_pad, q.text_width[3], tmp[&amp;#039;linfo1&amp;#039;], tmp[&amp;#039;rowProp&amp;#039;][&amp;#039;bg&amp;#039;], tmp[&amp;#039;cells&amp;#039;], &amp;#039;&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;1&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;&amp;#039;, mw.ustring.format(i18n.html[&amp;#039;row-rinfo4-fmt&amp;#039;], &amp;#039;&amp;#039;, &amp;#039;&amp;#039;))&lt;br /&gt;
        else&lt;br /&gt;
            if tmp[&amp;#039;rinfo4&amp;#039;] ~= &amp;#039;&amp;#039; or tmp[&amp;#039;rinfo2+3&amp;#039;] ~= &amp;#039;&amp;#039; then rinfo2_3_4_fmt = mw.ustring.format(i18n.html[&amp;#039;row-collapsible-right-rinfo2+3+4-fmt&amp;#039;], tmp[&amp;#039;rinfo2+3&amp;#039;], tmp[&amp;#039;rinfo4&amp;#039;]) end&lt;br /&gt;
            result = result .. mw.ustring.format(i18n.html[&amp;#039;row-general-fmt&amp;#039;], mw.ustring.format(i18n.html[&amp;#039;row-linfo4-fmt&amp;#039;], q.text_width[1], tmp[&amp;#039;linfo4&amp;#039;]), &amp;#039;1&amp;#039;, q.text_width[2],&lt;br /&gt;
            	tmp[&amp;#039;linfo3+2&amp;#039;], q.linfo1_pad, q.text_width[3], tmp[&amp;#039;linfo1&amp;#039;], tmp[&amp;#039;rowProp&amp;#039;][&amp;#039;bg&amp;#039;], tmp[&amp;#039;cells&amp;#039;], q.rinfo1_pad, q.text_width[4], tmp[&amp;#039;rinfo1&amp;#039;], &amp;#039;1&amp;#039;, q.text_width[5],&lt;br /&gt;
            	rinfo2_3_4_fmt, mw.ustring.format(i18n.html[&amp;#039;row-rinfo4-fmt&amp;#039;], &amp;#039;&amp;#039;, &amp;#039;&amp;#039;))&lt;br /&gt;
        end&lt;br /&gt;
        result = result .. i18n.html[&amp;#039;row-collapsible-replace-end-fmt&amp;#039;]&lt;br /&gt;
    end&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
q[&amp;#039;endCollapsible&amp;#039;] = function(params, i, rows)&lt;br /&gt;
    if q.collapsibles &amp;gt; 0 then&lt;br /&gt;
        q.collapsibles = q.collapsibles - 1&lt;br /&gt;
        return i18n.html[&amp;#039;row-collapsible-end-fmt&amp;#039;]&lt;br /&gt;
    else&lt;br /&gt;
        return formaterror(&amp;#039;collapsible-block-not-open&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
q[&amp;#039;colspan&amp;#039;] = function(params, i, rows)&lt;br /&gt;
    if params[2] == &amp;#039;end&amp;#039; then return &amp;#039;&amp;#039; end&lt;br /&gt;
    local tmp, j, nrows, props = {}, 0, tonumber(params[2]), properties(table.concat(params, &amp;#039;-&amp;#039;, 3))&lt;br /&gt;
    if nrows ~= 0 then table.remove(rows, i) end&lt;br /&gt;
    if nrows == nil then nrows = #rows - i + 1 end&lt;br /&gt;
    while j &amp;lt; nrows and i &amp;lt;= #rows do&lt;br /&gt;
        j = j + 1&lt;br /&gt;
        if rows[i] == &amp;#039;-colspan-end&amp;#039;  then&lt;br /&gt;
            j = nrows&lt;br /&gt;
        else&lt;br /&gt;
            table.insert(tmp, rows[i])&lt;br /&gt;
        end&lt;br /&gt;
        if nrows ~= j or i == #rows then table.remove(rows, i) end&lt;br /&gt;
    end&lt;br /&gt;
    if j &amp;lt; nrows then j = formaterror(&amp;#039;colspan-less-rows-than-set&amp;#039;,j) else j = &amp;#039;&amp;#039; end&lt;br /&gt;
    return mw.ustring.format(i18n.html[&amp;#039;colspan-fmt&amp;#039;], j, props[&amp;#039;bg&amp;#039;] or &amp;#039;&amp;#039;, props[&amp;#039;align&amp;#039;] or &amp;#039;&amp;#039;, props[&amp;#039;style&amp;#039;] or &amp;#039;&amp;#039;, mw.getCurrentFrame():preprocess(table.concat(tmp, &amp;#039;\n&amp;#039;)))&lt;br /&gt;
end&lt;br /&gt;
q[&amp;#039;filler&amp;#039;] = function(params, i, rows)&lt;br /&gt;
	local tmp, height = table.concat(params, &amp;#039;-&amp;#039;, 3), &amp;#039;5px&amp;#039;&lt;br /&gt;
    if #params &amp;lt; 3 or tmp == &amp;#039;&amp;#039; then return formaterror(&amp;#039;parameter-missing&amp;#039;) end--TODO: указать имя нужного параметра.&lt;br /&gt;
	if params[2] ~= &amp;#039;&amp;#039; then height = params[2] end&lt;br /&gt;
    return row(tmp, nil, height)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.RGBbyCode(frame)&lt;br /&gt;
    return RGBbyCode(mw.text.trim(frame.args[1] or &amp;#039;&amp;#039;))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.route(frame)&lt;br /&gt;
    local rows, tmp = mw.text.trim(frame.args[&amp;#039;pattern&amp;#039;] or &amp;#039;&amp;#039;), {}&lt;br /&gt;
    if rows == &amp;#039;&amp;#039; then return formaterror(&amp;#039;parameter-missing&amp;#039;) end&lt;br /&gt;
    if mw.text.trim(frame.args[&amp;#039;bg&amp;#039;] or &amp;#039;&amp;#039;) ~= &amp;#039;&amp;#039; then q.bg = frame.args[&amp;#039;bg&amp;#039;] end&lt;br /&gt;
    tmp = mw.text.split(mw.text.trim(frame.args[&amp;#039;text-width&amp;#039;] or &amp;#039;&amp;#039;), &amp;#039;,&amp;#039;)&lt;br /&gt;
    if #tmp == 6 then&lt;br /&gt;
        for i = 1, 6 do if tmp[i] ~= &amp;#039;&amp;#039; then if tonumber(string.sub(tmp[i],-1)) then q.text_width[i] = &amp;#039;width:&amp;#039; .. tmp[i] .. &amp;#039;px;&amp;#039; else q.text_width[i] = &amp;#039;width:&amp;#039; .. tmp[i] .. &amp;#039;;&amp;#039; end end end&lt;br /&gt;
        if tmp[4] == &amp;#039;&amp;#039; and tmp[5] == &amp;#039;&amp;#039; and tmp[6] == &amp;#039;&amp;#039; then q.rinfo1_pad = &amp;#039;&amp;#039;--padding for rinfo1 column = 0, not 3px&lt;br /&gt;
            elseif tmp[1] == &amp;#039;&amp;#039; and tmp[2] == &amp;#039;&amp;#039; and tmp[3] == &amp;#039;&amp;#039; then q.linfo1_pad = &amp;#039;&amp;#039; end--padding for linfo1 column = 0, not 3px&lt;br /&gt;
    elseif #tmp == 3 then&lt;br /&gt;
        for i = 1, 3 do if tmp[i] ~= &amp;#039;&amp;#039; then if tonumber(string.sub(tmp[i],-1)) then q.text_width[i + 3] = &amp;#039;width:&amp;#039; .. tmp[i] .. &amp;#039;px;&amp;#039; else q.text_width[i + 3] = &amp;#039;width:&amp;#039; .. tmp[i] .. &amp;#039;;&amp;#039; end end end&lt;br /&gt;
        q.linfo1_pad = &amp;#039;&amp;#039;&lt;br /&gt;
    elseif #tmp == 1 and tmp[1]~=&amp;#039;&amp;#039; then&lt;br /&gt;
        if tonumber(string.sub(tmp[1],-1)) then q.text_width[5] = &amp;#039;width:&amp;#039; .. tmp[1] .. &amp;#039;px;&amp;#039; else q.text_width[5] = &amp;#039;width:&amp;#039; .. tmp[1] .. &amp;#039;;&amp;#039; end&lt;br /&gt;
        q.linfo1_pad = &amp;#039;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    tmp = {}&lt;br /&gt;
    &lt;br /&gt;
    rows = mw.text.split(rows, &amp;#039;\n&amp;#039;)&lt;br /&gt;
    local i, j = next(rows), next(rows, i)--removing empty lines&lt;br /&gt;
    while j ~= nil do&lt;br /&gt;
        if mw.text.trim(rows[j]) == &amp;#039;&amp;#039; then table.remove(rows, j) else i = j end&lt;br /&gt;
        j = next(rows, i)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    for i, v in ipairs(rows) do&lt;br /&gt;
        local keyword = q.isKeyword(v, i, rows)&lt;br /&gt;
        if type(keyword) ~= &amp;quot;string&amp;quot; then table.insert(tmp, row(v, nil, nil)) else table.insert(tmp, keyword) end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if q.collapsibles &amp;gt; 0 then table.insert(tmp, formaterror(&amp;#039;collapsible-block-not-closed&amp;#039;) .. q[&amp;#039;endCollapsible&amp;#039;]()) end&lt;br /&gt;
    if q.collapsibles ~= -1 then if q.rinfo1_pad == &amp;#039;&amp;#039; then q.text_width[1] = q.text_width[1] .. &amp;#039;min-width:&amp;#039; .. i18n.html[&amp;#039;row-collapsible-left-button-width&amp;#039;] .. &amp;#039;;&amp;#039;&lt;br /&gt;
                                                       else q.text_width[6] = q.text_width[6] .. &amp;#039;min-width:&amp;#039; .. i18n.html[&amp;#039;row-collapsible-right-button-width&amp;#039;] .. &amp;#039;;&amp;#039; end end&lt;br /&gt;
    -- ↓ empty row to set column widths; ↑ if q.collapsibles ≠ -1 and there are collapsible sections, leftmost or rightmost column should be wide enough to accomodate the button&lt;br /&gt;
    table.insert(tmp, mw.ustring.format(i18n.html[&amp;#039;empty-row-fmt&amp;#039;], q.text_width[1], q.text_width[2], q.linfo1_pad, q.text_width[3], q.rinfo1_pad, q.text_width[4], q.text_width[5], q.text_width[6]))&lt;br /&gt;
    return table.concat(tmp)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;br /&gt;
&lt;br /&gt;
--[[for testing in console:&lt;br /&gt;
&lt;br /&gt;
print(p.route({[&amp;#039;args&amp;#039;]={[&amp;#039;text-width&amp;#039;]=&amp;#039;&amp;#039;,[&amp;#039;pattern&amp;#039;]=[=[&lt;br /&gt;
STR&lt;br /&gt;
STR]=]}}))&lt;br /&gt;
&lt;br /&gt;
]]&lt;/div&gt;</summary>
		<author><name>вп&gt;Sunpriat</name></author>
	</entry>
</feed>