Module:Interval
Appearance
This Lua module 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 major disruption, any changes should be tested in the module's /sandbox or /testcases subpages, or in your own module sandbox. The tested changes can be added to this page in a single edit. Please discuss changes on 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