Module:ISO 3166: Difference between revisions
No edit summary |
m ce |
||
(2 intermediate revisions by the same user not shown) | |||
Line 4: | Line 4: | ||
local function cerror(eot,errortext,inputtext) |
local function cerror(eot,errortext,inputtext) |
||
if eot=="empty" then |
if eot=="empty" then |
||
return nil |
return nil |
||
elseif eot=="input" then |
elseif eot=="input" then |
||
Line 61: | Line 61: | ||
function p.luaname(args) |
function p.luaname(args) |
||
local eot = args.error |
local eot = args.error |
||
if not args[1] then |
if not args[1] then |
||
Line 142: | Line 142: | ||
function p.luacode(args) |
function p.luacode(args) |
||
local eot = args.error |
local eot = args.error |
||
if not args[1] then |
if not args[1] then |
Revision as of 04:51, 24 October 2017
This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. |
This Lua module is used on 1,080,000+ pages, or roughly 2% of all pages. To avoid major disruption and server load, any changes should be tested in the module's /sandbox or /testcases subpages, or in your own module sandbox. The tested changes can be added to this page in a single edit. Consider discussing changes on the talk page before implementing them. |
This module returns a country's or subdivision's code (alpha-2, alpha-3, numeric) or name (ISO, non-ISO) from ISO 3166 from a variety of inputs (alpha-2, alpha-3, numeric, name, ISO-name, alternative names). The module also removes junk from the input.
Examples
Countries (ISO 3166-1)
All three types of ISO 3166-1 codes (alpha-2, alpha-3 and numeric) work as inputs to name
, as well as to code
(which can therefore also be used to convert between different code types). Use |codetype=
to output alpha-3 or numeric codes in code
instead of the default alpha-2 codes.
Name
To get the common name use the name function
{{#invoke:ISO 3166|name|GB}}
→ United Kingdom{{#invoke:ISO 3166|name|GBR}}
→ United Kingdom{{#invoke:ISO 3166|name|826}}
→ United Kingdom
ISO Name
To get the ISO name use the name function with isoname = yes
{{#invoke:ISO 3166|name|GB|isoname=yes}}
→ United Kingdom of Great Britain and Northern Ireland{{#invoke:ISO 3166|name|GBR|isoname=yes}}
→ United Kingdom of Great Britain and Northern Ireland{{#invoke:ISO 3166|name|826|isoname=yes}}
→ United Kingdom of Great Britain and Northern Ireland
Alpha-2
To get the alpha 2 code use the code function
{{#invoke:ISO 3166|code|826}}
→ GB{{#invoke:ISO 3166|code|United Kingdom}}
→ GB{{#invoke:ISO 3166|code|UK}}
→ GB
Alpha-3
To get the alpha 3 code use the code function with codetype = 3
{{#invoke:ISO 3166|code|United Kingdom|codetype=alpha3}}
→ GBR{{#invoke:ISO 3166|name|GB}}
→ United Kingdom{{#invoke:ISO 3166|name|GBR}}
→ United Kingdom{{#invoke:ISO 3166|name|826}}
→ United Kingdom{{#invoke:ISO 3166|code|UK|codetype=alpha3}}
→ GBR
Numeric
To get the numeric code use the code function with codetype = numeric or use the numeric function
{{#invoke:ISO 3166|numeric|GB}}
→ Script error: The function "numeric" does not exist.{{#invoke:ISO 3166|code|GB|codetype=numeric}}
→ 826
Subdivisions (ISO 3166-2)
Inputs to name
must be valid ISO 3166-2 codes, i.e. the country's alpha-2 code for the first part, and up to three alphanumeric characters for the second part. They may be given normally (with a hyphen between the parts), or split between two unnamed parameters. For code
, the first parameter is the country name (or any of its three codes, like above), and the second the subdivision name.
Code (alpha-2)
To get the alpha-2 code of a subdivision use the code function with parameter 1 being the country and parameter 2 being the subdivision
{{#invoke:ISO 3166|code|United Kingdom|England}}
→ GB-ENG{{#invoke:ISO 3166|code|GBR|England}}
→ GB-ENG{{#invoke:ISO 3166|code|GB|England}}
→ GB-ENG
Name
To get the name of a subdivision use the name function with parameter 1 being the country and parameter 2 being the subdivsion or parameter 1 being the subdivsion code
{{#invoke:ISO 3166|name|GB-ENG}}
→ England{{#invoke:ISO 3166|name|GB|ENG}}
→ England
|isoname=
works for subnational entities as well; keep in mind that ISO 3166-2 uses (transliterations of) local names that may differ from English ones. Set |lang=
to a language code to switch between different languages for entities that have multiple ISO names. The default language for multilingual entities can be set on the country's data page.
{{#invoke:ISO 3166|name|BE|BRU}}
→ Brussels{{#invoke:ISO 3166|name|BE|BRU|isoname=yes}}
→ Bruxelles-Capitale, Région de{{#invoke:ISO 3166|name|BE|BRU|lang=fr}}
→ Bruxelles-Capitale, Région de{{#invoke:ISO 3166|name|BE|BRU|lang=nl}}
→ Brussels Hoofdstedelijk Gewest
Tracking categories
- Category:Wikipedia page with obscure country (113)
- Category:Wikipedia page with obscure country or subdivision (3)
- Category:Wikipedia page with obscure subdivision (2,309)
See also
- Wikipedia:Templates for discussion/Log/2015 November 12#Template:ISO 3166 name DE-HB – discussion of replacement of template-based system with Lua
- Wikipedia:Templates_for_discussion/Log/2018_September_10#Template:ISO_3166_code-3_AD – discussion of full removal of template-based system
- {{ISO 3166 name}} – (ISO name)
- {{Country name}} – (Standard name)
- {{ISO 3166 code}} – (Code)
- {{ISO 3166 code-3}} – (3 letter code)
- {{ISO 3166 numeric}} – (numeric code)
- Module:ISO 3166/data – the data subpages used by this module
Subpages
- ISO 3166/data
- ISO 3166/data/AD
- ISO 3166/data/AE
- ISO 3166/data/AF
- ISO 3166/data/AG
- ISO 3166/data/AI
- ISO 3166/data/AL
- ISO 3166/data/AM
- ISO 3166/data/AO
- ISO 3166/data/AQ
- ISO 3166/data/AR
- ISO 3166/data/AS
- ISO 3166/data/AT
- ISO 3166/data/AU
- ISO 3166/data/AW
- ISO 3166/data/AX
- ISO 3166/data/AZ
- ISO 3166/data/BA
- ISO 3166/data/BB
- ISO 3166/data/BD
- ISO 3166/data/BE
- ISO 3166/data/BF
- ISO 3166/data/BG
- ISO 3166/data/BH
- ISO 3166/data/BI
- ISO 3166/data/BJ
- ISO 3166/data/BL
- ISO 3166/data/BM
- ISO 3166/data/BN
- ISO 3166/data/BO
- ISO 3166/data/BQ
- ISO 3166/data/BR
- ISO 3166/data/BS
- ISO 3166/data/BT
- ISO 3166/data/BV
- ISO 3166/data/BW
- ISO 3166/data/BY
- ISO 3166/data/BZ
- ISO 3166/data/CA
- ISO 3166/data/CA/sandbox
- ISO 3166/data/CC
- ISO 3166/data/CD
- ISO 3166/data/CF
- ISO 3166/data/CG
- ISO 3166/data/CH
- ISO 3166/data/CI
- ISO 3166/data/CK
- ISO 3166/data/CL
- ISO 3166/data/CM
- ISO 3166/data/CN
- ISO 3166/data/CO
- ISO 3166/data/CR
- ISO 3166/data/CU
- ISO 3166/data/CV
- ISO 3166/data/CW
- ISO 3166/data/CX
- ISO 3166/data/CY
- ISO 3166/data/CZ
- ISO 3166/data/DE
- ISO 3166/data/DJ
- ISO 3166/data/DK
- ISO 3166/data/DM
- ISO 3166/data/DO
- ISO 3166/data/DZ
- ISO 3166/data/EC
- ISO 3166/data/EE
- ISO 3166/data/EG
- ISO 3166/data/EH
- ISO 3166/data/ER
- ISO 3166/data/ES
- ISO 3166/data/ET
- ISO 3166/data/FI
- ISO 3166/data/FJ
- ISO 3166/data/FK
- ISO 3166/data/FM
- ISO 3166/data/FO
- ISO 3166/data/FR
- ISO 3166/data/GA
- ISO 3166/data/GB
- ISO 3166/data/GB/sandbox
- ISO 3166/data/GD
- ISO 3166/data/GE
- ISO 3166/data/GF
- ISO 3166/data/GG
- ISO 3166/data/GH
- ISO 3166/data/GI
- ISO 3166/data/GL
- ISO 3166/data/GM
- ISO 3166/data/GN
- ISO 3166/data/GN/sandbox
- ISO 3166/data/GP
- ISO 3166/data/GQ
- ISO 3166/data/GR
- ISO 3166/data/GS
- ISO 3166/data/GT
- ISO 3166/data/GU
- ISO 3166/data/GW
- ISO 3166/data/GY
- ISO 3166/data/HK
- ISO 3166/data/HM
- ISO 3166/data/HN
- ISO 3166/data/HR
- ISO 3166/data/HT
- ISO 3166/data/HU
- ISO 3166/data/ID
- ISO 3166/data/IE
- ISO 3166/data/IL
- ISO 3166/data/IM
- ISO 3166/data/IN
- ISO 3166/data/IO
- ISO 3166/data/IQ
- ISO 3166/data/IR
- ISO 3166/data/IS
- ISO 3166/data/IT
- ISO 3166/data/JE
- ISO 3166/data/JM
- ISO 3166/data/JO
- ISO 3166/data/JP
- ISO 3166/data/KE
- ISO 3166/data/KG
- ISO 3166/data/KH
- ISO 3166/data/KI
- ISO 3166/data/KM
- ISO 3166/data/KN
- ISO 3166/data/KP
- ISO 3166/data/KR
- ISO 3166/data/KW
- ISO 3166/data/KY
- ISO 3166/data/KZ
- ISO 3166/data/LA
- ISO 3166/data/LB
- ISO 3166/data/LC
- ISO 3166/data/LI
- ISO 3166/data/LK
- ISO 3166/data/LR
- ISO 3166/data/LS
- ISO 3166/data/LT
- ISO 3166/data/LU
- ISO 3166/data/LV
- ISO 3166/data/LY
- ISO 3166/data/MA
- ISO 3166/data/MC
- ISO 3166/data/MD
- ISO 3166/data/ME
- ISO 3166/data/MF
- ISO 3166/data/MG
- ISO 3166/data/MH
- ISO 3166/data/MK
- ISO 3166/data/ML
- ISO 3166/data/MM
- ISO 3166/data/MN
- ISO 3166/data/MO
- ISO 3166/data/MP
- ISO 3166/data/MQ
- ISO 3166/data/MR
- ISO 3166/data/MS
- ISO 3166/data/MT
- ISO 3166/data/MU
- ISO 3166/data/MV
- ISO 3166/data/MW
- ISO 3166/data/MX
- ISO 3166/data/MY
- ISO 3166/data/MZ
- ISO 3166/data/NA
- ISO 3166/data/NC
- ISO 3166/data/NE
- ISO 3166/data/NF
- ISO 3166/data/NG
- ISO 3166/data/NI
- ISO 3166/data/NL
- ISO 3166/data/NO
- ISO 3166/data/NP
- ISO 3166/data/NR
- ISO 3166/data/NU
- ISO 3166/data/NZ
local p = {}
local data = mw.loadData("Module:ISO 3166/data/National")
local function cerror(eot,errortext,inputtext)
if eot=="empty" or eot=="" then
return nil
elseif eot=="input" then
return inputtext
else
return mw.html.create("span"):addClass("error"):wikitext("Error in [[Module:ISO 3166]]: "..errortext)
end
end
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
local function isoname(data,code,lang)
if data[code]["isonames"] then
local name = data[code]["isonames"][lang or data[code]["defaultlang"] or data["defaultlang"] or "en"]
or data[code]["isonames"][data[code]["defaultlang"] or data["defaultlang"] or "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
function p.strip(text)
text = mw.ustring.upper(text) --Case insensitivity
text = string.gsub(text,"^THE ","") --Remove definite article
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
end
function p.luaname(args)
local eot = args.error or ""
if not args[1] then
return cerror(eot,"No parameter given",args[2] or "")
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,"^%w?%w?%w?$")
or not (string.find(code1,"^%u%u$") or code2=="")
then
if code2=="" then
return cerror(eot,"Invalid ISO 3166-1 code "..code1,code1)
else
return cerror(eot,"Invalid ISO 3166-2 code "..code1.."-"..code2,code1.."-"..code2)
end
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 cerror(eot,"Unknown ISO 3166-1 code "..code1,code1)
end
else
--3166-2 code
local sdata
if data[code1] then
sdata = mw.loadData("Module:ISO 3166/data/"..code1)
else
return cerror(eot,"Unknown ISO 3166-1 code "..code1,code1.."-"..code2)
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
for _,_ in pairs(sdata) do
return cerror(eot,"Unknown ISO 3166-2 code "..code1.."-"..code2,code1.."-"..code2)
end
return cerror(eot,"No subdivision codes for "..data[code1]["name"],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 or args.lang)
and isoname(data,alpha2,args.lang)
or (cdata["displayname"] or cdata["name"])
end
end
return cerror(eot,"Unknown ISO 3166-1 code "..code1,code1)
end
end
function p.name(frame)
local args = require("Module:Arguments").getArgs(frame)
return p.luaname(args) or ""
end
function p.luacode(args)
local eot = args.error or ""
if not args[1] then
return cerror(eot,"No parameter given",args[2] or "")
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 cerror(eot,"Unknown country name "..args[1],args[1])
else
--3166-2 code
for alpha2,cdata in pairs(data) do
if findname(alpha2,cdata,args[1]) then
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 cerror(eot,"No subdivision codes for "..args[1],args[2])
else
return cerror(eot,"Unknown subdivision name "..args[2],args[2])
end
end
end
return cerror(eot,"Unknown country name "..args[1],args[2])
end
end
function p.code(frame)
local args = require("Module:Arguments").getArgs(frame)
return p.luacode(args) or ""
end
return p