Модуль:Страны

Материал из свободной русской энциклопедии «Традиция»
Перейти к навигации Перейти к поиску
Викитекст Возврат
{{#invoke:Страны|iso3|iso2=RU}} Ошибка Lua в Модуль:TableTools на строке 273: bad argument #1 to 'ipairs' (table expected, got nil).
{{#invoke:Страны|name|iso2=RU}} Россия
{{#invoke:Страны|flag|iso2=RU}} 🇷🇺
{{#invoke:Страны|iso2|iso3=rus}} RU
{{#invoke:Страны|name|iso3=rus}} Россия
{{#invoke:Страны|flag|iso3=rus}} 🇷🇺
{{#invoke:Страны|iso2|name=Россия}} RU
{{#invoke:Страны|iso3|name=Россия}} RUS
{{#invoke:Страны|flag|name=Россия}} 🇷🇺
{{#invoke:Страны|flag|name=Утопия}} No such country
{{#invoke:Страны|flag|iso4=RU}} No such field
{{#invoke:Страны|iso2|Россия}} RU
{{#invoke:Страны|iso3|Россия}} RUS
{{#invoke:Страны|flag|Россия}} 🇷🇺
{{#invoke:Страны|name|RU}} Россия
{{#invoke:Страны|iso3|RU}} RUS
{{#invoke:Страны|flag|RU}} 🇷🇺
{{#invoke:Страны|svg_flag_url|RU}} }} https://upload.wikimedia.org/wikipedia/commons/f/f3/Flag_of_Russia.svg
{{#invoke:Страны|flag|ZZ}} No such country
{{#invoke:Страны|flag|Утопия}} No such country

local lc, split, codepoint, char = mw.ustring.lower, mw.text.split, mw.ustring.codepoint, mw.ustring.char
local emoji_base = codepoint ('🇦', 1, 1) - codepoint ('a', 1, 1)
local no_such_country, no_such_field = '<span class="error">No such country</span>', '<span class="error">No such field</span>'
local fields = { 'iso2', 'iso3', 'name', 'fips', 'svg_flag_url' }
local countries = mw.loadData 'Module:Страны/data'

local function wrap (func)
	local func = type (func) == 'function' and func or function (record)
		return record [func]
	end
	return function (frame)
		-- Unnamed argument:
		local key = frame.args[1]
		if key then
			for _, from in ipairs (fields) do
				local index = countries [from]
				if index then
					local record = index [lc (key)]
					if record then
						return func (record)
					end
				end
			end
			return no_such_country
		end
		
		-- Named argument:
		for __, from in ipairs (fields) do
			local key = frame.args [from]
			if key then
				key = lc (key)
				local source = countries [from]
				return source [key] and func (source [key]) or no_such_country
			end
		end
		return no_such_field
	end
end

local p = {}

for _, to in ipairs (fields) do
	-- syntax: {{#invoke:Страны|name|iso1=(iso1)}}, etc.
	p [to] = wrap (to)
end

p.flag = wrap (function (record)
	local first, second = codepoint (lc (record.iso2), 1, 2)
	return char (emoji_base + first) .. char (emoji_base + second)
end)

p.svg_flag = wrap (function (record)
	local external, error = mw.ext.externalData.getWebData { url = record.svg_flag_url, format = 'text' }
	return not error and external.__text or table.concat( error, ', ' )
end )

return p