Module:Region

local p = {} local h = {} local Data = mw.loadData("Module:Region/Data")

local utilsArg = require("Module:UtilsArg")

local DEFAULT_FLAG_SIZE = "20px" local CATEGORY_INVALID_ARGS = "" local CLASS_TOOLTIP = require("Module:Constants/class/tooltip")

function p.Flag(frame) local args, err = utilsArg.parse(frame:getParent.args, p.Templates.Flag) if err then return err.categoryText else local region = Data.regions[args.code] local flags = h.flags(region, args) local result = table.concat(flags, " ") return result end end

function p.enum local enum = {} for k, v in pairs(Data.regions) do		if k ~= "jp" and k ~= "us" then table.insert(enum, {				code = k,				name = v.name			}) end end -- We put the wiki's native region (us) first followed by Nintendo's native region (jp) -- followed by every other country ordred by country name table.sort(enum, function(a, b)		return a.name < b.name	end) for i, v in ipairs(enum) do		enum[i] = v.code end table.insert(enum, 1, "jp") table.insert(enum, 1, "us") enum.reference = "Module:Region/Data" return enum end

function p.getRegion(code, options) options = options or {} options.flagSize = options.flagSize or DEFAULT_FLAG_SIZE

local region = Data.regions[code] if not region then local utilsError = require("Module:UtilsError") utilsError.warn(string.format("Invalid region . See Module:Region/Data for a list of supported regions.", code)) return nil, CATEGORY_INVALID_ARGS else return { name = region.name, flags = h.flags(region, {				size = options.flagSize			}), }, ""	end end

function h.flags(region, options) if not region then return nil, CATEGORY_INVALID_ARGS elseif region.flag then local name = region.official or region.name local flagFile = region.flag local size = options.size local flag = string.format(' %s|%s ', CLASS_TOOLTIP, name, flagFile, size, name) return {flag}, "" elseif region.countries then local flags = {} for i, country in ipairs(region.countries) do			table.insert(flags, p.getRegion(country).flags[1]) end return flags, "" else return {""}, "" end end

function p.Documentation(frame) return { getRegion = { params = {"code", "options"}, returns = { "An object containing the region's name and flag(s), or  if no region exists for the given code.", "An error category if no region exists for the given code.", },			cases = { outputOnly = true, {					args = {"ca"}, expect = { {							name = "Canada", flags = {' '}, },						"",					},				},				{					args = {"eur", { flagSize = "40px" }}, expect = { {							name = "Europe", flags = {' '}, },						""					},				},				{					args = {"thm"}, expect = { {							name = "Taiwan, Hong Kong, Macao", flags = {' ', '  ', '  '}, },						"",					},				},				{					args = {"narnia"}, expect = { nil, CATEGORY_INVALID_ARGS, },				},			},		},	} end

function p.Schemas(frame) return { getRegion = { code = { required = true, type = "string", desc = "A region code from Module:Region/Data." },			options = { type = "record", properties = { {						name = "flagSize", type = "string", default = DEFAULT_FLAG_SIZE, desc = "The image size to use for the region's flag(s).", },				},			},		},		Data = { type = "record", required = true, properties = { {					name = "regions", required = true, type = "map", desc = "A list of regions that Nintendo (or other Zelda-related companies) markets to.", keyPlaceholder = "code", keys = { type = "string", desc = "An country code, or a 3+ character code denoting a multi-country region forming a single market segment.", },					values = { type = "record", properties = { {								name = "name", required = true, type = "string", desc = "The name of the country or region.", },							{								name = "official", type = "string", desc = "The official state name of the country. Defaults to .", },							{								name = "flag", type = "string", desc = "The file name of the region's flag", },							{								name = "countries", type = "array", items = { type = "string" }, desc = "For multi-country regions, a list of country codes that comprise the region.", },						},					},				},			},		}	} end

function p.Data(frame) local utilsLayout = require("Module:UtilsLayout") local utilsTable = require("Module:UtilsTable")

local countries = {} local multiCountryRegions = {} for code in pairs(Data.regions) do		local region = p.getRegion(code) local row = { id = code, cells = { " ",				table.concat(region.flags, " "), region.name, }		}		if code:len == 2 then table.insert(countries, row) else table.insert(multiCountryRegions, row) end end countries = utilsTable.sortBy(countries, "id") multiCountryRegions = utilsTable.sortBy(multiCountryRegions, "id") local countriesTable = utilsLayout.table({		caption = "Countries",		sortable = {1, 3},		headers = {"", "Flag", "Name"},		rows = countries,	}) local multiCountryRegionsTable = utilsLayout.table({		caption = "Multi-Country Regions",		sortable = {1, 3},		headers = {"Code", "Flags", "Name"},		rows = multiCountryRegions,	})

local html = mw.html.create("div") :css({			["display"] = "flex",			["flex-wrap"] = "wrap",			["gap"] = "1rem",		}) :wikitext(countriesTable) :wikitext(multiCountryRegionsTable)

return tostring(html) end

p.Templates = { ["Flag"] = { purpose = "Displays a region's flag(s).", params = { [1] = {				name = "code", required = true, type = "string", enum = p.enum, desc = "A code representing a region. For countries, this is the code.", },			[2] = {				name = "size", type = "string", default = DEFAULT_FLAG_SIZE, desc = "An ." },		},	} }

return p