ხაზი NameByNum ColorByNum {{MOSMETRO icon}}
1 სოკოლნიჩესკაია EF161E სოკოლნიჩესკაია (მოსკოვის მეტრო)
2 ზამოსკვორეცკაია 2DBE2C ზამოსკვორეცკაია (მოსკოვის მეტრო)
3 არბატსკო-პოკროვსკაია 0078BE არბატსკო-პოკროვსკაია (მოსკოვის მეტრო)
4 ფილიოვსკაია 00BFFF ფილიოვსკაია (მოსკოვის მეტრო)
ფილიოვსკაია 00BFFF ფილიოვსკაია (მოსკოვის მეტრო)
5 კოლცევაია 8D5B2D კოლცევაია (მოსკოვის მეტრო)
6 კალუჟსკო-რიჟსკაია ED9121 კალუჟსკო-რიჟსკაია (მოსკოვის მეტრო)
7 ტაგანსკო-კრასნოპრესნენსკაია 800080 ტაგანსკო-კრასნოპრესნენსკაია (მოსკოვის მეტრო)
8 კალინინსკაია FFD702 კალინინსკაია (მოსკოვის მეტრო)
სოლნცევსკაია FFD702 სოლნცევსკაია (მოსკოვის მეტრო)
9 სერპუხოვსკო-ტიმირიაზევსკაია 999999 სერპუხოვსკო-ტიმირიაზევსკაია (მოსკოვის მეტრო)
10 ლიუბლინსკო-დმიტროვსკაია 99CC00 ლიუბლინსკო-დმიტროვსკაია (მოსკოვის მეტრო)
11 დიდი წრიული 82C0C0 დიდი წრიული (მოსკოვის მეტრო)
11А კახოვსკაია 82C0C0 კახოვსკაია (მოსკოვის მეტრო)
12 ბუტოვსკაია A1B3D4 ბუტოვსკაია (მოსკოვის მეტრო)
13 მონორელსი 9999FF მოსკოვის მონორელსი
14 მოსკოვის ცენტრალური წრე FFFFFF მოსკოვის ცენტრალური წრე
15 ნეკრასოვსკაია DE64A1 ნეკრასოვსკაია (მოსკოვის მეტრო)
16 კომუნარსკაია D8D8D8 კომუნარსკაია (მოსკოვის მეტრო)
D1 МЦД-1 f6a600 МЦД-1
D2 МЦД-2 e74280 МЦД-2
D3 МЦД-3 e95b0c МЦД-3
D4 МЦД-4 40b280 МЦД-4
D5 МЦД-5 77b729 МЦД-5
0 სხვა დანაჩენი ხაზები 231F20

სოლნცევოს "8А" და კახოვსკაიას "11А" ხაზებისთვის ასოები იწერება კირილიცათი.


local i18n = {
	NAMES = {
		['1']  = 'სოკოლნიჩესკაია',
		['2']  = 'ზამოსკვორეცკაია',
		['3']  = 'არბატსკო-პოკროვსკაია',
		['4']  = 'ფილიოვსკაია',
        ['4А']   = 'ფილიოვსკაია',
		['5']  = 'კოლცევაია',
		['6']  = 'კალუჟსკო-რიჟსკაია',
		['7']  = 'ტაგანსკო-კრასნოპრესნენსკაია',
		['8']  = 'კალინინსკაია',
		['8А'] = 'სოლნცევსკაია',
		['9']  = 'სერპუხოვსკო-ტიმირიაზევსკაია',
		['10'] = 'ლიუბლინსკო-დმიტროვსკაია',
		['11']= 'დიდი წრიული',
		['11А'] = 'კახოვსკაია',
		['12'] = 'ბუტოვსკაია',
                ['13'] = 'მონორელსი',
                ['14'] = 'მოსკოვის ცენტრალური წრე',
		['15']= 'ნეკრასოვსკაია',
                ['16']= 'კომუნარსკაია',
		['D1']  = 'МЦД-1',
		['D2']  = 'МЦД-2',
		['D3']  = 'МЦД-3',
		['D4']  = 'МЦД-4',
		['D5']  = 'МЦД-5'
	},
	html = {
		icon_fmt = '<span title="%s">[[File:Moskwa Metro Line %s.svg|%spx|%s|link=%s]]</span>', -- parameters: alt, linenum, icon size, alt, link
		text_fmt = '[[%s|<span style="display:inline-block;line-height:%spx;height:%spx;font-size:%spx;font-style:normal;font-weight:bold;background:#%s;color:white;white-space:nowrap;text-align:center" title="%s">&thinsp;%s&thinsp;</span>]]', --[[
		                                          parameters: link, icon size, icon size, icon size - 3, color, alt, linenum   ]]
		small = '<span style="font-size:85%%">%s</span>',
		style = '<span style="%s">%s</span>',
		sortkey = '<span style="display:none" class="sortkey">%s</span>',
	},
	text = {
		transfer = 'გადასაჯდომი სადგურზე %s %s',
		CPIC = 'კროს-ბაქნური გადასაჯდომი სადგურზე %s %s',
		dab = ' (მოსკოვის მეტრო)',
	},
	default = {
		icon_size = '15'
	}
}
i18n.NAMES['КалЛ'] = i18n.NAMES['8'];  i18n.NAMES['КСЛ'] = i18n.NAMES['8'];
i18n.NAMES['СолЛ'] = i18n.NAMES['8А'];
i18n.NAMES['ТПК']  = i18n.NAMES['11']; i18n.NAMES['БКЛ'] = i18n.NAMES['11']; 
i18n.NAMES['L1']   = i18n.NAMES['12']; i18n.NAMES['Л1']  = i18n.NAMES['12']; --თარგის წინა ვერსიებთან თავსებადობისთვის
i18n.NAMES['МОЖД'] = i18n.NAMES['14']; i18n.NAMES['МЦК'] = i18n.NAMES['14']; 
i18n.NAMES['КожЛ'] = i18n.NAMES['15']; i18n.NAMES['НЛ']  = i18n.NAMES['15'];
i18n.NAMES['КомЛ'] = i18n.NAMES['16']; 

