Module:Interval
This template is used in Template:ACEWatchlistNotice, which is used by MediaWiki:Watchlist-messages when Arbitration Committee elections are taking place. Changes to it can cause immediate changes to the Wikipedia user interface. To avoid large-scale disruption, any changes should first be tested in this template's /sandbox or /testcases subpage, or in your own user space. The tested changes can then be added in one single edit to this template. Please discuss any changes at the talk page before implementing them. |
This module is rated as beta, and is ready for widespread use. It is still new and should be used with some caution to ensure the results are as expected. |
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