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.

  1. 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:
  2. 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.
  3. 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.
  4. 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.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.