Module:Country extract

local p = {} -- -- to enable us to replicate the current functioning of CountryAbbr and CountryAbbr2 -- We need to deal with -- 1 alternative names ISO 3166 should do that -- 2 -- 3 [ [ ] ] -- 4 [ [ | ] ] -- 5 --

function p.extractCountry(frame) local string= mw.ustring.toNFC (frame.args[1]) local match=nil; match = mw.ustring.match(string, "Flag of ([^\.]*)") if (match) then return match end -- for Cocos (Keeling) Islands -- ' For People's --. for U.S. etc.  match = mw.ustring.match(string, "(%u[%a\(\)\.' -]+)") if (match == "Image") then string = mw.ustring.gsub(string, match, "") match = mw.ustring.match(string, "[\|\[](%u[%a\(\)\.' -]+)") end if (match == "20px") then string = mw.ustring.gsub(string, match, "") match = mw.ustring.match(string, "\[(%u[%a\(\)\.' -]+)") end if (match) then return match end return string end

--[[

]]

function p.extractSubdivision(frame) local string= mw.ustring.toNFC (frame.args[1]) local match=nil; -- Needed for 🇬🇱 Greenland, match = mw.ustring.match(string, "Flag of ([^\.]*)") if (match) then return match end -- . needed for Washington D.C. -- ' for cote d'azur -- leading ' for 'Aden -- ‘ and trailing ' for Şan‘ā' match = mw.ustring.match(string, "('?[%u][%a'‘ \.\,-]+[%a\.'\d]+)") if (match) then return match end return string end

