Jump to content

Module:ISO 3166: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
add coordinsert wrapper and simplify tracking category code
update with code from BrandonXLF per request on the talk page
Line 9: Line 9:
local data = mw.loadData("Module:ISO 3166/data/National")
local data = mw.loadData("Module:ISO 3166/data/National")


--[[----------F I N D N A M E----------]]-- -- Finds the name in the database
--[[----------F I N D N A M E----------]]-- -- Finds the name in the database


local function findname(code,cdata,qry)
local function findname(code,cdata,qry)
local sqry = p.strip(qry)
local sqry = p.strip(qry)
if cdata["name"] and sqry==p.strip(cdata["name"])
if cdata["name"] and sqry==p.strip(cdata["name"])
or cdata["isoname"] and sqry==p.strip(cdata["isoname"])
or cdata["isoname"] and sqry==p.strip(cdata["isoname"])
or not cdata["nocode"] and sqry==code
or not cdata["nocode"] and sqry==code
or sqry==cdata["alpha3"] or sqry==cdata["numeric"]
or sqry==cdata["alpha3"] or sqry==cdata["numeric"]
then
then
return true
return true
end
end
for _,tname in pairs(cdata["isonames"] or {}) do
for _,tname in pairs(cdata["isonames"] or {}) do
if sqry==p.strip(tname) then
if sqry==p.strip(tname) then
return true
return true
end
end
end
end
for _,tname in pairs(cdata["altnames"] or {}) do
for _,tname in pairs(cdata["altnames"] or {}) do
if sqry==p.strip(tname) then
if sqry==p.strip(tname) then
return true
return true
end
end
end
end
return false
return false
end
end


--[[----------I S O N A M E----------]]-- -- Find the ISO name of a country/region
--[[----------I S O N A M E----------]]-- -- Find the ISO name of a country/region


function isoname(data,code,lang)
function isoname(data,code,lang)
Line 51: Line 51:
end
end


--[[----------S T R I P----------]]-- -- Removes junk from the input
--[[----------S T R I P----------]]-- -- Removes junk from the input


function p.strip(text)
function p.strip(text)
local accents = {["À"]="A",["Á"]="A",["Â"]="A",["Ã"]="A", -- accent list
local match=nil;
["Ä"]="A",["Å"]="A",["Ç"]="C",["È"]="E",["É"]="E",
match = mw.ustring.match(text, "Flag of ([^\.]*)")
["Ê"]="E",["Ë"]="E",["Ì"]="I",["Í"]="I",["Î"]="I",
match = mw.ustring.match(text, "Flag ([^\.]*)")
["Ï"]="I",["Ñ"]="N",["Ò"]="O",["Ó"]="O",["Ô"]="O",
if (match) then
["Õ"]="O",["Ö"]="O",["Ø"]="O",["Ù"]="U",["Ú"]="U",
text = match
["Û"]="U",["Ü"]="U",["Ý"]="Y"
end
}
match = mw.ustring.match(text, "(%u[%a\(\)\.' -]+)")
local remove = {"NATION OF","COUNTRY OF","TERRITORY OF", -- text to be removed list
if (match == "Image") then
"FLAG OF","FLAG","KINGDOM OF","STATE OF"," STATE ",
text = mw.ustring.gsub(text, match, "")
"PROVINCE OF","PROVINCE","TERRITORY"
match = mw.ustring.match(text, "[\|\[](%u[%a\(\)\.' -]+)")
}
local patterns = {[".+:"]="",["|.+"]="",["%(.-%)"]="", -- patterns to follow (order may matter)
["%..*"]="",["^THE "]="",["%_"]=" ",["%-"]=" ",
["%d%d?%d?PX"]="",
}
text = mw.ustring.upper(text) -- Case insensitivity
text = mw.ustring.gsub(text,"[À-Ý]",accents) -- Deaccent
for pattern,value in pairs(patterns) do -- Follow patterns
text = mw.ustring.gsub(text,pattern,value)
end
end
if (match == "20px") then
for _,words in pairs(remove) do -- Remove unneeded words
text = mw.ustring.gsub(text, match, "")
match = mw.ustring.match(text, "\[(%u[%a\(\)\.' -]+)")
text = mw.ustring.gsub(text,words,"")
end
if (match) then
text = match
end
end
text = mw.ustring.upper(text) --Case insensitivity
text = string.gsub(text,"^THE ","") --Remove definite article
text = mw.ustring.gsub(text,"%W","") -- Remove non alpha-numeric
text = string.gsub(text,"[%s%-%,%.%(%)%/%\']","") --Remove spacing and punctuation
local accents = {["À"]="A",["Á"]="A",["Â"]="A",["Ã"]="A",["Ä"]="A",["Å"]="A",["Ç"]="C",["È"]="E",["É"]="E",
["Ê"]="E",["Ë"]="E",["Ì"]="I",["Í"]="I",["Î"]="I",["Ï"]="I",["Ñ"]="N",["Ò"]="O",["Ó"]="O",
["Ô"]="O",["Õ"]="O",["Ö"]="O",["Ø"]="O",["Ù"]="U",["Ú"]="U",["Û"]="U",["Ü"]="U",["Ý"]="Y"}
text = mw.ustring.gsub(text,"[À-Ý]",accents) --Deaccent
return text
return text
end
end


