Jump to content

Module:Interval: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
Use formatDate
Line 3: Line 3:
local p = {}
local p = {}


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


local function getArgNums(args)
local function getArgNums(args)
Line 24: Line 25:


function p.main(frame)
function p.main(frame)
local args = frame:getParent().args
local args = getArgs(frame)
local n, rule, format = args.n, args.rule, args.format
local n, rule, format = args.n, args.rule, args.format
local numbers = getArgNums(args)
local numbers = getArgNums(args)
Line 32: Line 33:
if format == 'time' then
if format == 'time' then
if n then
if n then
n = tonumber(lang:formatDate('U', '@' .. n))
n = lang:formatDate('U', '@' .. n)
else
else
n = os.time() -- Set n to now if no time provided
n = os.time() -- Set n to now if no time provided

Revision as of 03:51, 9 December 2013

-- 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)
    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 >= 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