Modul:Sort: Unterschied zwischen den Versionen

7.274 Bytes hinzugefügt ,  vor 2 Jahren
K
14 Versionen von wikivoyage:Modul:Sort importiert
w>PerfektesChaos
(RELEASE num+latin)
K (14 Versionen von wikivoyage:Modul:Sort importiert)
 
(10 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
--[=[ 2013-10-25
local Sort = { suite  = "Sort",
              serial = "2019-10-29",
              item  = 24205172 }
--[=[
Sort
Sort
]=]
]=]
local Failsafe  = Sort
local GlobalMod = Sort






local Sort = { }
local foreignModule = function ( access, advanced, append, alt, alert )
    -- Fetch global module
    -- Precondition:
    --    access    -- string, with name of base module
    --    advanced  -- true, for require(); else mw.loadData()
    --    append    -- string, with subpage part, if any; or false
    --    alt      -- number, of wikidata item of root; or false
    --    alert    -- true, for throwing error on data problem
    -- Postcondition:
    --    Returns whatever, probably table
    -- 2019-10-29
    local storage = access
    local finer = function ()
                      if append then
                          storage = string.format( "%s/%s",
                                                  storage,
                                                  append )
                      end
                  end
    local fun, lucky, r, suited
    if advanced then
        fun = require
    else
        fun = mw.loadData
    end
    GlobalMod.globalModules = GlobalMod.globalModules or { }
    suited = GlobalMod.globalModules[ access ]
    if not suited then
        finer()
        lucky, r = pcall( fun,  "Module:" .. storage )
    end
    if not lucky then
        if not suited  and
          type( alt ) == "number"  and
          alt > 0 then
            suited = string.format( "Q%d", alt )
            suited = mw.wikibase.getSitelink( suited )
            GlobalMod.globalModules[ access ] = suited or true
        end
        if type( suited ) == "string" then
            storage = suited
            finer()
            lucky, r = pcall( fun, storage )
        end
        if not lucky and alert then
            error( "Missing or invalid page: " .. storage, 0 )
        end
    end
    return r
end -- foreignModule()




Zeile 13: Zeile 67:
     -- Precondition:
     -- Precondition:
     --    adjust  -- string to be aligned
     --    adjust  -- string to be aligned
     --    apply  -- string with base
     --    apply  -- string or table, with base
     --                "latin"
     --                "latin"
     --    adapt  -- variation, or false
     --    adapt  -- string or table, with variation, or false
     --                "DIN5007m2"  -- DIN 5007 mode "2"
     --                "DIN5007m2"  -- DIN 5007 mode "2"
     local r = adjust
     local r = adjust
     if not r:match( "^[ -~]*$" ) then
     if adapt  or  not r:match( "^[ -~]*$" ) then
        local lucky
         local collate, post, pre
         local collate
         if apply then
         if apply then
             collate = apply
             collate = apply
Zeile 26: Zeile 79:
             collate = "uni"
             collate = "uni"
         end
         end
         if adapt then
         if type( collate ) == "string" then
             collate = collate .. adapt
            collate = foreignModule( Sort.suite,
                                    false,
                                    collate,
                                    Sort.item )
        end
        if adapt  and  type( collate ) == "table" then
            local variants = type( adapt )
            local n
            if variants == "string" then
                variants = mw.text.split( adapt, "%s+" )
            elseif variants == "table" then
                variants = adapt
            else
                variants = { }
            end
            n = #variants
            if n == 1  and  variants[ 1 ] == "" then
                n = 0
             end
            if n > 0 then
                local tmp = { }
                local var
                for k, v in pairs( collate ) do
                    tmp[ k ] = v
                end    -- for k, v
                collate = tmp
                for i = 1, n do
                    tmp = foreignModule( Sort.suite,
                                        false,
                                        variants[ i ],
                                        Sort.item )
                    if type( tmp ) == "table" then
                        var = tmp.single
                        if type( var ) ~= "table" then
                            -- legacy
                            var = tmp
                        end
                        if type( var ) == "table" then
                            for k, v in pairs( var ) do
                                collate[ k ] = v
                            end    -- for k, v
                        end
                        var = tmp.pre
                        if type( var ) == "table" then
                            if type( pre ) ~= "table" then
                                pre = { }
                            end
                            for k, v in pairs( var ) do
                                pre[ k ] = v
                            end    -- for k, v
                        end
                        var = tmp.post
                        if type( var ) == "table" then
                            if type( post ) ~= "table" then
                                post = { }
                            end
                            for k, v in pairs( var ) do
                                post[ k ] = v
                            end    -- for k, v
                        end
                    elseif type( tmp ) == "string" then
                        collate = tmp
                        break    -- for i
                    else
                        collate = "Invalid table " .. variants[ i ]
                        break    -- for i
                    end
                end    -- for i
            end
         end
         end
        collate = "Module:Sort/" .. collate
        lucky, collate = pcall( mw.loadData, collate )
         if type( collate ) == "table" then
         if type( collate ) == "table" then
             local k, n, s, start
             local k, n, s, start
             local n = mw.ustring.len( r )
             if type( pre ) == "table" then
                for k, v in pairs( pre ) do
                    r = mw.ustring.gsub( r, k, v )
                end    -- for k, v
            end
            n = mw.ustring.len( r )
             for i = n, 1, -1 do
             for i = n, 1, -1 do
                 k = mw.ustring.codepoint( r, i, i )
                 k = mw.ustring.codepoint( r, i, i )
Zeile 41: Zeile 165:
                         s = " "
                         s = " "
                     end
                     end
                elseif ( k >= 0x0300  and  k <= 0x0362 )  or
                      ( k >= 0x1AB0  and  k <= 0x1AFF )  or
                      ( k >= 0x1DC0  and  k <= 0x1DFF )  or
                      ( k >= 0xFE20  and  k <= 0xFE2F ) then
                    -- COMBINING ...
                    s = ""
                 else
                 else
                     s = collate[ k ]
                     s = collate[ k ]
Zeile 51: Zeile 181:
                 end
                 end
             end    -- for i--
             end    -- for i--
            if type( post ) == "table" then
                for k, v in pairs( post ) do
                    r = mw.ustring.gsub( r, k, v )
                end    -- for k, v
            end
         else
         else
             r = "**ERROR** Sort.lex ** Submodule unavailable " .. collate
             r = "**ERROR** Sort.lex ** Submodule unavailable " .. collate
Zeile 194: Zeile 329:
     return r
     return r
end -- Sort.num()
end -- Sort.num()
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
    -- 2019-10-15
    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 seek = Failsafe.serialProperty or "P348"
                local vsn  = entity:formatPropertyValues( seek )
                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()




Zeile 206: Zeile 386:
     --    v  -- variant, omitted or "DIN5007m2"
     --    v  -- variant, omitted or "DIN5007m2"
     local lucky, r = pcall( Sort.lex,
     local lucky, r = pcall( Sort.lex,
                             frame:getParent().args[ 1 ] or "",
                            frame.args[ 1 ]  or
                             frame:getParent().args[ 1 ] or
                            "",
                             "latin",
                             "latin",
                             frame.args.v )
                             frame.args.v )
     return r;
     return r;
end -- p.Tlatin
end -- p.Tlatin
p.Td = function ( frame )
    -- Template::date
    --    {{{1}}}
    return "not yet ready"
end -- p.Td




Zeile 231: Zeile 405:
     --    m  -- negative figures by digits; default: by value
     --    m  -- negative figures by digits; default: by value
     local lucky, r = pcall( Sort.num,
     local lucky, r = pcall( Sort.num,
                             frame:getParent().args[ 1 ] or "",
                            frame.args[ 1 ]  or
                             frame:getParent().args[ 1 ] or
                            "",
                             frame.args.d,
                             frame.args.d,
                             frame.args.t,
                             frame.args.t,
Zeile 238: Zeile 414:
     return r;
     return r;
end -- p.Tn
end -- p.Tn
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()