模組:Interval
外观
-- 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