Module:ISO 3166: Difference between revisions
Jump to navigation
Jump to search
Content added Content deleted
(Using data subpages) |
No edit summary |
||
Line 56: | Line 56: | ||
return args.isoname and data[code1]["isoname"] or data[code1]["name"] |
return args.isoname and data[code1]["isoname"] or data[code1]["name"] |
||
else |
else |
||
return cerror("Unknown code "..code1 |
return cerror("Unknown ISO 3166-1 code "..code1) |
||
end |
end |
||
else |
else |
||
--3166-2 code |
--3166-2 code |
||
local sdata |
local sdata |
||
if |
if data[code1] then |
||
sdata = mw.loadData("Module:ISO 3166/data/"..code1) |
|||
else |
|||
return cerror("Unknown ISO 3166-1 code "..code1) |
|||
end |
|||
if sdata[code2] then |
|||
return args.isoname and sdata[code2]["isoname"] or sdata[code2]["name"] |
return args.isoname and sdata[code2]["isoname"] or sdata[code2]["name"] |
||
else |
else |
||
return cerror("Unknown code "..code1.. |
return cerror("Unknown ISO 3166-2 code "..code1.."-"..code2) |
||
end |
end |
||
end |
end |
||
Line 77: | Line 82: | ||
end |
end |
||
return cerror("Unknown code "..code1 |
return cerror("Unknown ISO 3166-1 code "..code1) |
||
end |
end |
||
Line 105: | Line 110: | ||
end |
end |
||
end |
end |
||
return cerror("Unknown name "..args[1]) |
return cerror("Unknown country name "..args[1]) |
||
else |
else |
||
--3166-2 code |
--3166-2 code |
||
Line 119: | Line 124: | ||
end |
end |
||
end |
end |
||
return cerror("Unknown name "..args[2]) |
return cerror("Unknown subdivision name "..args[2]) |
||
end |
end |
||
end |
end |
Revision as of 17:58, 11 December 2015
Documentation for this module may be created at Module:ISO 3166/doc
local p = {}
local data = mw.loadData("Module:ISO 3166/data/National")
local function cerror(text)
return mw.html.create("span"):addClass("error"):wikitext(text)
end
local function strip(text)
text = string.lower(text)
text = string.gsub(text,"[%s%-%,%.]","")
--text = string.gsub(text,"[\768-\879]","") --Unicode deaccenting doesn't work
return text
end
local function findname(qry,cdata)
local testnames = cdata["altnames"] or {}
if cdata["isoname"] then table.insert(testnames,1,cdata["isoname"]) end
table.insert(testnames,1,cdata["name"])
for _,tname in ipairs(testnames) do
if strip(qry)==strip(tname) then
return true
end
end
return false
end
function p.lua_code2name(args)
if not args[1] then
return cerror("No parameter given")
end
local code1 = string.upper(args[1] or "")
local code2 = string.upper(args[2] or "")
if string.find(code1,"%-") then
code1, code2 = string.match(code1,"^([^%-]*)%-(.*)$")
end
if --Check if valid code
--No non-alphanumeric characters allowed
string.find(code1..code2,"[^A-Z0-9]")
--3166-1 codes can be two or three letters or three digits;
--3166-2 codes must be two letters (first part) and 1-3 letters or digits (second part)
or not (string.find(code1,"^%u%u%u?$") or string.find(code1,"^%d%d%d$"))
or not (string.find(code2,"^%u?%u?%u?$") or string.find(code2,"^%d?%d?%d?$"))
or not (string.find(code1,"^%u%u$") or code2=="")
then
return cerror("Invalid code "..code1..(code2~="" and "-"..code2 or ""))
end
if string.find(code1,"^%u%u$") then
if code2=="" then
--3166-1 alpha-2 code
if data[code1] then
return args.isoname and data[code1]["isoname"] or data[code1]["name"]
else
return cerror("Unknown ISO 3166-1 code "..code1)
end
else
--3166-2 code
local sdata
if data[code1] then
sdata = mw.loadData("Module:ISO 3166/data/"..code1)
else
return cerror("Unknown ISO 3166-1 code "..code1)
end
if sdata[code2] then
return args.isoname and sdata[code2]["isoname"] or sdata[code2]["name"]
else
return cerror("Unknown ISO 3166-2 code "..code1.."-"..code2)
end
end
else
--3166-1 alpha-3 or numeric code
local codetype = string.find(code1,"%d") and "numeric" or "alpha3"
for alpha2,cdata in pairs(data) do
if cdata[codetype]==code1 then
return args.isoname and cdata["isoname"] or cdata["name"]
end
end
end
return cerror("Unknown ISO 3166-1 code "..code1)
end
function p.code2name(frame)
local args = require("Module:Arguments").getArgs(frame)
return p.lua_code2name(args)
end
function p.lua_name2code(args)
if not args[1] then
return cerror("No parameter given")
end
if not args[2] then
--3166-1 code
for alpha2,cdata in pairs(data) do
if findname(args[1],cdata) then
if args["codetype"]=="numeric" or args["codetype"]=="alpha3" then
return cdata[args["codetype"]]
else
return alpha2
end
end
end
return cerror("Unknown country name "..args[1])
else
--3166-2 code
for alpha2,cdata in pairs(data) do
if findname(args[1],cdata) then
local sdata = mw.loadData("Module:ISO 3166/data/"..alpha2)
if not sdata then
return cerror("No subdivision codes for "..args[1])
end
for scode,scdata in pairs(sdata) do
if findname(args[2],scdata) then
return alpha2.."-"..scode
end
end
return cerror("Unknown subdivision name "..args[2])
end
end
return cerror("Unknown name "..args[1])
end
end
function p.name2code(frame)
local args = require("Module:Arguments").getArgs(frame)
return p.lua_name2code(args)
end
return p