Modul:ISO3166
Modul:ISO3166
| Vorlagenprogrammierung | Diskussionen | Lua | Test | Unterseiten | |||
| Modul | Deutsch | English
|
Modul: | Dokumentation | |||
Diese Seite enthält Code in der Programmiersprache Lua. Einbindungszahl Cirrus
Dies ist die (produktive) Mutterversion eines global benutzten Lua-Moduls.
Wenn die serial-Information nicht übereinstimmt, müsste eine Kopie hiervon in das lokale Wiki geschrieben werden.
Wenn die serial-Information nicht übereinstimmt, müsste eine Kopie hiervon in das lokale Wiki geschrieben werden.
Versionsbezeichnung auf WikiData:
2019-10-14local ISO3166 = { suite = "ISO3166",
serial = "2019-10-14",
item = 69799761 }
--[=[
Retrieve ISO 3166 data and convert codes
require()
]=]
local Failsafe = ISO3166
ISO3166.pats = { A2 = "^%u%u$",
A3 = "^%u%u%u$",
A4 = "^%u%u%u%u$",
NUM = "^%d%d%d$" }
local find = function ( a2, ancient )
-- Retrieve aliases table
-- Precondition:
-- a2 -- string, with A2 key
-- ancient -- true, if not redirecting old code to new country
-- Returns table of strings, or false
local r, store
if type( ISO3166.resolve ) ~= "table" then
ISO3166.resolve = { }
end
if ancient then
store = a2 .. "_"
else
store = a2
end
if type( ISO3166.resolve[ store ] ) ~= "nil" then
r = ISO3166.resolve[ store ]
else
local set = ISO3166.codes[ a2 ]
if type( set ) == "string" then
local s
r = mw.text.split( set, "%s+" )
s = r[ 1 ]
if s and s ~= a2 then
if #s == 2 and not ancient then
set = ISO3166.codes[ s ]
if type( set ) == "string" then
r = mw.text.split( set, "%s+" )
end
end
table.insert( r, 1, a2 )
end
end
ISO3166.resolve[ store ] = ( r or false )
end
return r
end -- find()
ISO3166.fetch = function ( alert )
-- Retrieve data
-- Precondition:
-- alert -- true, for throwing error on data problem
-- Postcondition:
-- Library is extended, if necessary
if not ( ISO3166.codes and ISO3166.reverse ) then
local sub = "loadData"
local storage = string.format( "Module:%s/%s",
ISO3166.suite, sub )
local lucky, data = pcall( mw.loadData, storage )
if not lucky then
if not ISO3166.suited and
type( ISO3166.item ) == "number" then
local suited = string.format( "Q%d", ISO3166.item )
ISO3166.suited = mw.wikibase.getSitelink( suited )
end
if type( ISO3166.suited ) == "string" then
storage = string.format( "%s/%s", ISO3166.suited, sub )
lucky, data = pcall( mw.loadData, storage )
end
end
if type( data ) == "table" then
if type( data.codes ) == "table" and
type( data.reverse ) == "table" then
ISO3166.codes = data.codes
ISO3166.reverse = data.reverse
elseif alert then
error( "Invalid table (codes/reverse)", 0 )
end
elseif alert then
error( "Missing page: " .. storage, 0 )
end
ISO3166.codes = ISO3166.codes or { }
ISO3166.reverse = ISO3166.reverse or { }
end
end -- ISO3166.fetch()
ISO3166.f = function ( access, alter, ancient )
-- Retrieve preferred code
-- Precondition:
-- access -- string, with key as A2, A3, NUM, A4
-- alter -- string, optional, with one of A2, A3, NUM (A3)
-- ancient -- true, if not redirecting old code to new country
-- Returns string -- with converted code
-- false -- if unknown
local r
if type( access ) == "string" then
local seek = access:upper()
local entry, suitable
if type( alter ) == "string" then
suitable = alter:upper()
if suitable == "A4" then
ancient = true
end
else
suitable = "A3"
end
ISO3166.fetch()
seek = ISO3166.reverse[ seek ]
if seek then
entry = find( seek, ancient )
if entry then
suitable = ISO3166.pats[ suitable ]
if not suitable then
suitable = ISO3166.pats.A3
end
if suitable then
local s
for i = 1, #entry do
s = entry[ i ]
if s:match( suitable ) then
r = s
break -- for i
end
end -- for i
if not r and #entry == 1 then
-- "EU" fallback
r = entry[ 1 ]
end
end
end
end
end
return r or false
end -- ISO3166.f()
Failsafe.failsafe = function ( atleast )
-- Retrieve versioning and check for compliance
-- Precondition:
-- atleast -- string, with required version or "wikidata" or "~"
-- or false
-- Postcondition:
-- Returns string -- with queried version, also if problem
-- false -- if appropriate
local last = ( atleast == "~" )
local since = atleast
local r
if last or since == "wikidata" then
local item = Failsafe.item
since = false
if type( item ) == "number" and item > 0 then
local entity = mw.wikibase.getEntity( string.format( "Q%d",
item ) )
if type( entity ) == "table" then
local vsn = entity:formatPropertyValues( "P348" )
if type( vsn ) == "table" and
type( vsn.value ) == "string" and
vsn.value ~= "" then
if last and vsn.value == Failsafe.serial then
r = false
else
r = vsn.value
end
end
end
end
end
if type( r ) == "nil" then
if not since or since <= Failsafe.serial then
r = Failsafe.serial
else
r = false
end
end
return r
end -- Failsafe.failsafe()
-- Export
local p = { }
function p.f( frame )
local seek = frame.args[ 1 ]
local r
if seek then
seek = mw.text.trim( seek )
if seek ~= "" then
local shift = frame.args[ 2 ]
local stop = frame.args[ 3 ]
local lazy
if shift then
shift = mw.text.trim( shift )
if shift == "" then
shift = false
end
end
if stop then
lazy =( mw.text.trim( stop ) == "1" )
end
r = ISO3166.f( seek, shift, lazy )
end
end
return r or ""
end -- p.f
p.failsafe = function ( frame )
-- Versioning interface
local s = type( frame )
local since
if s == "table" then
since = frame.args[ 1 ]
elseif s == "string" then
since = frame
end
if since then
since = mw.text.trim( since )
if since == "" then
since = false
end
end
return Failsafe.failsafe( since ) or ""
end -- p.failsafe
p.ISO3166 = function ()
return ISO3166
end -- p.ISO3166()
return p
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.