« Module:Countdown » : différence entre les versions
De Pikmin FR
fr>Fxfxfx0 test |
m 11 versions importées |
||
(7 versions intermédiaires par un autre utilisateur non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
-- This module powers {{countdown}}. | |||
local p = {} | |||
-- Constants | |||
local lang = mw.language.getContentLanguage() | |||
local getArgs = require('Module:Arguments').getArgs | |||
local function formatMessage(secondsLeft, event, color) | |||
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. | |||
timeLeft = string.gsub(timeLeft, '(%d+)', '<span style="color: ' .. (color or '#F00') .. '; font-weight: bold;">%1</span>') | |||
return string.format('There %s %s until %s.', isOrAre, timeLeft, event) | |||
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 text | |||
if timeToStart > 0 then | |||
-- Event has not begun yet | |||
text = formatMessage(timeToStart, args.event or 'the event begins', args.color) | |||
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) or error('args.duration should be a number of seconds', 0)) | |||
end | |||
if timeToEnd > 0 then | |||
-- Event is in progress | |||
text = args.eventstart or formatMessage(timeToEnd, (args.event or 'the event') .. ' ends', args.color) | |||
else | |||
-- Event had a duration and has now ended | |||
text = args.eventend or ((lang:ucfirst(args.event or 'The event')) .. ' has ended.') | |||
end | |||
else | |||
-- Event had no duration and has begun | |||
text = args.eventstart or ((lang:ucfirst(args.event or 'The event')) .. ' has started.') | |||
end | |||
local refreshLink | |||
if args.refresh == 'no' then | |||
refreshLink = '' | |||
else | |||
refreshLink = mw.title.getCurrentTitle():fullUrl({action = 'purge'}) | |||
refreshLink = string.format(' <span style="font-size:0.85em"><span class="plainlinks">([%s refresh])</span></span>', refreshLink) | |||
end | |||
return text .. refreshLink | |||
end | |||
return p |
Dernière version du 9 avril 2025 à 21:40
La documentation pour ce module peut être créée à Module:Countdown/doc
-- This module powers {{countdown}}.
local p = {}
-- Constants
local lang = mw.language.getContentLanguage()
local getArgs = require('Module:Arguments').getArgs
local function formatMessage(secondsLeft, event, color)
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.
timeLeft = string.gsub(timeLeft, '(%d+)', '<span style="color: ' .. (color or '#F00') .. '; font-weight: bold;">%1</span>')
return string.format('There %s %s until %s.', isOrAre, timeLeft, event)
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 text
if timeToStart > 0 then
-- Event has not begun yet
text = formatMessage(timeToStart, args.event or 'the event begins', args.color)
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) or error('args.duration should be a number of seconds', 0))
end
if timeToEnd > 0 then
-- Event is in progress
text = args.eventstart or formatMessage(timeToEnd, (args.event or 'the event') .. ' ends', args.color)
else
-- Event had a duration and has now ended
text = args.eventend or ((lang:ucfirst(args.event or 'The event')) .. ' has ended.')
end
else
-- Event had no duration and has begun
text = args.eventstart or ((lang:ucfirst(args.event or 'The event')) .. ' has started.')
end
local refreshLink
if args.refresh == 'no' then
refreshLink = ''
else
refreshLink = mw.title.getCurrentTitle():fullUrl({action = 'purge'})
refreshLink = string.format(' <span style="font-size:0.85em"><span class="plainlinks">([%s refresh])</span></span>', refreshLink)
end
return text .. refreshLink
end
return p