<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.die-bundesrepublik.de/index.php?action=history&amp;feed=atom&amp;title=Modul%3ASort%2FcellDate</id>
	<title>Modul:Sort/cellDate - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.die-bundesrepublik.de/index.php?action=history&amp;feed=atom&amp;title=Modul%3ASort%2FcellDate"/>
	<link rel="alternate" type="text/html" href="https://wiki.die-bundesrepublik.de/index.php?title=Modul:Sort/cellDate&amp;action=history"/>
	<updated>2026-05-22T21:01:39Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Die Bundesrepublik</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://wiki.die-bundesrepublik.de/index.php?title=Modul:Sort/cellDate&amp;diff=26&amp;oldid=prev</id>
		<title>Admin: Die Seite wurde neu angelegt: „local Sort = { suite   = &quot;Sort&quot;,                sub     = &quot;cellDate&quot;,                serial  = &quot;2024-06-01&quot;,                item    = 90149250,                globals = { Cell     = 90144855,                            DateTime = 20652535 } } --[=[ Sort/cellDate -- support table cells with sortable date and time ]=] local Failsafe  = Sort local GlobalMod = Sort    Sort.localized  = false Sort.mpz        = 0.7 Sort.maxYear    = 2099 Sort.minYear    = 100 S…“</title>
		<link rel="alternate" type="text/html" href="https://wiki.die-bundesrepublik.de/index.php?title=Modul:Sort/cellDate&amp;diff=26&amp;oldid=prev"/>
		<updated>2026-03-24T18:24:34Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „local Sort = { suite   = &amp;quot;Sort&amp;quot;,                sub     = &amp;quot;cellDate&amp;quot;,                serial  = &amp;quot;2024-06-01&amp;quot;,                item    = 90149250,                globals = { Cell     = 90144855,                            DateTime = 20652535 } } --[=[ Sort/cellDate -- support table cells with sortable date and time ]=] local Failsafe  = Sort local GlobalMod = Sort    Sort.localized  = false Sort.mpz        = 0.7 Sort.maxYear    = 2099 Sort.minYear    = 100 S…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local Sort = { suite   = &amp;quot;Sort&amp;quot;,&lt;br /&gt;
               sub     = &amp;quot;cellDate&amp;quot;,&lt;br /&gt;
               serial  = &amp;quot;2024-06-01&amp;quot;,&lt;br /&gt;
               item    = 90149250,&lt;br /&gt;
               globals = { Cell     = 90144855,&lt;br /&gt;
                           DateTime = 20652535 } }&lt;br /&gt;
--[=[&lt;br /&gt;
Sort/cellDate -- support table cells with sortable date and time&lt;br /&gt;
]=]&lt;br /&gt;
local Failsafe  = Sort&lt;br /&gt;
local GlobalMod = Sort&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sort.localized  = false&lt;br /&gt;
Sort.mpz        = 0.7&lt;br /&gt;
Sort.maxYear    = 2099&lt;br /&gt;
Sort.minYear    = 100&lt;br /&gt;
Sort.similar    = mw.ustring.char( 8776 )    -- ~~&lt;br /&gt;
Sort.simple     = &amp;quot;j M Y&amp;quot;&lt;br /&gt;
Sort.supreme    = mw.ustring.char( 8734 )    -- infinit&lt;br /&gt;
Sort.types      = { &amp;quot;date&amp;quot;,&lt;br /&gt;
                    &amp;quot;time&amp;quot;,&lt;br /&gt;
                    &amp;quot;isoDate&amp;quot;,&lt;br /&gt;
                    &amp;quot;usLongDate&amp;quot; }&lt;br /&gt;