i18n.line = function(num) -- ხაზის სახელი სახელობით ბრუნვაში
	if num == '13' then return 'მოსკოვის მონორელსი'
	elseif num == '14' then return 'მოსკოვის ცენტრალური წრე'
	elseif num == 'D1' then return 'МЦД-1'
	elseif num == 'D2' then return 'МЦД-2'
	elseif num == 'D3' then return 'МЦД-3'
	elseif num == 'D4' then return 'МЦД-4'
	elseif num == 'D5' then return 'МЦД-5'
	else return i18n.NAMES[num] .. ' (მოსკოვის მეტრო)'
	end
end

i18n.link = function(num) -- ბმული ხაზის გვერდზე
	if num == '5' then return i18n.NAMES[num] .. ' (მოსკოვის მეტრო)'
	else return i18n.line(num)
	end
end

i18n.ofLine = function(num) -- სადგურის სახელი მიცემით ბრუნვაში ("გადასაჯდომი სადგურზე ... ... ხაზზე")
if num == 'ТПК' or num == '11' then return 'დიდი წრიულის'
	elseif num == '13' then return 'მოსკოვის მონორელსის'
	elseif num == '14' then return 'მოსკოვის ცენტრალური წრის'
	elseif num == 'D1' then return 'МЦД-1'
	elseif num == 'D2' then return 'МЦД-2'
	elseif num == 'D3' then return 'МЦД-3'
	elseif num == 'D4' then return 'МЦД-4'
	elseif num == 'D5' then return 'МЦД-5'
	else return mw.ustring.sub(i18n.NAMES[num], 1, -3) .. 'ხაზის'
	end
end

local COLORS = { -- ფერების მნიშვნელობა შეცვალეთ მხოლოდ ოფიციალური სქემის შესაბამისად
	['1']   = 'EF161E', -- სოკოლნიჩესკაია
	['2']   = '2DBE2C', -- ზამოსკვორეცკაია
	['3']   = '0078BE', -- არბატსკო-პოკროვსკაია
	['4']   = '00BFFF', -- ფილიოვსკაია
	['5']   = '8D5B2D', -- კოლცევაია
	['6']   = 'ED9121', -- კალუჟსკო-რიჟსკაია
	['7']   = '800080', -- ტაგანსკო-კრასნოპრესნენსკაია
	['8']   = 'FFD702', -- კალინინსკაია
	['8А']  = 'FFD702', -- სოლნცევსკაია
	['9']   = '999999', -- სერპუხოვსკო-ტიმირიაზევსკაია
	['10']  = '99CC00', -- ლიუბლინსკო-დმიტროვსკაია
	['11']  = '82C0C0', -- დიდი წრიული
	['11А'] = '82C0C0', -- კახოვსკაია
	['12']  = 'A1B3D4', -- ბუტოვსკაია
	['13']  = '9999FF', -- მოსკოვის მონორელსი
	['14']  = 'FFFFFF', -- მოსკოვის ცენტრალური წრე
	['15']  = 'DE64A1', -- ნეკრასოვსკაია
	['16']  = 'D8D8D8', -- კომუნარსკაია (დროებით)
	['D1']  = 'f6a600', -- МЦД-1
	['D2']  = 'e74280', -- МЦД-2
	['D3']  = 'e95b0c', -- МЦД-3
	['D4']  = '40b280', -- МЦД-4
	['D5']  = '77b729', -- МЦД-5
	['0']   = '231F20', -- ყველა სხვა დანარჩენი დაგეგმილი ხაზისთვის
}
COLORS['КСЛ']  = COLORS['8']; COLORS['КалЛ'] = COLORS['8'];
COLORS['СолЛ'] = COLORS['8А']; COLORS['სოლნცევსკაია'] = COLORS['8А']; 
COLORS['ТПК']  = COLORS['11']; COLORS['БКЛ'] = COLORS['11'];
COLORS['L1']   = COLORS['12']; COLORS['Л1'] = COLORS['12'];
COLORS['М1']   = COLORS['13']; 
COLORS['МОЖД'] = COLORS['14']; COLORS['МЦК'] = COLORS['14'];
COLORS['КожЛ'] = COLORS['15']; COLORS['კოჟუხოვსკაია'] = COLORS['КожЛ']; COLORS['НЛ'] = COLORS['15'];
COLORS['КомЛ'] = COLORS['16'];