--[[----------P . C A L L S T R I P ---------]]-- -- Calls P.strip but using Module:Arguments
--[[----------P . C A L L S T R I P ---------]]-- -- Calls P.strip but using Module:Arguments


function p.callstrip(frame)
function p.callstrip(frame)
Line 92: Line 97:
end
end


--[[----------P . L U A C O D E---------]]-- -- Makes the ISO code of a country
--[[----------P . L U A C O D E---------]]-- -- Makes the ISO code of a country


function p.luacode(args)
function p.luacode(args)

if string.find(args[1],"%-") then
args[1], args[2] = string.match(args[1],"^([^%-]*)%-(.*)$")
end
if args[1] then args[1] = p.strip(args[1]) 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[2] then args[2] = p.strip(args[2]) end

if args["codetype"]=="3" then
if args["codetype"]=="3" then
args["codetype"]="alpha3"
args["codetype"]="alpha3"
Line 105: Line 114:
local eot = args.error or ""
local eot = args.error or ""
local catnocountry = (args.nocat and args.nocat == 'true') and ''
local catnocountry = (args.nocat and args.nocat == 'true') and ''
or '[[Category:Wikipedia page with obscure country]]'
or '[[Category:Wikipedia page with obscure country]]'
local catnosubdivision = (args.nocat and args.nocat == 'true') and ''
local catnosubdivision = (args.nocat and args.nocat == 'true') and ''
or '[[Category:Wikipedia page with obscure subdivision]]'
or '[[Category:Wikipedia page with obscure subdivision]]'
if not args[1] then
if not args[1] then
return '<span style="font-size:100%" class="error">"No parameter for the country given"</span>'
return catnocountry, '<span style="font-size:100%" class="error">"No parameter for the country given"</span>'
end
end
if not args[2] then --3166-1 code
if not args[2] then --3166-1 code
for alpha2,cdata in pairs(data) do
for alpha2,cdata in pairs(data) do
if findname(alpha2,cdata,args[1]) then
if findname(alpha2,cdata,args[1]) then
if args["codetype"]=="numeric" or args["codetype"]=="alpha3" then
if args["codetype"]=="numeric" or args["codetype"]=="alpha3" then
return cdata[args["codetype"]]
return cdata[args["codetype"]]
else
else
return alpha2
return alpha2
end
end
end
end
end
end
return catnocountry
return catnocountry
else --3166-2 code
else --3166-2 code
for alpha2,cdata in pairs(data) do
for alpha2,cdata in pairs(data) do
if findname(alpha2,cdata,args[1]) then
if findname(alpha2,cdata,args[1]) then
if mw.ustring.match(alpha2,"GB") then -- For England, Wales etc.
if mw.ustring.match(alpha2,"GB") then -- For England, Wales etc.
alpha2 = "GB"
alpha2 = "GB"
end
end
local sdata = mw.loadData("Module:ISO 3166/data/"..alpha2)
local sdata = mw.loadData("Module:ISO 3166/data/"..alpha2)
local empty = true
local empty = true
for scode,scdata in pairs(sdata) do
for scode,scdata in pairs(sdata) do
if type(scdata)=="table" then
if type(scdata)=="table" then
empty = false
empty = false
if findname(scode,scdata,args[2]) then
if findname(scode,scdata,args[2]) then
return alpha2.."-"..scode
return alpha2.."-"..scode
end
end
end
end
end
end
if empty then
if empty then
return catnosubdivision
return catnosubdivision
else
else
return catnosubdivision
return catnosubdivision
end
end
end
end
end
end
return catnocountry
return catnocountry
end
end

end
end


--[[----------P . C O D E---------]]-- -- Calls P.Luacode but using Module:Arguments
--[[----------P . C O D E---------]]-- -- Calls P.Luacode but using Module:Arguments


function p.code(frame)
function p.code(frame)
Line 161: Line 170:
end
end


