ମଡ୍ୟୁଲ:Countdown
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 {{countdown}}. Please see the template page for documentation.
-- This module powers {{countdown}}.
local p = {}
-- Constants
local lang = mw.language.getContentLanguage()
local getArgs = require('Module:Arguments').getArgs
function formatMessage(secondsLeft, event, color, refreshLink)
local timeLeft = lang:formatDuration(secondsLeft, {'years', 'weeks', 'days', 'hours', 'minutes', 'seconds'})
-- Find whether we are plural or not.
local isOrAre
if mw.ustring.match(timeLeft, '^%d+') == '1' then
isOrAre = 'is'
else
isOrAre = 'are'
end
-- Color and bold the numbers, because it makes them look important.
local timeLeft = mw.ustring.gsub(timeLeft, '(%d+)', '<span style="color: ' .. (color or '#F00') .. '; font-weight: bold;">%1</span>')
-- Make the refresh link and join it all together.
return mw.ustring.format('There %s %s until %s.%s', isOrAre, timeLeft, event, refreshLink)
end
function p.main(frame)
local args = getArgs(frame)
if not (args.year and args.month and args.day) then
return '<strong class="error">Error: year, month, and day must be specified</strong>'
end
local eventTime = os.time{year=args.year, month=args.month, day=args.day, hour=args.hour, min=args.minute, sec=args.second}
local timeToStart = os.difftime(eventTime, os.time()) -- (future time - current time)
local refreshLink = mw.title.getCurrentTitle():fullUrl{action = 'purge'}
refreshLink = mw.ustring.format(' <small><span class="plainlinks">([%s refresh])</span></small>', refreshLink)
if timeToStart > 0 then
-- Event has not begun yet
return formatMessage(timeToStart, args.event or 'the event begins', args.color, refreshLink)
elseif args.duration then
local timeToEnd
if args['duration unit'] then
-- Duration is in unit other than seconds, use formatDate to add
timeToEnd = tonumber(lang:formatDate('U', '@' .. tostring(timeToStart) .. ' +' .. tostring(args.duration) .. ' ' .. args['duration unit']))
else
timeToEnd = timeToStart + tonumber(args.duration)
end
if timeToEnd > 0 then
-- Event is in progress
return args.eventstart .. refreshLink or formatMessage(timeToEnd, (args.event or 'the event') .. ' ends', args.color, refreshLink)
else
-- Event had a duration and has now ended
return ((args.eventend or ((lang:ucfirst(args.event) or 'The event') .. ' has ended.')) .. refreshLink)
end
else
-- Event had no duration and has begun
return ((args.eventstart or ((lang:ucfirst(args.event) or 'The event') .. ' has started.')) .. refreshLink)
end
end
return p