Modul:ISO15924/maintain
| Vorlagenprogrammierung | Diskussionen | Lua | Test | Unterseiten | |||
| Modul | Deutsch | English
|
Modul: | Dokumentation | |||
Diese Seite enthält Code in der Programmiersprache Lua. Einbindungszahl Cirrus
local ISO15924 = { suite = "ISO15924",
sub = "maintain",
serial = "2019-11-12",
item = 0,
main = 71584769,
make = 71840276 }
--[=[
Create pages to maintain ISO 15924 data
]=]
codeLua = { }
local follow = function ( assign )
local r = { }
for k, v in pairs( assign ) do
table.insert( r, k )
end -- for k, v
table.sort( r )
return r
end -- follow()
codeLua.start = [===[
local ISO15924 = { suite = "%s",
sub = "codes",
serial = "%s",
item = %d,
main = %d }
--[=[
ISO 15924 mw.loadData() with a snapshot of codes
]=]
local Failsafe = ISO15924
]===]
codeLua.suffix = [===[
local fresh = function ()
-- Check for global update
-- Returns: true, if matching global version; false, if not
local r
if mw.title.getCurrentTitle().namespace > 0 and
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()
@.failsafe = @.serial
if mw.title.getCurrentTitle().namespace > 0 then
@.last = fresh()
end
return @]===]
codeLua.full = function ( frame )
-- Make Lua code for snapshot
local collection, data, e, lucky, r, sub, support
lucky, collection = pcall( mw.ext.data.get,
ISO15924.suite .. ".tab" )
if type( collection ) == "table" then
lucky, data = pcall( mw.loadData, "Module:ISO15924/commons" )
else
data = collection
end
if type( data ) == "table" then
local stamp
frame = frame or mw.getCurrentFrame()
stamp = frame:callParserFunction( "#time", "c" )
r = string.format( codeLua.start,
ISO15924.suite,
stamp,
ISO15924.make,
ISO15924.main )
collection = collection.data
for i = 1, #collection do
e = collection[ i ]
sub = e[ 1 ]
support = e[ 2 ]
r = string.format( "%s\n%s.%s = {\n%s\n}",
r,
ISO15924.suite,
sub,
codeLua[ support ]( data[ sub ] ) )
end -- for i
r = r .. codeLua.suffix:gsub( "@", ISO15924.suite )
else
r = data
end
return r
end -- codeLua.full()
codeLua.boolean = function ( assign )
local o = follow( assign )
local r = ""
local sep = ""
local s
for i = 1, #o do
s = o[ i ]
if ( assign[ s ] ) then
r = string.format( "%s%s%s = true", r, sep, s )
sep = ",\n"
end
end -- for i
return r
end -- codeLua.boolean()
codeLua.ranges = function ( assign )
local o = follow( assign )
local r = ""
local sep = ""
local j, m, s, sss, v
for i = 1, #o do
s = o[ i ]
v = assign[ s ]
if s == "*" then
s = "[\"*\"] "
elseif #s == 3 then
s = s .. " "
end
r = string.format( "%s%s%s = {", r, sep, s )
if type( v ) == "table" then
s = ""
sss = ""
for kk, vv in pairs( v ) do
r = r .. s
if type( vv ) == "table" then
j = false
for kkk, vvv in pairs( vv ) do
if j then
if j < vvv then
m = vvv
else
m = j
j = vvv
end
else
j = vvv
end
end -- for kkk, vvv
r = string.format( "%s%s { 0x%X, 0x%X }",
r, sss, j, m )
sss = ",\n "
end
end -- for kk, vv
s = ", "
end
r = r .. " }"
sep = ",\n"
end -- for i
return r
end -- codeLua.ranges()
codeLua.reverse = function ( frame, around )
-- Make Lua code for unicode ranges of script table
local data, scripts = ISO15924.fetchUnicodeMap()
local r
if type( data ) == "table" then
local e, s, sep, stamp
if around then
if not frame then
frame = mw.getCurrentFrame()
end
stamp = frame:callParserFunction( "#time", "c" )
end
for i = 1, #data do
sep = ""
if s then
s = s .. ",\n"
else
s = ""
end
e = data[ i ]
s = string.format( "%s{ 0x%05X, 0x%05X, { ",
s, e[ 1 ], e[ 2 ] )
for k = 3, #e do
s = string.format( "%s%s\"%s\"", s, sep, e[ k ] )
sep = ", "
end -- for k
s = s .. " } }"
end -- for i
if around then
e = "-- mw.loadData() table\n" ..
"-- scripting systems for unicode range\n" ..
"return {\n" ..
"suite = \"%s\",\n" ..
"sub = \"%s\",\n" ..
"failsafe = \"%s\",\n" ..
"commons = \"%s\",\n" ..
"reverse = {\n%s\n}\n};"
r = string.format( e,
ISO15924.suite,
"reverse",
stamp,
scripts,
s )
else
r = s
end
else
r = data
end
return r
end -- codeLua.reverse()
codeLua.strings = function ( assign )
local o = follow( assign )
local r = ""
local sep = ""
local s, v
for i = 1, #o do
s = o[ i ]
v = assign[ s ]
if s == "or" then
s = "[\"or\"]"
elseif #s == 3 then
s = s .. " "
elseif #s == 2 then
s = s .. " "
end
r = string.format( "%s%s%s = { ", r, sep, s )
if type( v ) == "table" then
s = ""
for kk, vv in pairs( v ) do
r = string.format( "%s%s\"%s\"", r, s, vv )
s = ", "
end -- for kk, vv
end
r = r .. " }"
sep = ",\n"
end -- for k, v
return r
end -- codeLua.strings()
ISO15924.fetchUnicodeJSON = function ()
-- Make JSON code for unicode ranges of script table
local data, scripts = ISO15924.fetchUnicodeMap()
local r
if type( data ) == "table" then
local e, s, sep
for i = 1, #data do
sep = ""
if s then
s = s .. ",\n"
else
s = ""
end
e = data[ i ]
s = string.format( "%s[ \"%05X\", \"%05X\", \"",
s, e[ 1 ], e[ 2 ] )
for k = 3, #e do
s = string.format( "%s%s%s", s, sep, e[ k ] )
sep = " "
end -- for k
s = s .. "\" ]"
end -- for i
r = string.format( "[\n%s\n]", s )
else
r = data
end
return r
end -- ISO15924.fetchUnicodeJSON()
ISO15924.fetchUnicodeMap = function ()
-- Make table for unicode ranges of script table
local lucky, data = pcall( mw.loadData,
"Module:ISO15924/commons" )
local r, scripts
if type( data ) == "table" then
if type( data.unicodes ) == "table" then
local unicodes = data.unicodes
local bib
lucky, bib = pcall( require, "Module:ISO15924" )
if type( bib ) == "table" then
local ranges = { }
bib = bib.ISO15924()
for s, v in pairs( unicodes ) do
if #s == 4 and
s:match( "^%u%l%l%l$" ) and
type( v ) == "table" then
bib.Unicode.merge( ranges, unicodes, s, true )
end
end -- for s, v
r = ISO15924.fixUnicodeRanges( bib, ranges )
else
r = bib
end
else
r = "ISO15924/commons .unicodes not found"
end
scripts = data.failsafe
else
r = data
end
return r, scripts
end -- ISO15924.fetchUnicodeMap()
ISO15924.fixUnicodeRanges = function ( access, assign )
-- Unify sequence table of ranges
-- Precondition:
-- access -- table, with library
-- assign -- table, with sequence table of ranges
-- Postcondition:
-- Returns unified table
local r = assign
local k = #r
local before, current, living, plus
access.Unicode.sort( r )
while k > 1 do
before = r[ k - 1 ]
current = r[ k ]
if before[ 2 ] > current[ 2 ] then
plus = { current[ 2 ] + 1, before[ 2 ] }
for i = 3, #before do
table.insert( plus, before[ i ] )
end -- for i
before[ 2 ] = current[ 2 ]
r[ k - 1 ] = before
table.insert( r, k + 1, plus )
living = true
elseif before[ 2 ] >= current[ 1 ] and
before[ 2 ] < current[ 2 ] and
before[ 1 ] < current[ 1 ] then
plus = { before[ 2 ] + 1, current[ 2 ] }
for i = 3, #current do
table.insert( plus, current[ i ] )
end -- for i
current[ 2 ] = before[ 2 ]
r[ k ] = current
table.insert( r, k + 1, plus )
living = true
elseif before[ 1 ] < current[ 1 ] and
before[ 2 ] == current[ 2 ] then
for i = 3, #before do
table.insert( current, before[ i ] )
end -- for i
r[ k ] = current
before[ 2 ] = current[ 1 ] - 1
r[ k - 1 ] = before
elseif before[ 1 ] == current[ 1 ] and
before[ 2 ] == current[ 2 ] then
for i = 3, #current do
table.insert( before, current[ i ] )
end -- for i
r[ k - 1 ] = before
table.remove( r, k )
end
k = k - 1
end -- while
if living then
r = ISO15924.fixUnicodeRanges( access, r )
else
for k = 1, #r do
current = r[ k ]
if #current > 3 then
plus = { current[ 1 ], current[ 2 ] }
before = { }
for i = 3, #current do
table.insert( before, current[ i ] )
end -- for i
table.sort( before )
for i = 1, #before do
if i == 1 or
before[ i ] ~= before[ i - 1 ] then
table.insert( plus, before[ i ] )
end
end -- for i
r[ k ] = plus
end
end -- for k
end
return r
end -- ISO15924.fixUnicodeRanges()
ISO15924.failsafe = ISO15924.serial
-- Export
local p = { }
p.fetchUnicodeJSON = function ( frame )
return ISO15924.fetchUnicodeJSON ()
end -- p.fetchUnicodeJSON()
p.fetchLua = function ( frame )
return codeLua.full( frame )
end -- p.fetchLua()
p.fetchUnicodeLua = function ( frame )
return codeLua.reverse( frame, true )
end -- p.fetchUnicodeLua()
p.ISO15924 = function ()
return ISO15924
end -- p.ISO15924
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.