Module:Countdown: Difference between revisions
Appearance
Content deleted Content added
m mistake |
update from Module:Countdown/sandbox to fix problem when args.event is nil; needs some more adjustment for other args |
||
Line 7: | Line 7: | ||
local getArgs = require('Module:Arguments').getArgs |
local getArgs = require('Module:Arguments').getArgs |
||
function formatMessage(secondsLeft, event, color, refreshLink) |
local 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 string.match(timeLeft, '^%d+') == '1' then |
|||
isOrAre = 'is' |
|||
else |
|||
isOrAre = 'are' |
|||
end |
|||
-- Color and bold the numbers, because it makes them look important. |
|||
local timeLeft = string.gsub(timeLeft, '(%d+)', '<span style="color: ' .. (color or '#F00') .. '; font-weight: bold;">%1</span>') |
|||
-- Make the refresh link and join it all together. |
|||
return string.format('There %s %s until %s.%s', isOrAre, timeLeft, event, refreshLink) |
|||
end |
end |
||
function p.main(frame) |
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 = string.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 |
end |
||
Revision as of 03:27, 18 November 2015
![]() | 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 is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. |
![]() | This Lua module is used on approximately 460 pages and changes may be widely noticed. Test changes in the module's /sandbox or /testcases subpages, or in your own module sandbox. Consider discussing changes on the talk page before implementing them. |
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
local 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 string.match(timeLeft, '^%d+') == '1' then
isOrAre = 'is'
else
isOrAre = 'are'
end
-- Color and bold the numbers, because it makes them look important.
local timeLeft = string.gsub(timeLeft, '(%d+)', '<span style="color: ' .. (color or '#F00') .. '; font-weight: bold;">%1</span>')
-- Make the refresh link and join it all together.
return string.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 = string.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