<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.metrostroi.net/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.metrostroi.net/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.metrostroi.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Routemap&amp;action=history"/>
	<updated>2026-04-25T20:49:23Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://wiki.metrostroi.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Routemap&amp;diff=839&amp;oldid=prev</id>
		<title>Курритто: Новая страница: «local i18n = {     errors = {         [&quot;parameter-missing&quot;] = &quot;Не указан обязательный параметр!&quot;,         [&quot;collapsible-block-not-clos…»</title>
		<link rel="alternate" type="text/html" href="https://wiki.metrostroi.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Routemap&amp;diff=839&amp;oldid=prev"/>
		<updated>2017-11-17T19:26:32Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «local i18n = {     errors = {         [&amp;quot;parameter-missing&amp;quot;] = &amp;quot;Не указан обязательный параметр!&amp;quot;,         [&amp;quot;collapsible-block-not-clos…»&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 = '[[Категория:Википедия:Статьи с неверно заполненными маршрутными картами]]'&lt;br /&gt;
    },&lt;br /&gt;
    html = {&lt;br /&gt;
        [&amp;quot;cell-icon-fmt&amp;quot;] = '\&lt;br /&gt;
|[[File:BSicon_%s.svg|x20px|link=%s|alt=]]',&lt;br /&gt;
        [&amp;quot;cell-overlapicon-fmt&amp;quot;] = '&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;',&lt;br /&gt;
        [&amp;quot;cell-icon-fmt-with-overlap&amp;quot;] = '\&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=]]',&lt;br /&gt;
        [&amp;quot;cell-filler-fmt&amp;quot;] = '\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;|',&lt;br /&gt;
        [&amp;quot;cell-filler-empty-fmt&amp;quot;] = '\n|style=&amp;quot;width:%s;min-width:%s&amp;quot;|',&lt;br /&gt;
&lt;br /&gt;
        [&amp;quot;row-linfo4-fmt&amp;quot;] = '\&lt;br /&gt;
|style=&amp;quot;padding-right:3px;text-align:left;%s&amp;quot;|&amp;lt;span style=&amp;quot;font-size:90%%;&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;',-- parameters:linfo4-width, linfo4&lt;br /&gt;
        [&amp;quot;row-linfo3-fmt&amp;quot;] = '&amp;lt;span style=&amp;quot;font-size:90%%;&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt; ',&lt;br /&gt;
        [&amp;quot;row-rinfo3-fmt&amp;quot;] = ' &amp;lt;span style=&amp;quot;font-size:90%%;&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;',&lt;br /&gt;
        [&amp;quot;row-rinfo4-fmt&amp;quot;] = '\&lt;br /&gt;
|style=&amp;quot;padding-left:3px;text-align:right;%s&amp;quot;|&amp;lt;span style=&amp;quot;font-size:90%%;&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;',-- parameters:rinfo4-width, rinfo4&lt;br /&gt;
&lt;br /&gt;
        -- в «margin:auto !important» у таблицы «!important» — для мобильного вида&lt;br /&gt;
        [&amp;quot;row-general-fmt&amp;quot;] = '\&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;span style=&amp;quot;font-size:90%%;&amp;quot;&amp;gt;%s&amp;lt;/span&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;span style=&amp;quot;font-size:90%%;&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;\&lt;br /&gt;
|colspan=&amp;quot;%s&amp;quot; style=&amp;quot;text-align:left;%s&amp;quot;|%s%s',-- 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;] = '\&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;',-- 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;] = '\n|}',&lt;br /&gt;
&lt;br /&gt;
        [&amp;quot;row-collapsible-left-button-width&amp;quot;] = '50px',-- 50px is the minimal width for [показать] / [скрыть] button. Use 40px for [show] / [hide]&lt;br /&gt;
        [&amp;quot;row-collapsible-left-button-fmt&amp;quot;] = '\n! style=&amp;quot;padding-right:3px;min-width:%s;%s&amp;quot; |',--parameters: left-button-width, linfo4-width&lt;br /&gt;
        [&amp;quot;row-collapsible-left-linfo4+3+2-fmt&amp;quot;] = '\&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;span style=&amp;quot;font-size:90%%;&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;\&lt;br /&gt;
|style=&amp;quot;text-align:right&amp;quot;| %s\&lt;br /&gt;
|}',-- parameters: linfo4, linfo3+2&lt;br /&gt;
        [&amp;quot;row-collapsible-right-button-width&amp;quot;] = '72px',-- 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;] = '\&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;span style=&amp;quot;font-size:90%%;&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;\&lt;br /&gt;
|}',-- parameters: rinfo2+3, linfo4&lt;br /&gt;
        [&amp;quot;row-collapsible-right-button-fmt&amp;quot;] = '\n| style=&amp;quot;padding-left:3px;font-size:90%%;min-width:%s;%s&amp;quot; |',--parameters: right-button-width, rinfo4-width&lt;br /&gt;
 &lt;br /&gt;
        [&amp;quot;row-collapsible-replace-begin-fmt&amp;quot;] = '\&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;',-- 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;] = '\n|}&amp;lt;/div&amp;gt;',&lt;br /&gt;
&lt;br /&gt;
        [&amp;quot;colspan-fmt&amp;quot;] = '%s\n|-\n| colspan=&amp;quot;7&amp;quot; style=&amp;quot;background-color:%s;text-align:%s;%s&amp;quot;|\n%s',&lt;br /&gt;
        [&amp;quot;empty-row-fmt&amp;quot;] = '\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; |'&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['colspan-fmt'], '', '', '', '', '&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;' .. mw.ustring.format(i18n.errors[key] or (tostring(key) .. ' %s'),&lt;br /&gt;
        tostring(param or '')) .. '&amp;lt;/span&amp;gt;')&lt;br /&gt;
    if mw.site.namespaces[mw.title.getCurrentTitle().namespace].isContent then result = result .. (i18n['errors-categories'][key] or i18n['errors-categories'].default or '') 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     = 'BE2D2C', ex          = 'D77F7E',&lt;br /&gt;
        u        = '003399', uex         = '6281C0',&lt;br /&gt;
        f        = '008000', fex         = '64B164',&lt;br /&gt;
        g        = '2CA05A', gex         = '7EC49A',&lt;br /&gt;
        azure    = '3399FF', ex_azure    = '99CCFF',&lt;br /&gt;
        black    = '000000', ex_black    = '646464',&lt;br /&gt;
        blue     = '0078BE', ex_blue     = '64ACD6',&lt;br /&gt;
        brown    = '8D5B2D', ex_brown    = 'B89A7F',&lt;br /&gt;
        cerulean = '1A8BB9', ex_cerulean = '73B7D3',&lt;br /&gt;
        cyan     = '40E0D0', ex_cyan     = '8AEAE1',&lt;br /&gt;
        denim    = '00619F', ex_denim    = '649EC3',&lt;br /&gt;
        fuchsia  = 'B5198D', ex_fuchsia  = 'D173B8',&lt;br /&gt;
        golden   = 'D7C447', ex_golden   = 'E5DA8E',&lt;br /&gt;
        green    = '2DBE2C', ex_green    = '7FD67E',&lt;br /&gt;
        grey     = '999999', ex_grey     = 'C0C0C0',&lt;br /&gt;
        jade     = '53B147', ex_jade     = '95CE8E',&lt;br /&gt;
        lavender = '9999FF', ex_lavender = 'C0C0FF',&lt;br /&gt;
        lime     = '99CC00', ex_lime     = 'D1E681',&lt;br /&gt;
        maroon   = '800000', ex_maroon   = 'B16464',&lt;br /&gt;
        ochre    = 'CC6600', ex_ochre    = 'DEA164',&lt;br /&gt;
        orange   = 'FF6600', ex_orange   = 'FF9955',&lt;br /&gt;
        pink     = 'F0668D', ex_pink     = 'F4A1B8',&lt;br /&gt;
        purple   = '8171AC', ex_purple   = 'B1A8CB',&lt;br /&gt;
        red      = 'EF161E', ex_red      = 'F37176',&lt;br /&gt;
        ruby     = 'CC0066', ex_ruby     = 'DE64A1',&lt;br /&gt;
        saffron  = 'FFAB2E', ex_saffron  = 'FFC969',&lt;br /&gt;
        sky      = '069DD3', ex_sky      = '67C2E3',&lt;br /&gt;
        steel    = 'A1B3D4', ex_steel    = 'C4CFE3',&lt;br /&gt;
        teal     = '339999', ex_teal     = '82C0C0',&lt;br /&gt;
        violet   = '800080', ex_violet   = 'B164B1',&lt;br /&gt;
        yellow   = 'FFD702', ex_yellow   = 'FFEB81',&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={},''&lt;br /&gt;
    if #overlapIcons&amp;gt;0 then&lt;br /&gt;
        tmp = mw.text.split(overlapIcons[#overlapIcons], '!@')&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='' end&lt;br /&gt;
            table.insert(tmp,mw.ustring.format(i18n.html['cell-overlapicon-fmt'],mw.text.trim(v),link))end&lt;br /&gt;
        return mw.ustring.format(i18n.html['cell-icon-fmt-with-overlap'],mw.text.trim(table.concat(tmp)),icon)&lt;br /&gt;
    end&lt;br /&gt;
    tmp = mw.text.split(icon, '!@')&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 ~= '' then&lt;br /&gt;
    	return mw.ustring.format(i18n.html['cell-icon-fmt'], icon, link)&lt;br /&gt;
    else&lt;br /&gt;
    	return mw.ustring.format(i18n.html['cell-filler-empty-fmt'], '20px', '20px')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
local function fillercell(code)&lt;br /&gt;
    if code == '' then&lt;br /&gt;
    	return mw.ustring.format(i18n.html['cell-filler-empty-fmt'], '20px', '20px')&lt;br /&gt;
    elseif code == 'd' then&lt;br /&gt;
    	return mw.ustring.format(i18n.html['cell-filler-empty-fmt'], '10px', '10px')&lt;br /&gt;
    elseif string.sub(code,1,1) == '#' then&lt;br /&gt;
    	return mw.ustring.format(i18n.html['cell-filler-fmt'], code)&lt;br /&gt;
    else&lt;br /&gt;
    	return mw.ustring.format(i18n.html['cell-filler-fmt'],'#' .. 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, '!@')) do&lt;br /&gt;
        if v ~= '' then&lt;br /&gt;
            local t = mw.text.split(v, '=')&lt;br /&gt;
            table.insert(result, t[1])&lt;br /&gt;
            result[t[1]] = table.concat(t, '=', 2) or ''--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 = {['linfo4'] = '', ['linfo3+2'] = '', ['linfo1'] = '', ['cells'] = {}, ['rinfo1'] = '', ['rinfo2+3'] = '', ['rinfo4'] = '', ['rowProp'] = {}}&lt;br /&gt;
    local lcolspan, rcolspan, linfo4_fmt, rinfo4_fmt = '2', '2', '', ''&lt;br /&gt;
    local left, rigth, icons, overlapIcons, tmp = {}, {}, {}, {}, mw.text.split(pattern, '! !')&lt;br /&gt;
    if #tmp &amp;gt; 1 then--splitting the pattern by '! !'&lt;br /&gt;
        left = tmp[1] ; right = tmp[2]&lt;br /&gt;
    else&lt;br /&gt;
        left = '' ; right = tmp[1] or ''&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    tmp = mw.text.split(left, '~~')--analysing the left part&lt;br /&gt;
    if #tmp &amp;gt; 1 then--if there are several ~~&lt;br /&gt;
        result['linfo1'] = mw.getCurrentFrame():preprocess(mw.text.trim(tmp[#tmp]))&lt;br /&gt;
        result['linfo3+2'] = 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] ~= '' then result['linfo3+2'] = mw.ustring.format(i18n.html['row-linfo3-fmt'], tmp[#tmp - 2]) .. result['linfo3+2'] 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] ~= '' then&lt;br /&gt;
                    result['linfo4'] = mw.getCurrentFrame():preprocess(tmp[#tmp - 3])&lt;br /&gt;
                    lcolspan = '1'&lt;br /&gt;
                    linfo4_fmt = mw.ustring.format(i18n.html['row-linfo4-fmt'], '', result['linfo4'])&lt;br /&gt;
                end&lt;br /&gt;
                if #tmp &amp;gt; 4 then result['rowProp'] = 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['linfo3+2'] = mw.text.trim(tmp[1])&lt;br /&gt;
    end&lt;br /&gt;
    result['linfo3+2'] = mw.getCurrentFrame():preprocess(result['linfo3+2'])--expand possible templates in info.&lt;br /&gt;
 &lt;br /&gt;
    tmp = mw.text.split(right, '~~')--analysing the right part&lt;br /&gt;
    if #tmp &amp;gt; 2 then&lt;br /&gt;
        result['rinfo1'] = mw.getCurrentFrame():preprocess(mw.text.trim(tmp[2]))&lt;br /&gt;
        result['rinfo2+3'] = 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] ~= '' then result['rinfo2+3'] = result['rinfo2+3'] .. mw.ustring.format(i18n.html['row-rinfo3-fmt'], 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] ~= '' then&lt;br /&gt;
                    result['rinfo4'] = mw.getCurrentFrame():preprocess(tmp[5])&lt;br /&gt;
                    rcolspan = '1'&lt;br /&gt;
                    rinfo4_fmt = mw.ustring.format(i18n.html['row-rinfo4-fmt'], '', result['rinfo4'])&lt;br /&gt;
                end&lt;br /&gt;
                if #tmp &amp;gt; 5 then result['rowProp'] = 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['rinfo2+3'] = mw.text.trim(tmp[2] or '')&lt;br /&gt;
    end&lt;br /&gt;
    result['rinfo2+3'] = mw.getCurrentFrame():preprocess(result['rinfo2+3'])&lt;br /&gt;
&lt;br /&gt;
    icons = mw.text.split(tmp[1], '\\')--splitting the string of icons first by &amp;quot;\&amp;quot;&lt;br /&gt;
    if type(filler) == 'string' then&lt;br /&gt;
    	result['cells'][1] = 'style=&amp;quot;height:' .. filler .. '&amp;quot;'--row parameter before any cells&lt;br /&gt;
        for i, v in ipairs(icons) do table.insert(result['cells'], 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, '!~')&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['cells'], cell(v, overlapIcons[i])) end&lt;br /&gt;
    end&lt;br /&gt;
    result['cells'] = table.concat(result['cells'])&lt;br /&gt;
    if result['rowProp']['bg'] == nil or result['rowProp']['bg'] == '' then result['rowProp']['bg'] = 'transparent' 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['row-general-fmt'], linfo4_fmt, lcolspan, '', result['linfo3+2'], q.linfo1_pad, '', result['linfo1'], result['rowProp']['bg'],&lt;br /&gt;
    		result['cells'], q.rinfo1_pad, '', result['rinfo1'], rcolspan, '', result['rinfo2+3'], rinfo4_fmt)&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
q = {collapsibles = -1, text_width = {'', '', '', '', '', ''}, linfo1_pad = '3px', rinfo1_pad = '3px', bg = '#f9f9f9'}&lt;br /&gt;
q.isKeyword = function(pattern, i, rows, justTest)&lt;br /&gt;
    if string.sub(pattern, 1, 1) ~= '-' 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), '%-')&lt;br /&gt;
    if type(q[tmp[1]])==&amp;quot;function&amp;quot; and tmp[1] ~= 'isKeyword' 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['startCollapsible'] = 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 == 'endCollapsible' then return formaterror('collapsible-block-empty')&lt;br /&gt;
        else return formaterror('collapsible-block-no-first-row') ..  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 '', properties(table.concat(params, '-', 4))--params[1] is the keyword name so all indices are shifted by one.&lt;br /&gt;
    if collapsed == nil or collapsed == '' then collapsed = 'collapsed' end&lt;br /&gt;
    if props['bg'] == nil or props['bg'] == '' then props['bg'] = 'transparent' ; props['bg-replace'] = q.bg else props['bg-replace'] = props['bg'] end&lt;br /&gt;
    local mode, float, result&lt;br /&gt;
    if q.rinfo1_pad == '' then mode = 'collapsible ' ; float = 'float:right;'&lt;br /&gt;
    else mode = 'mw-collapsible mw-' ; float = ''&lt;br /&gt;
    end&lt;br /&gt;
    result = mw.ustring.format(i18n.html[&amp;quot;row-collapsible-begin-fmt&amp;quot;], props['bg'], mode, collapsed, float)&lt;br /&gt;
    tmp = row(rows[i], true, nil)&lt;br /&gt;
    local linfo4_3_2_fmt, rinfo2_3_4_fmt = '', ''&lt;br /&gt;
    if q.rinfo1_pad == '' then&lt;br /&gt;
        if tmp['linfo4'] ~= '' or tmp['linfo3+2'] ~= '' then linfo4_3_2_fmt = mw.ustring.format(i18n.html['row-collapsible-left-linfo4+3+2-fmt'], tmp['linfo4'], tmp['linfo3+2']) end&lt;br /&gt;
        result = result .. mw.ustring.format(i18n.html['row-general-fmt'], mw.ustring.format(i18n.html['row-collapsible-left-button-fmt'], i18n.html['row-collapsible-left-button-width'], q.text_width[1]),&lt;br /&gt;
        	'1', q.text_width[2], linfo4_3_2_fmt, q.linfo1_pad, q.text_width[3], tmp['linfo1'], tmp['rowProp']['bg'], tmp['cells'], '', '', '', '1', '', '', mw.ustring.format(i18n.html['row-rinfo4-fmt'], '', ''))&lt;br /&gt;
    else&lt;br /&gt;
        if tmp['rinfo4'] ~= '' or tmp['rinfo2+3'] ~= '' then rinfo2_3_4_fmt = mw.ustring.format(i18n.html['row-collapsible-right-rinfo2+3+4-fmt'], tmp['rinfo2+3'], tmp['rinfo4']) end&lt;br /&gt;
        result = result .. mw.ustring.format(i18n.html['row-general-fmt'], mw.ustring.format(i18n.html['row-linfo4-fmt'], q.text_width[1], tmp['linfo4']),&lt;br /&gt;
        	'1', q.text_width[2], tmp['linfo3+2'], q.linfo1_pad, q.text_width[3], tmp['linfo1'], tmp['rowProp']['bg'], tmp['cells'], q.rinfo1_pad, q.text_width[4], tmp['rinfo1'],&lt;br /&gt;
        	'1', q.text_width[5], rinfo2_3_4_fmt, mw.ustring.format(i18n.html['row-collapsible-right-button-fmt'], i18n.html['row-collapsible-right-button-width'], q.text_width[6]))&lt;br /&gt;
    end&lt;br /&gt;
    if replace ~= '' then&lt;br /&gt;
        if q.isKeyword(rows[i + 1], i, rows, true) then return result .. formaterror('collapsible-block-no-replacement') 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['row-collapsible-right-button-width'] .. ' 0 0', ''&lt;br /&gt;
        if q.rinfo1_pad == '' then padding = '0 0 ' .. i18n.html['row-collapsible-left-button-width'] ; right = 'right:0px;' end&lt;br /&gt;
        result = result .. mw.ustring.format(i18n.html['row-collapsible-replace-begin-fmt'], padding, right, props['bg-replace'])&lt;br /&gt;
        linfo4_3_2_fmt = '' ; rinfo2_3_4_fmt = ''&lt;br /&gt;
        if q.rinfo1_pad == '' then&lt;br /&gt;
            if tmp['linfo4'] ~= '' or tmp['linfo3+2'] ~= '' then linfo4_3_2_fmt = mw.ustring.format(i18n.html['row-collapsible-left-linfo4+3+2-fmt'], tmp['linfo4'], tmp['linfo3+2']) end&lt;br /&gt;
            result = result .. mw.ustring.format(i18n.html['row-general-fmt'], mw.ustring.format(i18n.html['row-linfo4-fmt'], '', ''), '1', q.text_width[2], linfo4_3_2_fmt,&lt;br /&gt;
            	q.linfo1_pad, q.text_width[3], tmp['linfo1'], tmp['rowProp']['bg'], tmp['cells'], '', '', '', '1', '', '', mw.ustring.format(i18n.html['row-rinfo4-fmt'], '', ''))&lt;br /&gt;
        else&lt;br /&gt;
            if tmp['rinfo4'] ~= '' or tmp['rinfo2+3'] ~= '' then rinfo2_3_4_fmt = mw.ustring.format(i18n.html['row-collapsible-right-rinfo2+3+4-fmt'], tmp['rinfo2+3'], tmp['rinfo4']) end&lt;br /&gt;
            result = result .. mw.ustring.format(i18n.html['row-general-fmt'], mw.ustring.format(i18n.html['row-linfo4-fmt'], q.text_width[1], tmp['linfo4']), '1', q.text_width[2],&lt;br /&gt;
            	tmp['linfo3+2'], q.linfo1_pad, q.text_width[3], tmp['linfo1'], tmp['rowProp']['bg'], tmp['cells'], q.rinfo1_pad, q.text_width[4], tmp['rinfo1'], '1', q.text_width[5],&lt;br /&gt;
            	rinfo2_3_4_fmt, mw.ustring.format(i18n.html['row-rinfo4-fmt'], '', ''))&lt;br /&gt;
        end&lt;br /&gt;
        result = result .. i18n.html['row-collapsible-replace-end-fmt']&lt;br /&gt;
    end&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
q['endCollapsible'] = 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['row-collapsible-end-fmt']&lt;br /&gt;
    else&lt;br /&gt;
        return formaterror('collapsible-block-not-open')&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
q['colspan'] = function(params, i, rows)&lt;br /&gt;
    if params[2] == 'end' then return '' end&lt;br /&gt;
    local tmp, j, nrows, props = {}, 0, tonumber(params[2]), properties(table.concat(params, '-', 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] == '-colspan-end'  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('colspan-less-rows-than-set',j) else j = '' end&lt;br /&gt;
    return mw.ustring.format(i18n.html['colspan-fmt'], j, props['bg'] or '', props['align'] or '', props['style'] or '', mw.getCurrentFrame():preprocess(table.concat(tmp, '\n')))&lt;br /&gt;
end&lt;br /&gt;
q['filler'] = function(params, i, rows)&lt;br /&gt;
	local tmp, height = table.concat(params, '-', 3), '5px'&lt;br /&gt;
    if #params &amp;lt; 3 or tmp == '' then return formaterror('parameter-missing') end--TODO: указать имя нужного параметра.&lt;br /&gt;
	if params[2] ~= '' 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 ''))&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['pattern'] or ''), {}&lt;br /&gt;
    if rows == '' then return formaterror('parameter-missing') end&lt;br /&gt;
    if mw.text.trim(frame.args['bg'] or '') ~= '' then q.bg = frame.args['bg'] end&lt;br /&gt;
    tmp = mw.text.split(mw.text.trim(frame.args['text-width'] or ''), ',')&lt;br /&gt;
    if #tmp == 6 then&lt;br /&gt;
        for i = 1, 6 do if tmp[i] ~= '' then if tonumber(string.sub(tmp[i],-1)) then q.text_width[i] = 'width:' .. tmp[i] .. 'px;' else q.text_width[i] = 'width:' .. tmp[i] .. ';' end end end&lt;br /&gt;
        if tmp[4] == '' and tmp[5] == '' and tmp[6] == '' then q.rinfo1_pad = ''--padding for rinfo1 column = 0, not 3px&lt;br /&gt;
            elseif tmp[1] == '' and tmp[2] == '' and tmp[3] == '' then q.linfo1_pad = '' 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] ~= '' then if tonumber(string.sub(tmp[i],-1)) then q.text_width[i + 3] = 'width:' .. tmp[i] .. 'px;' else q.text_width[i + 3] = 'width:' .. tmp[i] .. ';' end end end&lt;br /&gt;
        q.linfo1_pad = ''&lt;br /&gt;
    elseif #tmp == 1 and tmp[1]~='' then&lt;br /&gt;
        if tonumber(string.sub(tmp[1],-1)) then q.text_width[5] = 'width:' .. tmp[1] .. 'px;' else q.text_width[5] = 'width:' .. tmp[1] .. ';' end&lt;br /&gt;
        q.linfo1_pad = ''&lt;br /&gt;
    end&lt;br /&gt;
    tmp = {}&lt;br /&gt;
    &lt;br /&gt;
    rows = mw.text.split(rows, '\n')&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]) == '' 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('collapsible-block-not-closed') .. q['endCollapsible']()) end&lt;br /&gt;
    if q.collapsibles ~= -1 then if q.rinfo1_pad == '' then q.text_width[1] = q.text_width[1] .. 'min-width:' .. i18n.html['row-collapsible-left-button-width'] .. ';'&lt;br /&gt;
                                                       else q.text_width[6] = q.text_width[6] .. 'min-width:' .. i18n.html['row-collapsible-right-button-width'] .. ';' 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['empty-row-fmt'], 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({['args']={['text-width']='',['pattern']=[=[&lt;br /&gt;
STR&lt;br /&gt;
STR]=]}}))&lt;br /&gt;
&lt;br /&gt;
]]&lt;/div&gt;</summary>
		<author><name>Курритто</name></author>
	</entry>
</feed>