Jump to content

Module:Countdown: Difference between revisions

From Wikipedia, the free encyclopedia
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'})
local timeLeft = lang:formatDuration(secondsLeft, {'years', 'weeks', 'days', 'hours', 'minutes', 'seconds'})
-- Find whether we are plural or not.
-- Find whether we are plural or not.
local isOrAre
local isOrAre
if mw.ustring.match(timeLeft, '^%d+') == '1' then
if string.match(timeLeft, '^%d+') == '1' then
isOrAre = 'is'
isOrAre = 'is'
else
else
isOrAre = 'are'
isOrAre = 'are'
end
end
-- Color and bold the numbers, because it makes them look important.
-- 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>')
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.
-- Make the refresh link and join it all together.
return mw.ustring.format('There %s %s until %s.%s', isOrAre, timeLeft, event, refreshLink)
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)
local args = getArgs(frame)


if not (args.year and args.month and args.day) then
if not (args.year and args.month and args.day) then
return '<strong class="error">Error: year, month, and day must be specified</strong>'
return '<strong class="error">Error: year, month, and day must be specified</strong>'
end
end


local eventTime = os.time{year=args.year, month=args.month, day=args.day, hour=args.hour, min=args.minute, sec=args.second}
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 timeToStart = os.difftime(eventTime, os.time()) -- (future time - current time)


local refreshLink = mw.title.getCurrentTitle():fullUrl{action = 'purge'}
local refreshLink = mw.title.getCurrentTitle():fullUrl({action = 'purge'})
refreshLink = mw.ustring.format(' <small><span class="plainlinks">([%s refresh])</span></small>', refreshLink)
refreshLink = string.format(' <small><span class="plainlinks">([%s refresh])</span></small>', refreshLink)
if timeToStart > 0 then
if timeToStart > 0 then
-- Event has not begun yet
-- Event has not begun yet
return formatMessage(timeToStart, args.event or 'the event begins', args.color, refreshLink)
return formatMessage(timeToStart, args.event or 'the event begins', args.color, refreshLink)
elseif args.duration then
elseif args.duration then
local timeToEnd
local timeToEnd
if args['duration unit'] then
if args['duration unit'] then
-- Duration is in unit other than seconds, use formatDate to add
-- Duration is in unit other than seconds, use formatDate to add
timeToEnd = tonumber(lang:formatDate('U', '@' .. tostring(timeToStart) .. ' +' .. tostring(args.duration) .. ' ' .. args['duration unit']))
timeToEnd = tonumber(lang:formatDate('U', '@' .. tostring(timeToStart) .. ' +' .. tostring(args.duration) .. ' ' .. args['duration unit']))
else
else
timeToEnd = timeToStart + tonumber(args.duration)
timeToEnd = timeToStart + tonumber(args.duration)
end
end
if timeToEnd > 0 then
if timeToEnd > 0 then
-- Event is in progress
-- Event is in progress
return args.eventstart .. refreshLink or formatMessage(timeToEnd, (args.event or 'the event') .. ' ends', args.color, refreshLink)
return args.eventstart .. refreshLink or formatMessage(timeToEnd, (args.event or 'the event') .. ' ends', args.color, refreshLink)
else
else
-- Event had a duration and has now ended
-- Event had a duration and has now ended
return ((args.eventend or ((lang:ucfirst(args.event) or 'The event') .. ' has ended.')) .. refreshLink)
return (args.eventend or ((lang:ucfirst(args.event or 'The event')) .. ' has ended.')) .. refreshLink
end
end
else
else
-- Event had no duration and has begun
-- Event had no duration and has begun
return ((args.eventstart or ((lang:ucfirst(args.event) or 'The event') .. ' has started.')) .. refreshLink)
return (args.eventstart or ((lang:ucfirst(args.event or 'The event')) .. ' has started.')) .. refreshLink
end
end
end
end



Revision as of 03:27, 18 November 2015

-- 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