Sort.weights    = { }&lt;br /&gt;
Sort.weights.en = {&lt;br /&gt;
    [true]           = Sort.similar .. &amp;quot;abeus&amp;quot;,&lt;br /&gt;
    [&amp;quot;before&amp;quot;]       = 3,&lt;br /&gt;
    [&amp;quot;begin&amp;quot;]        = 4,&lt;br /&gt;
    [&amp;quot;begin of&amp;quot;]     = 4,&lt;br /&gt;
    [&amp;quot;beginning&amp;quot;]    = 4,&lt;br /&gt;
    [&amp;quot;beginning of&amp;quot;] = 4,&lt;br /&gt;
    [&amp;quot;since&amp;quot;]        = 6,&lt;br /&gt;
    [&amp;quot;until&amp;quot;]        = 7,&lt;br /&gt;
    [&amp;quot;end of&amp;quot;]       = 8,&lt;br /&gt;
    [&amp;quot;after&amp;quot;]        = 9,&lt;br /&gt;
    [&amp;quot;about&amp;quot;]        = true,&lt;br /&gt;
    [Sort.similar]   = true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local foreignModule = function ( access, advanced, append, alt, alert )&lt;br /&gt;
    -- Fetch global module&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     access    -- string, with name of base module&lt;br /&gt;
    --     advanced  -- true, for require(); else mw.loadData()&lt;br /&gt;
    --     append    -- string, with subpage part, if any; or false&lt;br /&gt;
    --     alt       -- number, of wikidata item of root; or false&lt;br /&gt;
    --     alert     -- true, for throwing error on data problem&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns whatever, probably table&lt;br /&gt;
    -- 2020-01-01&lt;br /&gt;
    local storage = access&lt;br /&gt;
    local finer = function ()&lt;br /&gt;
                      if append then&lt;br /&gt;
                          storage = string.format( &amp;quot;%s/%s&amp;quot;,&lt;br /&gt;
                                                   storage,&lt;br /&gt;
                                                   append )&lt;br /&gt;
                      end&lt;br /&gt;
                  end&lt;br /&gt;
    local fun, lucky, r, suited&lt;br /&gt;
    if advanced then&lt;br /&gt;
        fun = require&lt;br /&gt;
    else&lt;br /&gt;
        fun = mw.loadData&lt;br /&gt;
    end&lt;br /&gt;
    GlobalMod.globalModules = GlobalMod.globalModules or { }&lt;br /&gt;
    suited = GlobalMod.globalModules[ access ]&lt;br /&gt;
    if not suited then&lt;br /&gt;
        finer()&lt;br /&gt;
        lucky, r = pcall( fun,  &amp;quot;Module:&amp;quot; .. storage )&lt;br /&gt;
    end&lt;br /&gt;
    if not lucky then&lt;br /&gt;
        if not suited  and&lt;br /&gt;
           type( alt ) == &amp;quot;number&amp;quot;  and&lt;br /&gt;
           alt &amp;gt; 0 then&lt;br /&gt;
            suited = string.format( &amp;quot;Q%d&amp;quot;, alt )&lt;br /&gt;
            suited = mw.wikibase.getSitelink( suited )&lt;br /&gt;
            GlobalMod.globalModules[ access ] = suited or true&lt;br /&gt;
        end&lt;br /&gt;
        if type( suited ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
            storage = suited&lt;br /&gt;
            finer()&lt;br /&gt;
            lucky, r = pcall( fun, storage )&lt;br /&gt;
        end&lt;br /&gt;
        if not lucky and alert then&lt;br /&gt;
            error( &amp;quot;Missing or invalid page: &amp;quot; .. storage )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- foreignModule()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local fetch = function ( access, append )&lt;br /&gt;
    -- Fetch global library&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     access    -- string|false, with name of base module&lt;br /&gt;
    --     append    -- string, with subpage part, if any; or false&lt;br /&gt;
    local store, sub, suite&lt;br /&gt;
    if access then&lt;br /&gt;
        suite = access&lt;br /&gt;
        store = access&lt;br /&gt;
    else&lt;br /&gt;
        suite = Sort.suite&lt;br /&gt;
        if append then&lt;br /&gt;
            sub   = append:lower()&lt;br /&gt;
            store = append&lt;br /&gt;
        else&lt;br /&gt;
            store = &amp;quot;Sorter&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if type( Sort[ store ] ) == &amp;quot;nil&amp;quot; then&lt;br /&gt;
        local bib = foreignModule( suite,&lt;br /&gt;
                                   true,&lt;br /&gt;
                                   sub,&lt;br /&gt;
                                   Sort.globals[ store ],&lt;br /&gt;
                                   true )&lt;br /&gt;
        if type( bib ) == &amp;quot;table&amp;quot;   and&lt;br /&gt;
           type( bib[ suite ] ) == &amp;quot;function&amp;quot; then&lt;br /&gt;
            Sort[ store ] = bib[ suite ]()         -- MIGRATE    = bib()&lt;br /&gt;
        else&lt;br /&gt;
            error( tostring( bib ) )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
end -- fetch()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local focus = function ()&lt;br /&gt;
    -- Provide simple date pattern&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns simple date pattern&lt;br /&gt;
    local r = Sort.simple&lt;br /&gt;
    if not Sort.localized then&lt;br /&gt;
        Sort.localized = true&lt;br /&gt;
        local data = foreignModule( Sort.suite, false, &amp;quot;local&amp;quot; )&lt;br /&gt;
        if data  and&lt;br /&gt;
           type( data.simpleDatePattern ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
            Sort.simple = data.simpleDatePattern&lt;br /&gt;
            r           = Sort.simple&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- focus()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local fold = function ( access, alien, assign )&lt;br /&gt;
    -- Retrieve config table&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     access    -- string, external table&lt;br /&gt;
    --     alien     -- string, language code&lt;br /&gt;
    --     assign    -- string, local table&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns table, or not&lt;br /&gt;
    local r&lt;br /&gt;
    Sort[ assign ] = Sort[ assign ]  or  { }&lt;br /&gt;
    if type( Sort[ assign ][ alien ] ) == &amp;quot;nil&amp;quot; then&lt;br /&gt;
        local data = foreignModule( &amp;quot;DateTime&amp;quot;, false, &amp;quot;local&amp;quot; )&lt;br /&gt;
        if data  and&lt;br /&gt;
           type( data[ access ] ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            Sort[ assign ][ alien ] = data[ access ][ alien ]&lt;br /&gt;
        else&lt;br /&gt;
            Sort[ assign ][ alien ] = false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if type( Sort[ assign ][ alien ] ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        r = Sort[ assign ][ alien ]&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- fold()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local fore = function ( args )&lt;br /&gt;
    -- Create and merge sort attribute&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     args    -- table, parameters&lt;br /&gt;
    --                .d         -- table, with date&lt;br /&gt;
    --                .infinit   -- number|nil, out of ages, +/-1&lt;br /&gt;
    --                .pre       -- string|false, for prefix&lt;br /&gt;
    --                .type      -- string|false, for sorting&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     attributes extended&lt;br /&gt;
    local d = { lang = args.d.lang }&lt;br /&gt;
    local latest, least, s, stamp&lt;br /&gt;
    if args.pre then&lt;br /&gt;
        local weights = fold( &amp;quot;sortWeights&amp;quot;, d.lang, &amp;quot;weights&amp;quot; )&lt;br /&gt;
        local i&lt;br /&gt;
        if weights then&lt;br /&gt;
            i = weights[ args.pre ]&lt;br /&gt;
            if type( i ) == &amp;quot;number&amp;quot; then&lt;br /&gt;
                if i &amp;lt; 7 then&lt;br /&gt;
                   least = true&lt;br /&gt;
                else&lt;br /&gt;
                   latest = true&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if args.infinit then&lt;br /&gt;
        d.hour = 0&lt;br /&gt;
        if args.infinit &amp;gt; 0 then&lt;br /&gt;
            d.year  = Sort.maxYear&lt;br /&gt;
            d.month = 12&lt;br /&gt;
            d.dom   = 31&lt;br /&gt;
            d.min   = 59&lt;br /&gt;
            d.sec   = 59&lt;br /&gt;
        else&lt;br /&gt;
            d.month = 1&lt;br /&gt;
            d.dom   = 1&lt;br /&gt;
            d.min   = 0&lt;br /&gt;
            d.sec   = 0&lt;br /&gt;
            if args.type == &amp;quot;isoDate&amp;quot; then&lt;br /&gt;
                d.year = Sort.minYear&lt;br /&gt;
            elseif Sort.minYear &amp;lt; 0 then&lt;br /&gt;
                d.year = -1 * Sort.minYear&lt;br /&gt;
                d.bc   = true&lt;br /&gt;
            else&lt;br /&gt;
                d.year = Sort.minYear&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        stamp = string.format( &amp;quot;%04d-%02d-%02d&amp;quot;,&lt;br /&gt;
                               d.year, d.month, d.dom )&lt;br /&gt;
        if args.type == &amp;quot;isoDate&amp;quot; then&lt;br /&gt;
            stamp = string.format( &amp;quot;%sT%02d:%02d:%02d&amp;quot;,&lt;br /&gt;
                                   stamp, d.hour, d.min, d.sec )&lt;br /&gt;
        end&lt;br /&gt;
    elseif args.type == &amp;quot;time&amp;quot; then&lt;br /&gt;
        if args.d.hour then&lt;br /&gt;
            d.hour = args.d.hour&lt;br /&gt;
        elseif least then&lt;br /&gt;
            d.hour = 0&lt;br /&gt;
        elseif latest then&lt;br /&gt;
            d.hour = 24&lt;br /&gt;
        else&lt;br /&gt;
            d.hour = 12&lt;br /&gt;
        end&lt;br /&gt;
        if args.d.min then&lt;br /&gt;
            d.min = args.d.min&lt;br /&gt;
        elseif least then&lt;br /&gt;
            d.min = 0&lt;br /&gt;
        elseif latest then&lt;br /&gt;
            d.min = 59&lt;br /&gt;
        else&lt;br /&gt;
            d.min = 30&lt;br /&gt;
        end&lt;br /&gt;
        if args.d.sec then&lt;br /&gt;
            d.sec = args.d.sec&lt;br /&gt;
        elseif least then&lt;br /&gt;
            d.sec = 0&lt;br /&gt;
        elseif latest then&lt;br /&gt;
            d.sec = 59&lt;br /&gt;
        else&lt;br /&gt;
            d.sec = 30&lt;br /&gt;
        end&lt;br /&gt;
        stamp = string.format( &amp;quot;%02d:%02d:%02d&amp;quot;,&lt;br /&gt;
                               d.hour, d.min, d.sec )&lt;br /&gt;
    else&lt;br /&gt;
        args.d = Sort.DateTime( args.d )&lt;br /&gt;
        d.year = ( args.d.year or 0 )&lt;br /&gt;
        if args.d.bc  and  args.type == &amp;quot;isoDate&amp;quot; then&lt;br /&gt;
            d.bc = true&lt;br /&gt;
        else&lt;br /&gt;
            d.year = args.d.year or 0&lt;br /&gt;
        end&lt;br /&gt;
        if args.d.month then&lt;br /&gt;
            d.month = args.d.month&lt;br /&gt;
        elseif least then&lt;br /&gt;
            d.month = 1&lt;br /&gt;
        elseif latest then&lt;br /&gt;
            d.month = 12&lt;br /&gt;
        else&lt;br /&gt;
            d.month = 6&lt;br /&gt;
        end&lt;br /&gt;
        if args.d.dom then&lt;br /&gt;
            d.dom = args.d.dom&lt;br /&gt;
        elseif least then&lt;br /&gt;
            d.dom = 1&lt;br /&gt;
        else&lt;br /&gt;
            d.dom = tonumber( Sort.DateTime( d ):format( &amp;quot;t&amp;quot; ) )&lt;br /&gt;
            if not latest then&lt;br /&gt;
                d.dom = math.floor( 0.5 * d.dom )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        stamp = string.format( &amp;quot;%04d-%02d-%02d&amp;quot;,&lt;br /&gt;
                               d.year, d.month, d.dom )&lt;br /&gt;
        if args.type == &amp;quot;isoDate&amp;quot;  and  args.d.hour then&lt;br /&gt;
            stamp = string.format( &amp;quot;%sT%02d&amp;quot;,&lt;br /&gt;
                                   stamp, args.d.hour )&lt;br /&gt;
            if args.d.min then&lt;br /&gt;
                stamp = string.format( &amp;quot;%s:%02d&amp;quot;,&lt;br /&gt;
                                       stamp, args.d.min )&lt;br /&gt;
                if args.d.sec then&lt;br /&gt;
                    stamp = string.format( &amp;quot;%s:%02d&amp;quot;,&lt;br /&gt;
                                           stamp, args.d.sec )&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if args.type == &amp;quot;isoDate&amp;quot; then&lt;br /&gt;
        s = &amp;quot;c&amp;quot;&lt;br /&gt;
    elseif args.type == &amp;quot;time&amp;quot; then&lt;br /&gt;
        s = &amp;quot;H:i:s&amp;quot;&lt;br /&gt;
    elseif args.type == &amp;quot;usLongDate&amp;quot; then&lt;br /&gt;
        d.lang = &amp;quot;en&amp;quot;&lt;br /&gt;
        s = &amp;quot;F j, Y H:i:s&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        s = focus()&lt;br /&gt;
    end&lt;br /&gt;
    s = Sort.Cell.formatDate( s, stamp, true )&lt;br /&gt;
    if args.infinit then&lt;br /&gt;
        if args.infinit &amp;gt; 0 then&lt;br /&gt;
            s = s:gsub( tostring( Sort.maxYear ),  &amp;quot;9999&amp;quot; )&lt;br /&gt;
        elseif args.type == &amp;quot;isoDate&amp;quot; then&lt;br /&gt;
            s = s:gsub( string.format( &amp;quot;^%04d&amp;quot;, Sort.minYear ),&lt;br /&gt;
                        &amp;quot;-999999&amp;quot; )&lt;br /&gt;
        end&lt;br /&gt;
    elseif args.type == &amp;quot;isoDate&amp;quot; and d.bc then&lt;br /&gt;
        s = &amp;quot;-&amp;quot; .. s&lt;br /&gt;
    end&lt;br /&gt;
    Sort.Cell.faced( args, s )&lt;br /&gt;
end -- fore()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local format = function ( args )&lt;br /&gt;
    -- Format visible date&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     args    -- table, parameters&lt;br /&gt;
    --                .d          -- table, with date&lt;br /&gt;
    --                .pattern    -- string, with format&lt;br /&gt;
    --                .target     -- string|nil, for formatting&lt;br /&gt;
    --                .url        -- string|nil, for formatting&lt;br /&gt;
    --                .pad        -- boolean, for padding&lt;br /&gt;
    --                .pre        -- string, for prefix&lt;br /&gt;
    --                .post       -- string, for postfix&lt;br /&gt;
    --                .type       -- string, for sorting&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns string&lt;br /&gt;
    local r, templates&lt;br /&gt;
    if not args.d.lang then&lt;br /&gt;
        args.d.lang = Sort.Cell.facility()&lt;br /&gt;
    end&lt;br /&gt;
    if args.pad  and  not args.pre then&lt;br /&gt;
        local scheme = args.pattern&lt;br /&gt;
        if scheme then&lt;br /&gt;
            local templates = fold( &amp;quot;templates&amp;quot;,&lt;br /&gt;
                                    Sort.Cell.facility(),&lt;br /&gt;
                                    &amp;quot;templates&amp;quot; )&lt;br /&gt;
            if templates  and&lt;br /&gt;
               type( templates[ scheme ] ) == &amp;quot;table&amp;quot;  and&lt;br /&gt;
               type( templates[ scheme ].spec ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
                scheme = templates[ scheme ].spec&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if scheme then&lt;br /&gt;
            local lift&lt;br /&gt;
            if args.type == &amp;quot;time&amp;quot; then&lt;br /&gt;
                lift = ( scheme:sub( 1, 1 ) == &amp;quot;G&amp;quot;  and&lt;br /&gt;
                         args.d.hour  and&lt;br /&gt;
                         args.d.hour &amp;lt; 10 )&lt;br /&gt;
            else&lt;br /&gt;
                lift = ( scheme:sub( 1, 1 ) == &amp;quot;j&amp;quot;  and&lt;br /&gt;
                         args.d.dom  and&lt;br /&gt;
                         args.d.dom &amp;lt; 10 )&lt;br /&gt;
            end&lt;br /&gt;
            if lift then&lt;br /&gt;
                if not Sort.shift then&lt;br /&gt;
                    if Sort.Cell.following() then&lt;br /&gt;
                        Sort.shift = &amp;quot;left&amp;quot;&lt;br /&gt;
                    else&lt;br /&gt;
                        Sort.shift = &amp;quot;right&amp;quot;&lt;br /&gt;
                    end&lt;br /&gt;
                    Sort.shift = &amp;quot;padding-&amp;quot; .. Sort.shift&lt;br /&gt;
                end&lt;br /&gt;
                Sort.Cell.feature( args,&lt;br /&gt;
                                   Sort.shift,&lt;br /&gt;
                                   string.format( &amp;quot;%.2fem !important&amp;quot;,&lt;br /&gt;
                                                  Sort.mpz ) )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    r = args.d:format( args.pattern or &amp;quot;*&amp;quot; )&lt;br /&gt;
    if type( args.target ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        if r == args.target then&lt;br /&gt;
            r = string.format( &amp;quot;[[%s]]&amp;quot;, r )&lt;br /&gt;
        else&lt;br /&gt;
            r = string.format( &amp;quot;[[%s|%s]]&amp;quot;, args.target, r )&lt;br /&gt;
        end&lt;br /&gt;
    elseif type( args.url ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
        r = string.format( &amp;quot;[%s %s]&amp;quot;, args.url, r )&lt;br /&gt;
    end&lt;br /&gt;
    if args.pre or args.post then&lt;br /&gt;
        local e&lt;br /&gt;
        if args.pre then&lt;br /&gt;
            r = string.format( &amp;quot;%s %s&amp;quot;, args.pre, r )&lt;br /&gt;
        end&lt;br /&gt;
        if args.post then&lt;br /&gt;
            r = string.format( &amp;quot;%s %s&amp;quot;, r, args.post )&lt;br /&gt;
        end&lt;br /&gt;
        e = mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
                   :css( &amp;quot;white-space&amp;quot;, &amp;quot;nowrap&amp;quot; )&lt;br /&gt;
                   :wikitext( r )&lt;br /&gt;
        r = tostring( e )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- format()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local furnish = function ( args )&lt;br /&gt;
    -- Execute task&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     args    -- table, parameters&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns string, or expands .cell&lt;br /&gt;
    --     Throws error on failure&lt;br /&gt;
    local r&lt;br /&gt;
    fetch( false, &amp;quot;Cell&amp;quot; )&lt;br /&gt;
    fetch( &amp;quot;DateTime&amp;quot; )&lt;br /&gt;
    if type( args ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
        local present = Sort.Cell.first( args, true )&lt;br /&gt;
        local s&lt;br /&gt;
        Sort.Cell.fair( args, &amp;quot;d&amp;quot;, present )&lt;br /&gt;
        if not present.lang then&lt;br /&gt;
            present.lang = Sort.Cell.facility()&lt;br /&gt;
        end&lt;br /&gt;
        if type( present.d ) == &amp;quot;string&amp;quot;  and&lt;br /&gt;
           mw.ustring.find( present.d, Sort.supreme, 1, true ) then&lt;br /&gt;
            s = mw.text.trim( present.d )&lt;br /&gt;
            if s == Sort.supreme then&lt;br /&gt;
                present.infinit = 1&lt;br /&gt;
            elseif mw.ustring.len( s ) == 2  and&lt;br /&gt;
                   mw.ustring.codepoint( s, 2, 2 ) == 8734 then&lt;br /&gt;
                local m = mw.ustring.codepoint( s, 1, 1 )&lt;br /&gt;
                if m == 45  or  m == 8722 then&lt;br /&gt;
                    present.infinit = -1&lt;br /&gt;
                elseif m == 43 then&lt;br /&gt;
                    present.infinit = 1&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if present.infinit then&lt;br /&gt;
            present.d = { lang = Sort.Cell.facility() }&lt;br /&gt;
        else&lt;br /&gt;
            Sort.Cell.fair( args, &amp;quot;pre&amp;quot;, present )&lt;br /&gt;
            s = type( present.d )&lt;br /&gt;
            if s == &amp;quot;string&amp;quot;  and  not present.pre then&lt;br /&gt;
                local weights = fold( &amp;quot;sortWeights&amp;quot;,&lt;br /&gt;
                                      present.lang,&lt;br /&gt;
                                      &amp;quot;weights&amp;quot; )&lt;br /&gt;
                if weights  and  weights[ true ] then&lt;br /&gt;
                    local sw = weights[ true ]&lt;br /&gt;
                    if type( sw ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
                        local slim&lt;br /&gt;
                        slim = mw.ustring.sub( present.d, 1, 1 )&lt;br /&gt;
                        slim = mw.ustring.lower( slim )&lt;br /&gt;
                        if mw.ustring.find( sw, slim, 1, true ) then&lt;br /&gt;
                            local n&lt;br /&gt;
                            for k, v in pairs( weights ) do&lt;br /&gt;
                                if type( k ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
                                    n    = mw.ustring.len( k )&lt;br /&gt;
                                    slim = mw.ustring.sub( present.d,&lt;br /&gt;
                                                           1,&lt;br /&gt;
                                                           n )&lt;br /&gt;
                                    if slim == k then&lt;br /&gt;
                                        present.pre = k&lt;br /&gt;
                                        present.d   = mw.text.trim(&lt;br /&gt;
                                               mw.ustring.sub( present.d,&lt;br /&gt;
                                                               n + 1 ) )&lt;br /&gt;
                                        break -- for k, v&lt;br /&gt;
                                    end&lt;br /&gt;
                                end&lt;br /&gt;
                            end -- for k, v&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            if s == &amp;quot;string&amp;quot; then&lt;br /&gt;
                if present.d == &amp;quot;&amp;quot; then&lt;br /&gt;
                    s = &amp;quot;now&amp;quot;&lt;br /&gt;
                else&lt;br /&gt;
                    s = present.d&lt;br /&gt;
                end&lt;br /&gt;
                present.d = Sort.DateTime( s, args.lang )&lt;br /&gt;
            elseif s ~= &amp;quot;table&amp;quot; then&lt;br /&gt;
                present.d = Sort.DateTime( &amp;quot;now&amp;quot;, args.lang )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if type( present.d ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
            if present.d.hour then&lt;br /&gt;
                local memory = present.d.sec&lt;br /&gt;
                present.d:fix()&lt;br /&gt;
                if not memory then&lt;br /&gt;
                    present.d.sec = nil&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            Sort.Cell.fair( args, &amp;quot;type&amp;quot;, present )&lt;br /&gt;
            if type( present.type ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
                local n&lt;br /&gt;
                s = present.type&lt;br /&gt;
                n = #s&lt;br /&gt;
                if n &amp;gt; 0 then&lt;br /&gt;
                    local sort&lt;br /&gt;
                    s = s:lower()&lt;br /&gt;
                    for i = 1, #Sort.types do&lt;br /&gt;
                        sort = Sort.types[ i ]:sub( 1, n ):lower()&lt;br /&gt;
                        if s == sort then&lt;br /&gt;
                            present.type = Sort.types[ i ]&lt;br /&gt;
                            break    -- for i&lt;br /&gt;
                        end&lt;br /&gt;
                    end -- i = 1, #Sort.types&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            if not present.infinit then&lt;br /&gt;
                Sort.Cell.fair( args, &amp;quot;pattern&amp;quot;, present )&lt;br /&gt;
                if present.pattern ~= &amp;quot;-&amp;quot; then&lt;br /&gt;
                    if present.pattern then&lt;br /&gt;
                        present.pattern =&lt;br /&gt;
                           present.pattern:gsub( &amp;quot;\\ &amp;quot;,    &amp;quot; &amp;quot; )&lt;br /&gt;
                                          :gsub( &amp;quot;&amp;amp;nbsp;&amp;quot;, &amp;quot;&amp;amp;#160;&amp;quot; )&lt;br /&gt;
                    end&lt;br /&gt;
                    Sort.Cell.fair( args, &amp;quot;target&amp;quot;, present )&lt;br /&gt;
                    Sort.Cell.fair( args, &amp;quot;url&amp;quot;, present )&lt;br /&gt;
                    s = type( args.pad )&lt;br /&gt;
                    if s == &amp;quot;string&amp;quot; then&lt;br /&gt;
                        present.pad = ( args.pad == &amp;quot;1&amp;quot; )&lt;br /&gt;
                    elseif s == &amp;quot;boolean&amp;quot; then&lt;br /&gt;
                        present.pad = args.pad&lt;br /&gt;
                    end&lt;br /&gt;
                    Sort.Cell.fair( args, &amp;quot;post&amp;quot;, present )&lt;br /&gt;
                    r = format( present )&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            fore( present )&lt;br /&gt;
            r = Sort.Cell.finalize( present, r )&lt;br /&gt;
        else&lt;br /&gt;
            r = Sort.Cell.fault( &amp;quot;?!?!?!&amp;quot;, args )&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        error( &amp;quot;&amp;#039;args&amp;#039; is not a table&amp;quot; )&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- furnish()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sort.f = function ( args )&lt;br /&gt;
    -- Create table cell start&lt;br /&gt;
    -- Parameter:&lt;br /&gt;
    --     args    -- table, parameters&lt;br /&gt;
    --                .d          -- string|table, with date&lt;br /&gt;
    --                .pattern    -- string, with format&lt;br /&gt;
    --                .lang       -- string, for formatting&lt;br /&gt;
    --                .target     -- string|nil, for formatting&lt;br /&gt;
    --                .url        -- strin|nil, for formatting&lt;br /&gt;
    --                .pad        -- boolean, for padding&lt;br /&gt;
    --                .pre        -- string, for prefix&lt;br /&gt;
    --                .post       -- string, for postfix&lt;br /&gt;
    --                .cell       -- table|nil, sort environment&lt;br /&gt;
    --                .type       -- string, for sorting mode&lt;br /&gt;
    --                .rowspan    -- number|string, for cell attribute&lt;br /&gt;
    --                .colspan    -- number|string, for cell attribute&lt;br /&gt;
    --                .class      -- string, for cell attribute&lt;br /&gt;
    --                .style      -- string|table, for cell attribute&lt;br /&gt;
    --                .id         -- string, for cell attribute&lt;br /&gt;
    --                .dir        -- string, for cell attribute&lt;br /&gt;
    --                .cat        -- string|nil, for error category&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns string, or expands .cell&lt;br /&gt;
    local lucky, r = pcall( furnish, args )&lt;br /&gt;
    if not lucky then&lt;br /&gt;
        local e = mw.html.create( &amp;quot;span&amp;quot; )&lt;br /&gt;
                         :addClass( &amp;quot;error&amp;quot; )&lt;br /&gt;
                         :wikitext( &amp;quot;Module:Sort/cell * &amp;quot; .. r )&lt;br /&gt;
        if type( args.cell ) == &amp;quot;table&amp;quot;  and&lt;br /&gt;
           type( args.cell.wikitext ) == &amp;quot;function&amp;quot; then&lt;br /&gt;
            args.cell:node( e )&lt;br /&gt;
        else&lt;br /&gt;
            r = tostring( e )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Sort.f()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sort.furnish = function ()&lt;br /&gt;
    -- Retrieve list of project prefixes&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string  -- with wikitext list&lt;br /&gt;
    --              false   -- if none&lt;br /&gt;
    local r, weights&lt;br /&gt;
    fetch( false, &amp;quot;Cell&amp;quot; )&lt;br /&gt;
    weights = fold( &amp;quot;sortWeights&amp;quot;, Sort.Cell.facility(), &amp;quot;weights&amp;quot; )&lt;br /&gt;
    if weights  and  weights[ true ] then&lt;br /&gt;
        local order = { }&lt;br /&gt;
        for k, v in pairs( weights ) do&lt;br /&gt;
            if type( k ) == &amp;quot;string&amp;quot; then&lt;br /&gt;
                table.insert( order, k )&lt;br /&gt;
            end&lt;br /&gt;
        end -- for k, v&lt;br /&gt;
        table.sort( order )&lt;br /&gt;
        for i = 1, #order do&lt;br /&gt;
            if r then&lt;br /&gt;
                r = r .. &amp;quot;\n&amp;quot;&lt;br /&gt;
            else&lt;br /&gt;
                r = &amp;quot;&amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
            r = string.format( &amp;quot;%s* %s&amp;quot;, r, order[ i ] )&lt;br /&gt;
        end -- i = 1, #order&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Sort.furnish()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Failsafe.failsafe = function ( atleast )&lt;br /&gt;
    -- Retrieve versioning and check for compliance&lt;br /&gt;
    -- Precondition:&lt;br /&gt;
    --     atleast  -- string, with required version&lt;br /&gt;
    --                         or wikidata|item|~|@ or false&lt;br /&gt;
    -- Postcondition:&lt;br /&gt;
    --     Returns  string  -- with queried version/item, also if problem&lt;br /&gt;
    --              false   -- if appropriate&lt;br /&gt;
    -- 2024-03-01&lt;br /&gt;
    local since  = atleast&lt;br /&gt;
    local last   = ( since == &amp;quot;~&amp;quot; )&lt;br /&gt;
    local linked = ( since == &amp;quot;@&amp;quot; )&lt;br /&gt;
    local link   = ( since == &amp;quot;item&amp;quot; )&lt;br /&gt;
    local r&lt;br /&gt;
    if last  or  link  or  linked  or  since == &amp;quot;wikidata&amp;quot; then&lt;br /&gt;
        local item = Failsafe.item&lt;br /&gt;
        since = false&lt;br /&gt;
        if type( item ) == &amp;quot;number&amp;quot;  and  item &amp;gt; 0 then&lt;br /&gt;
            local suited = string.format( &amp;quot;Q%d&amp;quot;, item )&lt;br /&gt;
            if link then&lt;br /&gt;
                r = suited&lt;br /&gt;
            else&lt;br /&gt;
                local entity = mw.wikibase.getEntity( suited )&lt;br /&gt;
                if type( entity ) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                    local seek = Failsafe.serialProperty or &amp;quot;P348&amp;quot;&lt;br /&gt;
                    local vsn  = entity:formatPropertyValues( seek )&lt;br /&gt;
                    if type( vsn ) == &amp;quot;table&amp;quot;  and&lt;br /&gt;
                       type( vsn.value ) == &amp;quot;string&amp;quot;  and&lt;br /&gt;
                       vsn.value ~= &amp;quot;&amp;quot; then&lt;br /&gt;
                        if last  and  vsn.value == Failsafe.serial then&lt;br /&gt;
                            r = false&lt;br /&gt;
                        elseif linked then&lt;br /&gt;
                            if mw.title.getCurrentTitle().prefixedText&lt;br /&gt;
                               ==  mw.wikibase.getSitelink( suited ) then&lt;br /&gt;
                                r = false&lt;br /&gt;
                            else&lt;br /&gt;
                                r = suited&lt;br /&gt;
                            end&lt;br /&gt;
                        else&lt;br /&gt;
                            r = vsn.value&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        elseif link then&lt;br /&gt;
            r = false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if type( r ) == &amp;quot;nil&amp;quot; then&lt;br /&gt;
        if not since  or  since &amp;lt;= Failsafe.serial then&lt;br /&gt;
            r = Failsafe.serial&lt;br /&gt;
        else&lt;br /&gt;
            r = false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return r&lt;br /&gt;
end -- Failsafe.failsafe()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Export&lt;br /&gt;
local p = { }&lt;br /&gt;
&lt;br /&gt;
p.f = function ( frame )&lt;br /&gt;
    -- Template call&lt;br /&gt;
    Sort.frame = frame&lt;br /&gt;
    return Sort.f( frame.args )  or  &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.f&lt;br /&gt;
&lt;br /&gt;
p.failsafe = function ( frame )&lt;br /&gt;
    -- Versioning interface&lt;br /&gt;
    local s = type( frame )&lt;br /&gt;
    local since&lt;br /&gt;
    if s == &amp;quot;table&amp;quot; then&lt;br /&gt;
        since = frame.args[ 1 ]&lt;br /&gt;
    elseif s == &amp;quot;string&amp;quot; then&lt;br /&gt;
        since = frame&lt;br /&gt;
    end&lt;br /&gt;
    if since then&lt;br /&gt;
        since = mw.text.trim( since )&lt;br /&gt;
        if since == &amp;quot;&amp;quot; then&lt;br /&gt;
            since = false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return Failsafe.failsafe( since )  or  &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.failsafe&lt;br /&gt;
&lt;br /&gt;
p.furnish = function ()&lt;br /&gt;
    return Sort.furnish()  or  &amp;quot;&amp;quot;&lt;br /&gt;
end -- p.f&lt;br /&gt;
&lt;br /&gt;
p.Sort = function ()&lt;br /&gt;
    -- Module interface&lt;br /&gt;
    return Sort&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
setmetatable( p,  { __call = function ( func, ... )&lt;br /&gt;
                                 setmetatable( p, nil )&lt;br /&gt;
                                 return Failsafe&lt;br /&gt;
                             end } )&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>