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-11-12
local ISO15924 = { suite = "ISO15924",
sub = "commons",
serial = "2019-11-12",
item = 71679535,
main = 71584769 }
--[=[
Create ISO 15924 mw.loadData() table from commons:Data:
]=]
local Failsafe = ISO15924
local Fetch = { }
Fetch.data = function ( access, assume )
-- Retrieve one Data.tab element
-- Precondition:
-- access -- string, with sub tab, or false
-- assume -- string, with expected structure type
-- Returns: table
local storage = ISO15924.suite
local r = { }
local data, lucky
if access then
storage = string.format( "%s/%s", storage, access )
end
storage = storage .. ".tab"
lucky, data = pcall( mw.ext.data.get, storage )
if type( data ) == "table" and
type( data.data ) == "table" and
type( Fetch[ assume ] ) == "function" then
local entry, sign, value
data = data.data
for i = 1, #data do
entry = data[ i ]
if type( entry ) == "table" then
sign, value = Fetch[ assume ]( entry )
if sign then
r[ sign ] = value
elseif value then
table.insert( r, value )
end
end
end -- for i
end
return r
end -- Fetch.data()
Fetch.boolean = function ( achieved )
-- Convert ext.data entry into assignment to boolean
local r1 = achieved[ 1 ]
local r2 = achieved[ 2 ]
if not r2 then
r1 = false
end
return r1, r2
end -- Fetch.boolean()
Fetch.ranges = function ( achieved )
-- Convert ext.data entry into table of ranges or redirects
local r = achieved[ 2 ]
if r:sub( 1, 2 ) == "0x" then
local ranges = mw.text.split( r, "%s*|%s*" )
local range
r = { }
for i = 1, #ranges do
range = mw.text.split( ranges[ i ], "%s+" )
range = { tonumber( range[ 1 ] ),
tonumber( range[ 2 ] ) }
table.insert( r, range )
end -- for i
else
r = mw.text.split( r, "%s+" )
end
return achieved[ 1 ], r
end -- Fetch.ranges()
Fetch.reverse = function ( achieved )
-- Convert ext.data entry into table item with range and string table
local iBeg = tonumber( achieved[ 1 ], 16 )
local iEnd = tonumber( achieved[ 2 ], 16 )
local permit = mw.text.split( achieved[ 3 ], "%s+" )
return false, { iBeg, iEnd, permit }
end -- Fetch.reverse()
Fetch.string = function ( achieved )
-- Convert ext.data entry into assignment to string
return achieved[ 1 ], achieved[ 2 ]
end -- Fetch.string()
Fetch.strings = function ( achieved )
-- Convert ext.data entry into assignment to table of strings
return achieved[ 1 ], mw.text.split( achieved[ 2 ], "%s+" )
end -- Fetch.strings()
Fetch.run = function ()
-- Populate object with data
-- Postcondition:
-- ISO15924 expanded
local tables = Fetch.data( false, "string" )
for k, v in pairs( tables ) do
ISO15924[ k ] = Fetch.data( k, v )
end -- for k, v
end -- Fetch.run()
local fresh = function ()
-- Check for global update
-- Returns: true, if matching global version; false, if not
-- 2019-10-15
local r
if type( Failsafe.item ) == "number" and Failsafe.item > 0 then
local storage = string.format( "Q%d", Failsafe.item )
local entity = mw.wikibase.getEntity( storage )
if type( entity ) == "table" then
local seek = Failsafe.serialProperty or "P348"
local vsn = entity:formatPropertyValues( seek )
if type( vsn ) == "table" and
vsn.value == Failsafe.serial then
r = true
end
end
end
return r or false
end -- fresh()
Fetch.run()
ISO15924.failsafe = ISO15924.serial
if mw.title.getCurrentTitle().namespace > 0 then
ISO15924.last = fresh()
end
return ISO15924