local countries = { ["Andorra"] = "AD", ["United Arab Emirates"] = "AE", ["UAE"] = "AE", ["Afghanistan"] = "AF", ["Antigua and Barbuda"] = "AG", ["Anguilla"] = "AI", ["Albania"] = "AL", ["Armenia"] = "AM", ["Angola"] = "AO", ["Antarctica"] = "AQ", ["Argentina"] = "AR", ["American Samoa"] = "AS", ["Austria"] = "AT", ["Australia"] = "AU", ["Aruba"] = "AW", ["Åland Islands"] = "AX", ["Aland Islands"] = "AX", ["Azerbaijan"] = "AZ", ["Nagorno-Karabakh"] = "AZ", -- disputed ["Nagorno-Karabakh Republic"] = "AZ", -- disputed ["Bosnia and Herzegovina"] = "BA", ["Bosnia"] = "BA", ["Barbados"] = "BB", ["Bangladesh"] = "BD", ["Belgium"] = "BE", ["Burkina Faso"] = "BF", ["Bulgaria"] = "BG", ["Bahrain"] = "BH", ["Burundi"] = "BI", ["Benin"] = "BJ", ["Saint Barthélemy"] = "BL", ["Saint Barthelemy"] = "BL", ["St. Barthélemy"] = "BL", ["St. Barthelemy"] = "BL", ["St Barthélemy"] = "BL", ["St Barthelemy"] = "BL", ["Bermuda"] = "BM", ["Brunei"] = "BN", ["Brunei Darussalam"] = "BN", ["Bolivia"] = "BO", ["Bolivia, Plurinational State of"] = "BO", ["Bonaire, Sint Eustatius and Saba"] = "BQ", ["Brazil"] = "BR", ["Bahamas"] = "BS", ["The Bahamas"] = "BS", ["the Bahamas"] = "BS", ["Bhutan"] = "BT", ["Bouvet Island"] = "BV", ["Botswana"] = "BW", ["Belarus"] = "BY", ["Belize"] = "BZ", ["Canada"] = "CA", ["Cocos (Keeling) Islands"] = "CC", ["Cocos Islands"] = "CC", ["Keeling Islands"] = "CC", ["Congo, the Democratic Republic of the"] = "CD", ["Democratic Republic of the Congo"] = "CD", ["DR Congo"] = "CD", ["Congo-Kinshasa"] = "CD", ["DROC"] = "CD", ["DRC"] = "CD", ["Central African Republic"] = "CF", ["CAR"] = "CF", ["Congo"] = "CG", ["Republic of the Congo"] = "CG", ["Congo Republic"] = "CG", ["Congo-Brazzaville"] = "CG", ["West Congo"] = "CG", ["Switzerland"] = "CH", ["Côte d'Ivoire"] = "CI", ["Ivory Coast"] = "CI", ["Cook Islands"] = "CK", ["Chile"] = "CL", ["Cameroon"] = "CM", ["China"] = "CN", ["PRC"] = "CN", ["People's Republic of China"] = "CN", ["Colombia"] = "CO", ["Costa Rica"] = "CR", ["Cuba"] = "CU", ["Cape Verde"] = "CV", ["Curaçao"] = "CW", ["Curacao"] = "CW", ["Christmas Island"] = "CX", ["Cyprus"] = "CY", ["Republic of Cyprus"] = "CY", ["Northern Cyprus"] = "CY", -- disputed ["Turkish Republic of Northern Cyprus"] = "CY", -- disputed ["Czech Republic"] = "CZ", ["Germany"] = "DE", ["Djibouti"] = "DJ", ["Denmark"] = "DK", ["Dominica"] = "DM", ["Dominican Republic"] = "DO", ["Algeria"] = "DZ", ["Ecuador"] = "EC", ["Estonia"] = "EE", ["Egypt"] = "EG", ["Western Sahara"] = "EH", ["Eritrea"] = "ER", ["Spain"] = "ES", ["Ethiopia"] = "ET", ["Finland"] = "FI", ["Fiji"] = "FJ", ["Falkland Islands (Malvinas)"] = "FK", ["Falklands"] = "FK", ["Falkland Islands"] = "FK", ["Malvinas"] = "FK", ["Malvinas Islands"] = "FK", ["Micronesia, Federated States of"] = "FM", ["Micronesia"] = "FM", ["Faroe Islands"] = "FO", ["France"] = "FR", ["Gabon"] = "GA", ["United Kingdom"] = "GB", ["the United Kingdom"] = "GB", ["U. K."] = "GB", ["U.K."] = "GB", ["the U.K."] = "GB", ["UK"] = "GB", ["the UK"] = "GB", ["Great Britain"] = "GB", ["England"] = "GB-ENG", ["Scotland"] = "GB-SCT", ["Wales"] = "GB-WLS", ["Northern Ireland"] = "GB-NIR", ["England and Wales"] = "GB-EAW", ["Grenada"] = "GD", ["Georgia"] = "GE", ["South Ossetia"] = "GE", -- disputed ["Tskhinvali Region"] = "GE", -- disputed ["Abkhazia"] = "GE-AB", -- disputed ["Republic of Abkhazia"] = "GE-AB", -- disputed ["French Guiana"] = "GF", ["Guernsey"] = "GG", ["Ghana"] = "GH", ["Gibraltar"] = "GI", ["Greenland"] = "GL", ["Gambia"] = "GM", ["Guinea"] = "GN", ["Guadeloupe"] = "GP", ["Equatorial Guinea"] = "GQ", ["Greece"] = "GR", ["South Georgia and the South Sandwich Islands"] = "GS", ["Guatemala"] = "GT", ["Guam"] = "GU", ["Guinea-Bissau"] = "GW", ["Guyana"] = "GY", ["Hong Kong"] = "HK", ["Heard Island and McDonald Islands"] = "HM", ["Heard and McDonald Islands"] = "HM", ["Honduras"] = "HN", ["Croatia"] = "HR", ["Haiti"] = "HT", ["Hungary"] = "HU", ["Indonesia"] = "ID", ["Ireland"] = "IE", ["Israel"] = "IL", ["Isle of Man"] = "IM", ["India"] = "IN", ["British Indian Ocean Territory"] = "IO", ["Iraq"] = "IQ", ["Iran, Islamic Republic of"] = "IR", ["Iran"] = "IR", ["Iceland"] = "IS", ["Italy"] = "IT", ["Jersey"] = "JE", ["Jamaica"] = "JM", ["Jordan"] = "JO", ["Japan"] = "JP", ["Kenya"] = "KE", ["Kyrgyzstan"] = "KG", ["Cambodia"] = "KH", ["Kiribati"] = "KI", ["Comoros"] = "KM", ["The Comoros"] = "KM", ["the Comoros"] = "KM", ["Saint Kitts and Nevis"] = "KN", ["St. Kitts and Nevis"] = "KN", ["St Kitts and Nevis"] = "KN", ["Korea, Democratic People's Republic of"] = "KP", ["Democratic People's Republic of Korea"] = "KP", ["North Korea"] = "KP", ["Korea, Republic of"] = "KR", ["Republic of Korea"] = "KR", ["South Korea"] = "KR", ["Kuwait"] = "KW", ["Cayman Islands"] = "KY", ["The Cayman Islands"] = "KY", ["the Cayman Islands"] = "KY", ["Kazakhstan"] = "KZ", ["Lao People's Democratic Republic"] = "LA", ["Laos"] = "LA", ["Lao"] = "LA", ["Lebanon"] = "LB", ["Saint Lucia"] = "LC", ["St. Lucia"] = "LC", ["St Lucia"] = "LC", ["Liechtenstein"] = "LI", ["Sri Lanka"] = "LK", ["Liberia"] = "LR", ["Lesotho"] = "LS", ["Lithuania"] = "LT", ["Luxembourg"] = "LU", ["Latvia"] = "LV", ["Libyan Arab Jamahiriya"] = "LY", ["Libya"] = "LY", ["Morocco"] = "MA", ["Monaco"] = "MC", ["Moldova, Republic of"] = "MD", ["Moldova"] = "MD", ["Transnistria"] = "MD", -- disputed ["Montenegro"] = "ME", ["Saint Martin (French part)"] = "MF", ["Saint Martin (France)"] = "MF", ["Collectivity of Saint Martin"] = "MF", ["Collectivity of St. Martin"] = "MF", ["Collectivity of St Martin"] = "MF", ["Saint-Martin"] = "MF", ["Madagascar"] = "MG", ["Marshall Islands"] = "MH", ["Macedonia"] = "MK", ["Mali"] = "ML", ["Myanmar"] = "MM", ["Burma"] = "MM", ["Mongolia"] = "MN", ["Macau"] = "MO", ["Macao"] = "MO", ["Northern Mariana Islands"] = "MP", ["Martinique"] = "MQ", ["Mauritania"] = "MR", ["Montserrat"] = "MS", ["Malta"] = "MT", ["Mauritius"] = "MU", ["Maldives"] = "MV", ["Malawi"] = "MW", ["Mexico"] = "MX", ["Malaysia"] = "MY", ["Mozambique"] = "MZ", ["Namibia"] = "NA", ["New Caledonia"] = "NC", ["Niger"] = "NE", ["Norfolk Island"] = "NF", ["Nigeria"] = "NG", ["Nicaragua"] = "NI", ["Netherlands"] = "NL", ["The Netherlands"] = "NL", ["the Netherlands"] = "NL", ["Norway"] = "NO", ["Nepal"] = "NP", ["Nauru"] = "NR", ["Niue"] = "NU", ["New Zealand"] = "NZ", ["Aotearoa"] = "NZ", ["Oman"] = "OM", ["Panama"] = "PA", ["Peru"] = "PE", ["French Polynesia"] = "PF", ["Papua New Guinea"] = "PG", ["Philippines"] = "PH", ["The Philippines"] = "PH", ["the Philippines"] = "PH", ["Pakistan"] = "PK", ["Poland"] = "PL", ["Saint Pierre and Miquelon"] = "PM", ["St. Pierre and Miquelon"] = "PM", ["St Pierre and Miquelon"] = "PM", ["Pitcairn"] = "PN", ["Puerto Rico"] = "PR", ["State of Palestine"] = "PS", ["Palestine"] = "PS", ["Portugal"] = "PT", ["Palau"] = "PW", ["Paraguay"] = "PY", ["Qatar"] = "QA", ["Réunion"] = "RE", ["Reunion"] = "RE", ["Romania"] = "RO", ["Serbia"] = "RS", ["Kosovo"] = "RS", -- disputed ["Russian Federation"] = "RU", ["Russia"] = "RU", ["Rwanda"] = "RW", ["Saudi Arabia"] = "SA", ["Solomon Islands"] = "SB", ["Seychelles"] = "SC", ["Sudan"] = "SD", ["Sweden"] = "SE", ["Singapore"] = "SG", ["Saint Helena, Ascension and Tristan da Cunha"] = "SH", ["Slovenia"] = "SI", ["Svalbard and Jan Mayen"] = "SJ", ["Slovakia"] = "SK", ["Sierra Leone"] = "SL", ["San Marino"] = "SM", ["Senegal"] = "SN", ["Somalia"] = "SO", ["Somaliland"] = "SO", -- disputed ["Suriname"] = "SR", ["South Sudan"] = "SS", ["São Tomé and Príncipe"] = "ST", ["Sao Tome and Principe"] = "ST", ["El Salvador"] = "SV", ["Sint Maarten"] = "SX", ["Saint Martin (Dutch part)"] = "SX", ["Saint Martin (Netherlands)"] = "SX", ["Syrian Arab Republic"] = "SY", ["Syria"] = "SY", ["Swaziland"] = "SZ", ["Turks and Caicos Islands"] = "TC", ["Chad"] = "TD", ["French Southern Territories"] = "TF", ["Togo"] = "TG", ["Thailand"] = "TH", ["Tajikistan"] = "TJ", ["Tokelau"] = "TK", ["Timor-Leste"] = "TL", ["East Timor"] = "TL", ["Turkmenistan"] = "TM", ["Tunisia"] = "TN", ["Tonga"] = "TO", ["Turkey"] = "TR", ["Trinidad and Tobago"] = "TT", ["Tuvalu"] = "TV", ["Taiwan"] = "TW", ["Republic of China"] = "TW", ["Tanzania, United Republic of"] = "TZ", ["Tanzania"] = "TZ", ["Ukraine"] = "UA", ["The Ukraine"] = "UA", ["the Ukraine"] = "UA", ["Uganda"] = "UG", ["United States Minor Outlying Islands"] = "UM", ["United States"] = "US", ["the United States"] = "US", ["United States of America"] = "US", ["the United States of America"] = "US", ["U. S."] = "US", ["U.S."] = "US", ["the U.S."] = "US", ["US"] = "US", ["the US"] = "US", ["Uruguay"] = "UY", ["Uzbekistan"] = "UZ", ["Holy See (Vatican City State)"] = "VA", ["Holy See"] = "VA", ["Vatican City State"] = "VA", ["Vatican City"] = "VA", ["Saint Vincent and the Grenadines"] = "VC", ["St. Vincent and the Grenadines"] = "VC", ["St Vincent and the Grenadines"] = "VC", ["Venezuela, Bolivarian Republic of"] = "VE", ["Venezuela"] = "VE", ["Virgin Islands, British"] = "VG", ["British Virgin Islands"] = "VG", ["UK Virgin Islands"] = "VG", ["Virgin Islands of the United Kingdom"] = "VG", ["Virgin Islands of the UK"] = "VG", ["Virgin Islands, U. S."] = "VI", ["Virgin Islands, U.S."] = "VI", ["Virgin Islands, US"] = "VI", ["United States Virgin Islands"] = "VI", ["American Virgin Islands"] = "VI", ["U. S. Virgin Islands"] = "VI", ["U.S. Virgin Islands"] = "VI", ["US Virgin Islands"] = "VI", ["Virgin Islands of the United States"] = "VI", ["Virgin Islands of the U.S."] = "VI", ["Virgin Islands of the US"] = "VI", ["Vietnam"] = "VN", ["Viet Nam"] = "VN", ["Vanuatu"] = "VU", ["Wallis and Futuna"] = "WF", ["Samoa"] = "WS", ["Yemen"] = "YE", ["Mayotte"] = "YT", ["South Africa"] = "ZA", ["Zambia"] = "ZM", ["Zimbabwe"] = "ZW", }

