Модуль:Песочница/DonRumata/CountryCodes

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
Документация
local debug_path = "Песочница/DonRumata/"
local data = mw.loadData("Module:" .. debug_path .. "CountryCodes/data")
p = {}

local function getCountryAliases()
	local result = {} -- алиасы
	for key, v in pairs(data) do
		local name -- название
		if type(v)=='table' then
			local i = 2;
			while  v[i] ~= nil do
				local alias = v[i]
				if type(alias)=='string' then
					if result[key] == nil then
						result[key] = { alias }
					else
						table.insert(result[key], alias)
					end
				end
				i = i + 1
			end
		end
	end	
	return result;
end

local function getCodeAliases()
	local result = {} -- алиасы
	for key, v in pairs(data) do
		local name -- название
		if type(v)=='table' then
			local i = 2;
			while  v[i] ~= nil do
				local alias = v[i]
				if type(alias)=='string' then
					result[alias] = key;
				end
				i = i + 1
			end
		end
	end	
	return result;
end

local function getCountryCodes ()
	-- Страна по коду
	local result = {}
	for key, v in pairs(data) do
		local name -- название
		if type(v)=='string' then
        	name = v
		elseif type(v)=='table' then
			name = v[1];
    	end
		local nom = mw.ustring.gsub(name, "%(([^%|]*)%|([^%)]*)%)", "%1")
		local gen = mw.ustring.gsub(name, "%(([^%|]*)%|([^%)]*)%)", "%2")
       	result[key] = {nom, gen}
	end
	return result
end

function p.get(frame)
	local result = ""
	local code = frame.args[1] or ""
	local case = frame.args[2] or ""
	local n = 1
	if  case == 'р' then
		n = 2
	end
	if code ~= "" then
		local ucode = mw.ustring.upper(code);
		local codes = getCountryCodes();
		local aliases = getCodeAliases();
		local t = codes[ucode];
		if t == nil then
			local key = aliases[ucode];
			if key ~= nil then
				t = codes[key];
			else
				return code -- возвращаем без изменения
			end
		end
		result = t[n]
	end
	return result
end
	
function p.list(frame)
	local codes = getCountryCodes();
	local aliases = getCountryAliases();
	-- Формируем индекс
	local index = {}
	for key, value in pairs(codes) do
		table.insert(index, key);
	end
	table.sort(index);
	
	-- mw.logObject(countries);
	local result = "";
	for i, key in ipairs(index) do
		local talias = aliases[key];
		local keys = { }
		if talias ~= nil then
			for j, alias in ipairs(talias) do
				table.insert(keys, alias);
			end
			if #keys > 1 then
				table.sort(keys);
			end
		end
		local v = codes[key]
        result = result .. mw.text.tag("tr", nil, 
            table.concat( 
            {   mw.text.tag("td", nil, key), 
            	mw.text.tag("td", nil, table.concat( keys, ", ")), 
                mw.text.tag("td", nil, v[1]), 
                mw.text.tag("td", nil, v[2])
            }, "")) .. "\n";
	end
    if result ~= "" then
        result = mw.text.tag("tr", nil, 
            table.concat( 
                {   mw.text.tag("th", nil, "Код"), 
                	mw.text.tag("th", nil, "Другие коды"), 
                    mw.text.tag("th", nil, "Страна в им. п."), 
                    mw.text.tag("th", nil, "Страна в род. п.")
                }, "")) .. "\n" .. result;
        result = mw.text.tag("table", {class="standard sortable"}, result) .. "\n";
    end
    return result;
end

return p;