function IconByNum(num)
	if num == 'КожЛ' then return nil
	elseif num == 'КСЛ' or num == 'КалЛ' then return '8'
	elseif num == 'СолЛ' then return '8А'
	elseif num == 'ТПК'  then return '11'
	elseif num == 'М1'   then return '13'
	elseif num == 'МОЖД' then return '14'
	else return num
	end
end

local p = {}

function p.ColorByNum(frame)
	return COLORS[mw.text.trim(frame.args[1] or '')] or '[[კატეგორია:მოსკოვის მეტროს მოდულის არასწორი პარამეტრებით]]'
end

function p.NameByNum(frame)
    return i18n.NAMES[mw.text.trim(frame.args[1] or '')] or '[[კატეგორია:მოსკოვის მეტროს მოდულის არასწორი პარამეტრებით]]'
end

function p.interchange(frame)
	local num, station, station_dabbed, CPIC = frame.args['line'] or '', frame.args['station'] or '', frame.args['station_dabbed'] or '', frame.args['CPIC'] or '' ~= ''
	local icon_size, alt, text, small, style = frame.args['size'] or '', frame.args['alt'] or '', frame.args['text'] or '', frame.args['small'] or '', frame.args['style'] or ''
	local icon, station_stripped
	if not i18n.NAMES[num] then return '[[კატეგორია:მოსკოვის მეტროს მოდულის არასწორი პარამეტრებით]]' end
	local iconN = IconByNum(num)
	if icon_size == '' then
		icon_size = i18n.default.icon_size
	elseif mw.ustring.sub(icon_size, -2 ) == 'px' then
		icon_size = mw.ustring.sub(icon_size, 1, -3 )
	end
	if alt == '' then
		if station ~= '' then
			alt = mw.ustring.format(i18n.text[CPIC ~= '' and 'CPIC' or 'transfer'], station, i18n.ofLine(num))
		elseif station_dabbed ~= '' then
			station_stripped = mw.ustring.match(station_dabbed, '(.-) %(') or station_dabbed
			alt = mw.ustring.format(i18n.text[CPIC ~= '' and 'CPIC' or 'transfer'], station_stripped, i18n.ofLine(num))
		else
			alt = i18n.line(num)
		end
	elseif station_dabbed ~= '' then
		station_stripped = mw.ustring.match(station_dabbed, '(.-) %(') or station_dabbed
	end
	local link = text == '' and (station_dabbed ~= '' and station_dabbed or (station ~= '' and station .. i18n.text.dab or i18n.link(num))) or i18n.link(num)
	if iconN then
		icon = mw.ustring.format(i18n.html.sortkey, mw.ustring.len(iconN) == 2 and iconN or '0' .. iconN) .. mw.ustring.format(i18n.html.icon_fmt, alt, iconN, icon_size, alt, link)
	else
		icon = mw.ustring.format(i18n.html.text_fmt, link, icon_size, icon_size, tonumber(icon_size) - 3, COLORS[num], alt, num)
	end
	if text == '' then return icon end
	local result = ''
	if station_dabbed ~= '' then
		result = '[[' .. station_dabbed .. '|' .. (station ~= '' and station or station_stripped) .. ']]'
	elseif station ~= '' then
		result = '[[' .. station .. i18n.text.dab .. '|' .. station .. ']]'
	elseif link == mw.title.getCurrentTitle().prefixedText then
		result = style ~= '' and mw.ustring.format(i18n.html.style, style, text == '2' and i18n.NAMES[num] or i18n.line(num)) or (text == '2' and i18n.NAMES[num] or i18n.line(num))
	elseif text == '2' and num ~= 'ТПК' or style ~= '' or num == '5' then
		result = '[[' .. link .. '|' .. (style ~= '' and mw.ustring.format(i18n.html.style, style, text == '2' and i18n.NAMES[num] or i18n.line(num)) or (text == '2' and i18n.NAMES[num] or i18n.line(num))) .. ']]'
	else
		result = '[[' .. link .. ']]'
	end
	if small ~= '' then result = mw.ustring.format(i18n.html.small, result) end
	return (not iconN and station == '' and station_dabbed == '' and '' or icon .. '&nbsp;') .. result
end

return p