Module:ISO 3166
-- to enable us to replicate the current functioning of Country extract, we need to deal with:
 -- 2 {{&lt;name&gt;}} DONE!
 -- 3 [[&lt;name&gt;]] DONE!
 -- 4 [[&lt;name&gt;|&lt;junk&gt;]] DONE!
 -- 5 [[image:flag of &lt;country&gt;.[svg|gif|png|jpg]|\d+px]] DONE!
 
 local p = {}
 local getArgs = require(&quot;Module:Arguments&quot;).getArgs
 local data = mw.loadData(&quot;Module:ISO 3166/data/National&quot;)
 
 --[[----------F I N D N A M E----------]]--										-- Finds the name in the database
 
 local function findname(code,cdata,qry)
 	local sqry = p.strip(qry)
 	if cdata[&quot;name&quot;] and sqry==p.strip(cdata[&quot;name&quot;])
 		or cdata[&quot;isoname&quot;] and sqry==p.strip(cdata[&quot;isoname&quot;])
 		or not cdata[&quot;nocode&quot;] and sqry==code
 		or sqry==cdata[&quot;alpha3&quot;] or sqry==cdata[&quot;numeric&quot;]
 		then
 		return true
 	end
 	for _,tname in pairs(cdata[&quot;isonames&quot;] or {}) do
 		if sqry==p.strip(tname) then
 			return true
 		end
 	end
 	for _,tname in pairs(cdata[&quot;altnames&quot;] or {}) do
 		if sqry==p.strip(tname) then
 			return true
 		end
 	end
 	return false
 end
 
 --[[----------I S O N A M E----------]]--										-- Find the ISO name of a country/region
 
 local function isoname(data,code,lang)
 	if data[code][&quot;isonames&quot;] then
 		local name = data[code][&quot;isodisplaynames&quot;] and data[code][&quot;isodisplaynames&quot;][lang]
 			 or data[code][&quot;isonames&quot;][lang]
 			 or data[code][&quot;isodisplaynames&quot;] and data[code][&quot;isodisplaynames&quot;][data[code][&quot;defaultlang&quot;] or data[&quot;defaultlang&quot;]]
 			 or data[code][&quot;isonames&quot;][data[code][&quot;defaultlang&quot;] or data[&quot;defaultlang&quot;]]
 			 or data[code][&quot;isodisplaynames&quot;] and data[code][&quot;isodisplaynames&quot;][&quot;ta&quot;]
 			 or data[code][&quot;isonames&quot;][&quot;ta&quot;]
 		if name then return name end
 		for _,iname in pairs(data[code][&quot;isonames&quot;]) do return iname end
 		return data[code][&quot;isodisplayname&quot;] or data[code][&quot;isoname&quot;]
 	else
 		return data[code][&quot;isodisplayname&quot;] or data[code][&quot;isoname&quot;]
 	end
 end
 
 --[[----------S T R I P----------]]--											-- Removes junk from the input
 
 function p.strip(text)
 	local accents = {[&quot;À&quot;]=&quot;A&quot;,[&quot;Á&quot;]=&quot;A&quot;,[&quot;Â&quot;]=&quot;A&quot;,[&quot;Ã&quot;]=&quot;A&quot;,					-- accent list
 		[&quot;Ä&quot;]=&quot;A&quot;,[&quot;Å&quot;]=&quot;A&quot;,[&quot;Ç&quot;]=&quot;C&quot;,[&quot;È&quot;]=&quot;E&quot;,[&quot;É&quot;]=&quot;E&quot;,
 		[&quot;Ê&quot;]=&quot;E&quot;,[&quot;Ë&quot;]=&quot;E&quot;,[&quot;Ì&quot;]=&quot;I&quot;,[&quot;Í&quot;]=&quot;I&quot;,[&quot;Î&quot;]=&quot;I&quot;,
 		[&quot;Ï&quot;]=&quot;I&quot;,[&quot;Ñ&quot;]=&quot;N&quot;,[&quot;Ò&quot;]=&quot;O&quot;,[&quot;Ó&quot;]=&quot;O&quot;,[&quot;Ô&quot;]=&quot;O&quot;,
 		[&quot;Õ&quot;]=&quot;O&quot;,[&quot;Ö&quot;]=&quot;O&quot;,[&quot;Ø&quot;]=&quot;O&quot;,[&quot;Ù&quot;]=&quot;U&quot;,[&quot;Ú&quot;]=&quot;U&quot;,
 		[&quot;Û&quot;]=&quot;U&quot;,[&quot;Ü&quot;]=&quot;U&quot;,[&quot;Ý&quot;]=&quot;Y&quot;
 	}
 	local remove = {&quot;NATION OF&quot;,&quot;COUNTRY OF&quot;,&quot;TERRITORY OF&quot;,					-- text to be removed list
 		&quot;FLAG OF&quot;,&quot;FLAG&quot;,&quot;KINGDOM OF&quot;,&quot;STATE OF&quot;,&quot; STATE &quot;,
 		&quot;PROVINCE OF&quot;,&quot;PROVINCE&quot;,&quot;TERRITORY&quot;
 	}
 	local patterns = {[&quot;.+:&quot;]=&quot;&quot;,[&quot;|.+&quot;]=&quot;&quot;,[&quot;%(.-%)&quot;]=&quot;&quot;,						-- patterns to follow (order may matter)
 		[&quot;%..*&quot;]=&quot;&quot;,[&quot;^THE &quot;]=&quot;&quot;,[&quot;%_&quot;]=&quot; &quot;,[&quot;%-&quot;]=&quot; &quot;,
 		[&quot;%d%d?%d?PX&quot;]=&quot;&quot;,
 	}
 	
 	text = mw.ustring.upper(text)												-- Case insensitivity
 	text = mw.ustring.gsub(text,&quot;[À-Ý]&quot;,accents)								-- Deaccent
 	
 	for pattern,value in pairs(patterns) do										-- Follow patterns
 	text = mw.ustring.gsub(text,pattern,value) 
 	end
 	
 	for _,words in pairs(remove) do												-- Remove unneeded words
 	text = mw.ustring.gsub(text,words,&quot;&quot;) 
 	end
 	
 	text = mw.ustring.gsub(text,&quot;%W&quot;,&quot;&quot;)										-- Remove non alpha-numeric
 	
 	return text
 	
 end
 
 --[[----------P . C A L L S T R I P ---------]]--								-- Calls P.strip but using Module:Arguments
 
 function p.callstrip(frame)
 	
 	local args = getArgs(frame)
 	
 	return p.strip(args[1]) or &quot;&quot;
 
 end
 
 --[[----------P . L U A C O D E---------]]--									-- Makes the ISO code of a country
 
 function p.luacode(args)
 
 	if string.find(args[1] or '',&quot;%-&quot;) then
 		args[1], args[2] = string.match(args[1] or '',&quot;^([^%-]*)%-(.*)$&quot;)
 	end
 	
 	if args[1] then args[1] = p.strip(args[1]) end
 	if args[2] then args[2] = p.strip(args[2]) end
 	
 	if args[&quot;codetype&quot;]==&quot;3&quot; then
 		args[&quot;codetype&quot;]=&quot;alpha3&quot;
 	end
 	
 	local eot = args.error or &quot;&quot;
 	
 	local catnocountry = (args.nocat and args.nocat == 'true') and '' 
 		or '[[Category:Wikipedia page with obscure country]]'
 	local catnosubdivision = (args.nocat and args.nocat == 'true') and '' 
 		or '[[Category:Wikipedia page with obscure subdivision]]'
 	
 	if not args[1] then
 		if mw.title.getCurrentTitle().namespace ~= 0 then catnocountry = '' end
 		return catnocountry, '&lt;span style=&quot;font-size:100%&quot; class=&quot;error&quot;&gt;&quot;No parameter for the country given&quot;&lt;/span&gt;'
 	end
 	
 	if not args[2] then															--3166-1 code
 		for alpha2,cdata in pairs(data) do
 			if findname(alpha2,cdata,args[1]) then
 				if args[&quot;codetype&quot;]==&quot;numeric&quot; or args[&quot;codetype&quot;]==&quot;alpha3&quot; then
 					return cdata[args[&quot;codetype&quot;]]
 				else
 					return alpha2
 				end
 			end
 		end
 		if mw.title.getCurrentTitle().namespace ~= 0 then catnocountry = '' end
 		return catnocountry
 	else																		--3166-2 code
 		for alpha2,cdata in pairs(data) do                                       
 			if findname(alpha2,cdata,args[1]) then
 				if mw.ustring.match(alpha2,&quot;GB&quot;) then							-- For England, Wales etc.
 					alpha2 = &quot;GB&quot;
 				end
 				local sdata = mw.loadData(&quot;Module:ISO 3166/data/&quot;..alpha2)
 				local empty = true
 				for scode,scdata in pairs(sdata) do
 					if type(scdata)==&quot;table&quot; then
 						empty = false
 						if findname(scode,scdata,args[2]) then
 							return alpha2..&quot;-&quot;..scode
 						end
 					end
 				end
 				if mw.title.getCurrentTitle().namespace ~= 0 then catnosubdivision = '' end
 				return catnosubdivision
 			end
 		end
 		if mw.title.getCurrentTitle().namespace ~= 0 then catnocountry = '' end
 		return catnocountry
 	end
 
 end
 
 --[[----------P . C O D E---------]]--											-- Calls P.Luacode but using Module:Arguments
 
 function p.code(frame)
 
 	return p.luacode(getArgs(frame)) or &quot;&quot;
 
 end
 
 --[[----------P . N U M E R I C---------]]--									-- Calls P.Luacode but using Module:Arguments and setting it to output a numeric value
 
 function p.numeric(frame)
 
 	local args = getArgs(frame)
 	
 	args[&quot;codetype&quot;]=&quot;numeric&quot;
 	
 	return p.luacode(args) or &quot;&quot;
 	
 end
 	
 --[[----------P . L U A N A M E---------]]--									-- Makes the ISO/common name of a country
 	
 function p.luaname(args)
 
 	local code1 = p.luacode(args)
 	local code2 = ''
 	
 	if string.find(code1,&quot;%-&quot;) then
 		code1, code2 = string.match(code1,&quot;^([^%-]*)%-(.*)$&quot;)
 	end
 	
 	if string.find(code1,&quot;^%u%u$&quot;) then
 		if code2==&quot;&quot; then														--3166-1 alpha-2 code
 			if data[code1] then
 				return (args.isoname or args.lang) and isoname(data,code1,args.lang)
 					or (data[code1][&quot;displayname&quot;] or data[code1][&quot;name&quot;])
 			else
 				return '[[Category:Wikipedia page with obscure country]]'
 			end
 		else																	--3166-2 code
 			local sdata
 			if data[code1] then
 				sdata = mw.loadData(&quot;Module:ISO 3166/data/&quot;..code1)
 			else
 				return '[[Category:Wikipedia page with obscure country]]'
 			end
 			if sdata[code2] then
 				return (args.isoname or args.lang) and isoname(sdata,code2,args.lang)
 					or (sdata[code2][&quot;displayname&quot;] or sdata[code2][&quot;name&quot;])
 			else
 				return '[[Category:Wikipedia page with obscure country]]'
 			end
 		end
 	end
 	
 end
 
 --[[----------P . N A M E---------]]--											-- Calls P.Luaname but using Module:Arguments
 
 function p.name(frame)
 
 	return p.luaname(getArgs(frame)) or &quot;&quot;
 
 end
 	
 --[[----------P . G E O C O O R D I N S E R T---------]]--						-- Wrapper for Module:Coordinates.coordinsert
 function p.geocoordinsert(frame)
 	-- {{#invoke:ISO 3166|geocoordinsert|{{coord|...}}
 	-- |country=..|subdivision1=...|subdivision2=...
 	-- |type=...|scale=...|dim=...|source=...|globe=...
 	-- }}
 	local args = frame.args
 	local subdivisionqueried = false
 	local catnocountry = (args.nocat and args.nocat == 'true') and '' 
 		or '[[Category:Wikipedia page with obscure country]]'
 	local catnosubdivision = (args.nocat and args.nocat == 'true') and ''
 		or '[[Category:Wikipedia page with obscure subdivision]]' or ''
 	local tracking = ''
 	local targs = {}
 	targs[1] = args[1] or ''
 	for i, v in pairs(args) do
 		if i == 'country' and not mw.ustring.find(targs[1], 'region:') then
 			local country = v
 			local k, region = 1, ''
 			-- look for a valid subdivision
 			while region == '' and k &lt; 3 do
 				local subdivision = args['subdivision' .. k] or ''
 				if subdivision ~= '' then
 					region = p.luacode({country, subdivision, nocat = 'true'})
 					subdivisionqueried = true
 				end
 				k = k + 1
 			end
 			-- subdivision lookup failed or never attempted, try country only
 			if region == '' then
 				region = p.luacode({country, nocat = 'true'})
 				if mw.title.getCurrentTitle().namespace ~= 0 then catnocountry, catnosubdivision = '', '' end
 				if region == '' then
 					tracking = tracking .. catnocountry
 				elseif subdivisionqueried == true then
 					tracking = tracking .. catnosubdivision
 				end
 			end
 			-- something worked, add it to the targs
 			if region ~= '' then
 				targs[#targs + 1] = 'region:' .. region
 			end
 		elseif i == 'type' or i == 'scale' or i == 'dim' 
 				or i == 'source' or i == 'globe' then
 			targs[#targs + 1] = i .. ':' .. v
 		end
 	end
 	-- call Module:Coordinates.coordinsert if there is something to insert
 	if #targs &gt; 1 then
 		local coordinsert = require('Module:Coordinates').coordinsert
 		return coordinsert({args = targs}) .. tracking
 	end
 	-- otherwise, just return the coordinates
 	return targs[1] .. tracking
 end