function p.main(frame) local country = mw.ustring.gsub(mw.ustring.toNFC(frame.args[1] or ''), '^%s*(.-)%s*$', '%1') local match1 = '' if country and country ~= '' then match1 = mw.ustring.match(country, "Flag of the ([^\.]*)") or mw.ustring.match(country, "Flag of ([^\.]*)") or mw.ustring.match(country, "^[Tt]he %A*(%u[%a%(%)%.' %-]+)") or mw.ustring.match(country, "(%u[%a%(%)%.' %-]+)") or "" if (match1 == "Image") or (match1 == "File") then country = mw.ustring.gsub(country, match1, "") match1 = mw.ustring.match(country, "[%|%[](%u[%a%(%)%.' %-]+)") or "" end if mw.ustring.match(match1, "^%d*x?%d+px$") then country = mw.ustring.gsub(country, match1, "") match1 = mw.ustring.match(country, "%[(%u[%a%(%)%.' %-]+)") or "" end end local code = countries[match1] or countries[mw.ustring.gsub(match1, " %(.*%)$", "")] or countries[mw.ustring.gsub(match1, ",.*$", "")] or countries[mw.ustring.gsub(match1, " %(.*$", "")]	if not code then		if match1 ~= '' and mw.title.new('Template:ISO 3166 code ' .. match1).exists then			code = frame:expandTemplate{ title = 'Template:ISO 3166 code ' .. match1 }		else			if frame.args.nocat and frame.args.nocat == 'true' then				return 			end			local ns = mw.title.getCurrentTitle.namespace			if ns == 0 then				return 			else				return 			end		end	end	local subdivision = mw.ustring.gsub(mw.ustring.toNFC(frame.args[2] or ), '^%s*(.-)%s*$', '%1')	if not subdivision or subdivision == '' then return code end	local countrytables = {		["AD"] = true,		["AE"] = true,		["AF"] = true,		["AG"] = true,		["AL"] = true,		["AM"] = true,		["AO"] = true,		["AR"] = true,		["AT"] = true,		["AU"] = true,		["AZ"] = true,		["BA"] = true,		["BB"] = true,		["BD"] = true,		["BE"] = true,		["BF"] = true,		["BG"] = true,		["BH"] = true,		["BI"] = true,		["BJ"] = true,		["BN"] = true,		["BO"] = true,		["BQ"] = true,		["BR"] = true,		["BS"] = true,		["BT"] = true,		["BW"] = true, ["BY"] = true, ["BZ"] = true, ["CA"] = true, ["CD"] = true, ["CF"] = true, ["CG"] = true, ["CH"] = true, ["CI"] = true, ["CL"] = true, ["CM"] = true, ["CN"] = true, ["CO"] = true, ["CR"] = true, ["CU"] = true, ["CV"] = true, ["CY"] = true, ["CZ"] = true, ["DE"] = true, ["DJ"] = true, ["DK"] = true, ["DM"] = true, ["DO"] = true, ["DZ"] = true, ["EC"] = true, ["EE"] = true, ["EG"] = true, ["ER"] = true, ["ES"] = true, ["ET"] = true, ["FI"] = true, ["FJ"] = true, ["FM"] = true, ["FR"] = true, ["GA"] = true, ["GB"] = true, ["GD"] = true, ["GE"] = true, ["GH"] = true, ["GL"] = true, ["GM"] = true, ["GN"] = true, ["GQ"] = true, ["GR"] = true, ["GT"] = true, ["GW"] = true, ["GY"] = true, ["HN"] = true, ["HR"] = true, ["HT"] = true, ["HU"] = true, ["ID"] = true, ["IE"] = true, ["IL"] = true, ["IN"] = true, ["IQ"] = true, ["IR"] = true, ["IS"] = true, ["IT"] = true, ["JM"] = true, ["JO"] = true, ["JP"] = true, ["KE"] = true, ["KG"] = true, ["KH"] = true, ["KI"] = true, ["KM"] = true, ["KN"] = true, ["KP"] = true, ["KR"] = true, ["KW"] = true, ["KZ"] = true, ["LA"] = true, ["LB"] = true, ["LC"] = true, ["LI"] = true, ["LK"] = true, ["LR"] = true, ["LS"] = true, ["LT"] = true, ["LU"] = true, ["LV"] = true, ["LY"] = true, ["MA"] = true, ["MC"] = true, ["MD"] = true, ["ME"] = true, ["MG"] = true, ["MH"] = true, ["MK"] = true, ["ML"] = true, ["MM"] = true, ["MN"] = true, ["MR"] = true, ["MT"] = true, ["MU"] = true, ["MV"] = true, ["MW"] = true, ["MX"] = true, ["MY"] = true, ["MZ"] = true, ["NA"] = true, ["NE"] = true, ["NG"] = true, ["NI"] = true, ["NL"] = true, ["NO"] = true, ["NP"] = true, ["NR"] = true, ["NZ"] = true, ["OM"] = true, ["PA"] = true, ["PE"] = true, ["PG"] = true, ["PH"] = true, ["PK"] = true, ["PL"] = true, ["PS"] = true, ["PT"] = true, ["PW"] = true, ["PY"] = true, ["QA"] = true, ["RO"] = true, ["RS"] = true, ["RU"] = true, ["RW"] = true, ["SA"] = true, ["SB"] = true, ["SC"] = true, ["SD"] = true, ["SE"] = true, ["SG"] = true, ["SH"] = true, ["SI"] = true, ["SK"] = true, ["SL"] = true, ["SM"] = true, ["SN"] = true, ["SO"] = true, ["SR"] = true, ["SS"] = true, ["ST"] = true, ["SV"] = true, ["SY"] = true, ["SZ"] = true, ["TD"] = true, ["TG"] = true, ["TH"] = true, ["TJ"] = true, ["TL"] = true, ["TM"] = true, ["TN"] = true, ["TO"] = true, ["TR"] = true, ["TT"] = true, ["TV"] = true, ["TW"] = true, ["TZ"] = true, ["UA"] = true, ["UG"] = true, ["UM"] = true, ["US"] = true, ["UY"] = true, ["UZ"] = true, ["VC"] = true, ["VE"] = true, ["VN"] = true, ["VU"] = true, ["WF"] = true, ["WS"] = true, ["YE"] = true, ["ZA"] = true, ["ZM"] = true, ["ZW"] = true, }	local match2 = mw.ustring.match(subdivision, "Flag of the ([^\.]*)") or mw.ustring.match(subdivision, "Flag of ([^\.]*)") or mw.ustring.match(subdivision, "[Tt]he %A*([ǁ'‘ʻ]?%u[%aZ̧z̄'‘‘ %.%,%-]+[%a%.'%d]+)") or mw.ustring.match(subdivision, "([ǁ'‘ʻ]?%u[%aZ̧z̄'‘‘ %.%,%-]+[%a%.'%d]+)") or "" if (match2 == "Image") or (match2 == "File") then subdivision = mw.ustring.gsub(subdivision, match2, "") match2 = mw.ustring.match(subdivision, "[\|\[]([ǁ'‘ʻ]?%u[%aZ̧z̄'‘ʻ %.%,%-]+[%a%.'%d]+)") or "" end if mw.ustring.match(match2, "^%d*x?%d+px$") then subdivision = mw.ustring.gsub(subdivision, match2, "") match2 = mw.ustring.match2(subdivision, "%[([ǁ'‘ʻ]?%u[%aZ̧z̄'‘ʻ %.%,%-]+[%a%.'%d]+)") or "" end local code1 = mw.ustring.sub(code, 1, 2) if countrytables[code1] then local tmp = mw.loadData('Module:Country extract/' .. code1) local code2 = tmp[match2] or tmp[mw.ustring.gsub(match2, " %(.*%)$", "")] or tmp[mw.ustring.gsub(match2, ",.*$", "")] or tmp[mw.ustring.gsub(match2, " %(.*$", "")]		if code2 then return code2 end		local legacytemplate = 'Template:ISO 3166 code ' .. match1		if mw.title.new(legacytemplate).exists then			tmp = nil			for k, v in ipairs({ frame:expandTemplate{ title = legacytemplate, args = { mw.ustring.gsub(match2, " %(.*%)$", "") } }, frame:expandTemplate{ title = legacytemplate, args = { mw.ustring.gsub(match2, ",.*$", "") } }, frame:expandTemplate{ title = legacytemplate, args = { mw.ustring.gsub(match2, " %(.*$", "") } },				frame:expandTemplate{ title = legacytemplate, args = { match2 } }			}) do				if v ~= code and v ~= '' then tmp = v					break end end if tmp then return tmp end end if frame.args.nocat and frame.args.nocat == 'true' then return code end local ns = mw.title.getCurrentTitle.namespace if ns == 0 then return code .. ''		else return code .. ''		end end return code end

return p