--[[----------P . N U M E R I C---------]]-- -- Calls P.Luacode but using Module:Arguments and setting it to output a numeric value
--[[----------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)
function p.numeric(frame)
Line 173: Line 182:
end
end
--[[----------P . L U A N A M E---------]]-- -- Makes the ISO/common name of a country
--[[----------P . L U A N A M E---------]]-- -- Makes the ISO/common name of a country
function p.luaname(args)
function p.luaname(args)
Line 181: Line 190:
if string.find(code1,"%-") then
if string.find(code1,"%-") then
code1, code2 = string.match(code1,"^([^%-]*)%-(.*)$")
code1, code2 = string.match(code1,"^([^%-]*)%-(.*)$")
end
end
if string.find(code1,"^%u%u$") then
if string.find(code1,"^%u%u$") then
if code2=="" then --3166-1 alpha-2 code
if code2=="" then --3166-1 alpha-2 code
if data[code1] then
if data[code1] then
return (args.isoname or args.lang)
return (args.isoname or args.lang) and isoname(data,code1,args.lang)
or (data[code1]["displayname"] or data[code1]["name"])
and isoname(data,code1,args.lang)
else
or (data[code1]["displayname"] or data[code1]["name"])
return '[[Category:Wikipedia page with obscure country]]'
else
end
return '[[Category:Wikipedia page with obscure country]]'
else --3166-2 code
end
local sdata
else --3166-2 code
if data[code1] then
local sdata
if data[code1] then
sdata = mw.loadData("Module:ISO 3166/data/"..code1)
else
sdata = mw.loadData("Module:ISO 3166/data/"..code1)
return '[[Category:Wikipedia page with obscure country]]'
else
end
return '[[Category:Wikipedia page with obscure country]]'
if sdata[code2] then
end
if sdata[code2] then
return (args.isoname or args.lang) and isoname(sdata,code2,args.lang)
or (sdata[code2]["displayname"] or sdata[code2]["name"])
return (args.isoname or args.lang)
else
and isoname(sdata,code2,args.lang)
return '[[Category:Wikipedia page with obscure country]]'
or (sdata[code2]["displayname"] or sdata[code2]["name"])
end
else
end
return '[[Category:Wikipedia page with obscure country]]'
end
end
end
end
end
end


--[[----------P.GEOCOORDINSERT---------]]-- -- Wrapper for Module:Coordinates.coordinsert
--[[----------P . N A M E---------]]-- -- Calls P.Luaname but using Module: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 Module:Coordinates.coordinsert
function p.geocoordinsert(frame)
function p.geocoordinsert(frame)
-- {{#invoke:ISO 3166|geocoordinsert|{{coord|...}}
-- {{#invoke:ISO 3166|geocoordinsert|{{coord|...}}
Line 265: Line 280:
-- otherwise, just return the coordinates
-- otherwise, just return the coordinates
return targs[1] .. tracking
return targs[1] .. tracking
end

--[[----------P . N A M E---------]]-- -- Calls P.Luaname but using Module:Arguments

function p.name(frame)

return p.luaname(getArgs(frame)) or ""

end
end



Revision as of 13:42, 20 September 2018

-- to enable us to replicate the current functioning of Country extract, we need to deal with:
-- 2 {{<name>}} DONE!
-- 3 [[<name>]] DONE!
-- 4 [[<name>|<junk>]] DONE!
-- 5 [[image:flag of <country>.[svg|gif|png|jpg]|\d+px]] DONE!

local p = {}
local getArgs = require("Module:Arguments").getArgs
local data = mw.loadData("Module: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 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

function isoname(data,code,lang)
	if data[code]["isonames"] then
		local name = data[code]["isodisplaynames"] and data[code]["isodisplaynames"][lang]
			 or data[code]["isonames"][lang]
			 or data[code]["isodisplaynames"] and data[code]["isodisplaynames"][data[code]["defaultlang"] or data["defaultlang"]]
			 or data[code]["isonames"][data[code]["defaultlang"] or data["defaultlang"]]
			 or data[code]["isodisplaynames"] and data[code]["isodisplaynames"]["en"]
			 or data[code]["isonames"]["en"]
		if name then return name end
		for _,iname in pairs(data[code]["isonames"]) do return iname end
		return data[code]["isodisplayname"] or data[code]["isoname"]
	else
		return data[code]["isodisplayname"] or data[code]["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"]="",
	}
	
	text = mw.ustring.upper(text)												-- Case insensitivity
	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 Module:Arguments

function p.callstrip(frame)
	
	local args = getArgs(frame)
	
	return p.strip(args[1]) or ""

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],"%-") then
		args[1], args[2] = string.match(args[1],"^([^%-]*)%-(.*)$")
	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["codetype"]=="3" then
		args["codetype"]="alpha3"
	end
	
	local eot = args.error or ""
	
	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
		return catnocountry, '<span style="font-size:100%" class="error">"No parameter for the country given"</span>'
	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["codetype"]=="numeric" or args["codetype"]=="alpha3" then
					return cdata[args["codetype"]]
				else
					return alpha2
				end
			end
		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,"GB") then							-- For England, Wales etc.
					alpha2 = "GB"
				end
				local sdata = mw.loadData("Module: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,args[2]) then
							return alpha2.."-"..scode
						end
					end
				end
				if empty then
					return catnosubdivision
				else
					return catnosubdivision
				end
			end
		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 ""

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["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 data[code1] then
				return (args.isoname or args.lang) and isoname(data,code1,args.lang)
					or (data[code1]["displayname"] or data[code1]["name"])
			else
				return '[[Category:Wikipedia page with obscure country]]'
			end
		else																	--3166-2 code
			local sdata
			if data[code1] then
				sdata = mw.loadData("Module:ISO 3166/data/"..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]["displayname"] or sdata[code2]["name"])
			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 ""

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 < 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 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 > 1 then
		local coordinsert = require('Module:Coordinates').coordinsert
		return coordinsert({args = targs}) .. tracking
	end
	-- otherwise, just return the coordinates
	return targs[1] .. tracking
end

return p