Toggle menu
14
222
68
27K
Kenshi Wiki
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

This module implements the {{interval}} template. Please see the template page for documentation.


-- This module powers {{interval}}.

local p = {}

-- Constants
local lang = mw.language.getContentLanguage()
local getArgs = require('Module:Arguments').getArgs

local function getArgNums(args)
    -- Returns an array containing the keys of all positional arguments
    -- that contain data (i.e. non-whitespace values).
    -- (from Module:Unbulleted_list)
    local nums = {}
    for k, v in pairs(args) do
        if type(k) == 'number' and
            k >= 1 and
            math.floor(k) == k and
            mw.ustring.match(v, '%S') then
                table.insert(nums, k)
        end
    end
    table.sort(nums)
    return nums
end

function p.main(frame)
    local args = getArgs(frame)
    return p._main(args)
end

function p._main(args)
    local n, rule, format = args.n, args.rule, args.format
    local numbers = getArgNums(args)
    local low, high, lowpos, highpos = nil, nil, 0, #numbers + 1

    -- If comparing times, convert them all to seconds after the epoch
    if format == 'time' then
        if n then
            n = lang:formatDate('U', '@' .. n)
        else
            n = os.time() -- Set n to now if no time provided
        end
    end

    n = tonumber(n)

    for i, num in ipairs(numbers) do
        local interval
        if format == 'time' then
            interval = tonumber(lang:formatDate('U', '@' .. args[num]))
        else
            interval = tonumber(args[num])
        end

        if n and ((n >= interval and not rule) or (n > interval and rule == '>')) then
            low = interval
            lowpos = num
        else
            high = high and math.min(interval, high) or interval
            if high == interval then highpos = num end
        end
    end
    return lowpos .. '-' .. highpos
end

return p