Module:ISO 3166: Difference between revisions

Jump to navigation Jump to search
Content added Content deleted
(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