Mô đun:ISO 3166

-- to enable us to replicate the current functioning of Country extract, we need to deal with:
-- 2  DONE!
-- 3  DONE!
-- 4  DONE!
-- 5 \d+px DONE!
local p = {}
local getArgs = require("Mô đun:Arguments").getArgs
local data = mw.loadData("Mô đun:ISO 3166/data/National")
------------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 code == "NG" and qry == "Nga" then return false end						-- Nga chứ không phải Nigeria
	if cdata"name" and sqry==p.strip(cdata"name")
		or cdata"isoname" and sqry==p.strip(cdata"isoname")
		or not cdata"nocode" and sqry==code
		or sqry==cdata"alpha3" or sqry==cdata"numeric"
		then
		return true
	end
	for _,tname in pairs(cdata"isonames" or {}) do
		if sqry==p.strip(tname) then
			return true
		end
	end
	for _,tname in pairs(cdata"altnames" 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 datacode"isonames" then
		local name = datacode"isodisplaynames" and datacode"isodisplaynames"lang
			 or datacode"isonames"lang
			 or datacode"isodisplaynames" and datacode"isodisplaynames"datacode"defaultlang" or data"defaultlang"
			 or datacode"isonames"datacode"defaultlang" or data"defaultlang"
			 or datacode"isodisplaynames" and datacode"isodisplaynames""en"
			 or datacode"isonames""en"
		if name then return name end
		for _,iname in pairs(datacode"isonames") do return iname end
		return datacode"isodisplayname" or datacode"isoname"
	else
		return datacode"isodisplayname" or datacode"isoname"
	end
end
------------S T R I P------------											-- Removes junk from the input
function p.strip(text)
	local accents = {"À"="A","Á"="A","Â"="A","Ã"="A",					-- accent list
		"Ä"="A","Å"="A","Ç"="C","È"="E","É"="E",
		"Ê"="E","Ë"="E","Ì"="I","Í"="I","Î"="I",
		"Ï"="I","Ñ"="N","Ò"="O","Ó"="O","Ô"="O",
		"Õ"="O","Ö"="O","Ø"="O","Ù"="U","Ú"="U",
		"Û"="U","Ü"="U","Ý"="Y"
	}
	local remove = {"NATION OF","COUNTRY OF","TERRITORY OF",					-- text to be removed list
		"FLAG OF","FLAG","KINGDOM OF","STATE OF"," STATE ",
		"PROVINCE OF","PROVINCE","TERRITORY"
	}
	local patterns = {".+:"="",.+"="","%(.-%)"="",						-- patterns to follow (order may matter)
		"%..*"="","^THE "="","%_"=" ","%-"=" ",
		"%d%d?%d?PX"="",
	}
	
	if text ~= "Nga" then
		text = mw.ustring.upper(text)											-- Case insensitivity
	end
	text = mw.ustring.gsub(text,"À-Ý",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,"") 
	end
	
	text = mw.ustring.gsub(text,"%W","")										-- Remove non alpha-numeric
	
	return text
	
end
------------P . C A L L S T R I P -----------								-- Calls P.strip but using Mô đun:Arguments
function p.callstrip(frame)
	
	local args = getArgs(frame)
	
	return p.strip(args1) or ""
end
------------P . L U A C O D E-----------									-- Makes the ISO code of a country
function p.luacode(args)
	if string.find(args1 or ,"%-") then
		args1, args2 = string.match(args1 or ,"^(^%-*)%-(.*)$")
	end
	
	if args1 then args1 = p.strip(args1) end
	if args2 then args2 = p.strip(args2) end
	
	if args"codetype"=="3" then
		args"codetype"="alpha3"
	end
	
	local eot = args.error or ""
	
	local catnocountry = (args.nocat and args.nocat == 'true') and  
		or 'Thể loại:Trang Wikipedia có quốc gia tối nghĩa'
	local catnosubdivision = (args.nocat and args.nocat == 'true') and  
		or 'Thể loại:Trang Wikipedia có phân khu tối nghĩa'
	
	if not args1 then
		if mw.title.getCurrentTitle().namespace ~= 0 then catnocountry =  end
		return catnocountry, '"Không có tham số cho quốc gia được đưa ra"'
	end
	
	if not args2 then															--3166-1 code
		for alpha2,cdata in pairs(data) do
			if findname(alpha2,cdata,args1) then
				if args"codetype"=="numeric" or args"codetype"=="alpha3" then
					return cdataargs"codetype"
				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,args1) then
				if mw.ustring.match(alpha2,"GB") then							-- For England, Wales etc.
					alpha2 = "GB"
				end
				local sdata = mw.loadData("Mô đun:ISO 3166/data/"..alpha2)
				local empty = true
				for scode,scdata in pairs(sdata) do
					if type(scdata)=="table" then
						empty = false
						if findname(scode,scdata,args2) then
							return alpha2.."-"..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 Mô đun:Arguments
function p.code(frame)
	return p.luacode(getArgs(frame)) or ""
end
------------P . N U M E R I C-----------									-- Calls P.Luacode but using Mô đun:Arguments and setting it to output a numeric value
function p.numeric(frame)
	local args = getArgs(frame)
	
	args"codetype"="numeric"
	
	return p.luacode(args) or ""
	
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,"%-") then
		code1, code2 = string.match(code1,"^(^%-*)%-(.*)$")
	end
	
	if string.find(code1,"^%u%u$") then
		if code2=="" then														--3166-1 alpha-2 code
			if datacode1 then
				return (args.isoname or args.lang) and isoname(data,code1,args.lang)
					or (datacode1"displayname" or datacode1"name")
			else
				return 'Thể loại:Trang Wikipedia có quốc gia tối nghĩa'
			end
		else																	--3166-2 code
			local sdata
			if datacode1 then
				sdata = mw.loadData("Mô đun:ISO 3166/data/"..code1)
			else
				return 'Thể loại:Trang Wikipedia có quốc gia tối nghĩa'
			end
			if sdatacode2 then
				return (args.isoname or args.lang) and isoname(sdata,code2,args.lang)
					or (sdatacode2"displayname" or sdatacode2"name")
			else
				return 'Thể loại:Trang Wikipedia có quốc gia tối nghĩa'
			end
		end
	end
	
end
------------P . N A M E-----------											-- Calls P.Luaname but using Mô đun:Arguments
function p.name(frame)
	return p.luaname(getArgs(frame)) or ""
end
	
------------P . G E O C O O R D I N S E R T-----------						-- Wrapper for Mô đun:Coordinates.coordinsert
function p.geocoordinsert(frame)
	-- 
	local args = frame.args
	local subdivisionqueried = false
	local catnocountry = (args.nocat and args.nocat == 'true') and  
		or 'Thể loại:Trang Wikipedia có quốc gia tối nghĩa'
	local catnosubdivision = (args.nocat and args.nocat == 'true') and 
		or 'Thể loại:Trang Wikipedia có phân khu tối nghĩa' or 
	local tracking = 
	local targs = {}
	targs1 = args1 or 
	for i, v in pairs(args) do
		if i == 'country' and not mw.ustring.find(targs1, 'region:') then
			local country = v
			local k, region = 1, 
			-- look for a valid subdivision
			while region ==  and k  1 then
		local coordinsert = require('Mô đun:Coordinates').coordinsert
		return coordinsert({args = targs}) .. tracking
	end
	-- otherwise, just return the coordinates
	return targs1 .. tracking
end
return p