モジュール: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  \d+px 
--
function p.extractCountry(frame)
local string= mw.ustring.toNFC (frame.args1)
local match=nil;
match = mw.ustring.match(string, "(^\.*)の旗")
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.args1)
local match=nil;
-- Needed for Greenland,
match = mw.ustring.match(string, "(^\.*)の旗")
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.args1 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, "Tthe %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 = countriesmatch1 or countriesmw.ustring.gsub(match1, " %(.*%)$", "") or countriesmw.ustring.gsub(match1, ",.*$", "") or countriesmw.ustring.gsub(match1, " %(.*$", "")
	if not code then
		if mw.title.new('Template:ISO 3166 code ' .. match1).exists then
			code = frame:expandTemplate{ title = 'Template:ISO 3166 code ' .. match1 }
		else
			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.args2 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, "Tthe %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 countrytablescode1 then
		local tmp = mw.loadData('Module:Country extract/' .. code1)
		local code2 = tmpmatch2 or tmpmw.ustring.gsub(match2, " %(.*%)$", "") or tmpmw.ustring.gsub(match2, ",.*$", "") or tmpmw.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
		local ns = mw.title.getCurrentTitle().namespace
		if ns == 0 then
			return code .. 
		else
			return code .. 
		end
	end
	return code
end
return p