Difference between revisions of "Module:Time ago"
Jump to navigation
Jump to search
blackwiki>FunPika (Use Module:Arguments, rename function to main.) |
blackwiki>FunPika m (A little more cleanup.) |
||
| Line 16: | Line 16: | ||
local min_magnitude_num | local min_magnitude_num | ||
local result | local result | ||
| + | local result_unit | ||
local magnitude = args.magnitude | local magnitude = args.magnitude | ||
local min_magnitude = args.min_magnitude | local min_magnitude = args.min_magnitude | ||
| Line 55: | Line 56: | ||
min_magnitude_num = timeText[magnitude] | min_magnitude_num = timeText[magnitude] | ||
else | else | ||
| + | -- Calculate the appropriate unit of time if it was not specified as an argument. | ||
if ( math.floor( absTimeDiff / 120 ) > 0 ) then auto_magnitude_num = 60 else auto_magnitude_num = 1 end | if ( math.floor( absTimeDiff / 120 ) > 0 ) then auto_magnitude_num = 60 else auto_magnitude_num = 1 end | ||
if ( math.floor( absTimeDiff / 7200 ) > 0 ) then auto_magnitude_num = 3600 end | if ( math.floor( absTimeDiff / 7200 ) > 0 ) then auto_magnitude_num = 3600 end | ||
| Line 67: | Line 69: | ||
local magnitude_num = math.max( min_magnitude_num, auto_magnitude_num ) | local magnitude_num = math.max( min_magnitude_num, auto_magnitude_num ) | ||
local result_num = math.floor ( absTimeDiff / magnitude_num ) | local result_num = math.floor ( absTimeDiff / magnitude_num ) | ||
| − | |||
if ( timeDiff >= 0 ) then -- Past | if ( timeDiff >= 0 ) then -- Past | ||
Revision as of 21:45, 23 December 2013
| 40x40px | 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. |
| 40px | This Lua module is used on approximately 143,000 pages. To avoid major disruption and server load, any changes should be tested in the module's /sandbox or /testcases subpages. The tested changes can be added to this page in a single edit. Consider discussing changes on the talk page before implementing them. Transclusion count updated automatically (see documentation). |
The module “Time ago” implements {{Time ago}}. See the template's page for documentation. Test cases can be found at Module talk:TimeAgo/testcases and Template:Time ago/testcases.
-- Replacement for [[Template:Time ago]]
local HtmlBuilder = require('Module:HtmlBuilder')
local getArgs = require('Module:Arguments').getArgs
local p = {}
function p.main( frame )
local args = getArgs( frame )
return p._main( args )
end
function p._main( args )
-- Initialize variables
local lang = mw.language.getContentLanguage()
local auto_magnitude_num
local min_magnitude_num
local result
local result_unit
local magnitude = args.magnitude
local min_magnitude = args.min_magnitude
if args.ago then ago = args.ago else ago = 'ago' end
local purge = ''
-- Add a purge link if something (usually "yes") is entered into the purge parameter
if ( args.purge ) then
local builder = HtmlBuilder.create()
builder
.wikitext(' ')
.tag('span')
.addClass('plainlinks')
.wikitext('([' .. mw.title.getCurrentTitle():fullUrl('action=purge') .. ' purge])')
.done()
purge = tostring(builder)
end
-- Check that the entered timestamp is valid. If it isn't, then give an error message.
local noError, inputTime = pcall( lang.formatDate, lang, 'U', args[1] )
if not noError then
local builder = HtmlBuilder.create()
builder
.tag('strong')
.addClass('error')
.wikitext('Error: first parameter cannot be parsed as a date or time.')
.done()
return tostring(builder) .. purge
end
-- Store the difference between the current time and the inputted time, as well as its absolute value.
local timeDiff = lang:formatDate( 'U' ) - inputTime
local absTimeDiff = math.abs( timeDiff )
if magnitude then
auto_magnitude_num = 0
min_magnitude_num = timeText[magnitude]
else
-- Calculate the appropriate unit of time if it was not specified as an argument.
if ( math.floor( absTimeDiff / 120 ) > 0 ) then auto_magnitude_num = 60 else auto_magnitude_num = 1 end
if ( math.floor( absTimeDiff / 7200 ) > 0 ) then auto_magnitude_num = 3600 end
if ( math.floor( absTimeDiff / 172800 ) > 0 ) then auto_magnitude_num = 86400 end
if ( math.floor( absTimeDiff / 5356800 ) > 0 ) then auto_magnitude_num = 2678400 end
if ( math.floor( absTimeDiff / 63115200 ) > 0 ) then auto_magnitude_num = 31557600 end
if min_magnitude then min_magnitude_num = timeText[min_magnitude] else min_magnitude_num = -1 end
end
if not min_magnitude_num then min_magnitude_num = 1 end -- Default to seconds if an invalid magnitude is entered.
local magnitude_num = math.max( min_magnitude_num, auto_magnitude_num )
local result_num = math.floor ( absTimeDiff / magnitude_num )
if ( timeDiff >= 0 ) then -- Past
if result_num == 1 then result_unit = timeUnits[ magnitude_num ][1] else result_unit = timeUnits[ magnitude_num ][2] end
result = result_num .. ' ' .. result_unit .. ' ' .. ago
else -- Future
if result_num == 1 then result_unit = timeUnits[ magnitude_num ][3] else result_unit = timeUnits[ magnitude_num ][4] end
result = result_num .. ' ' .. result_unit .. ' time'
end
return result .. purge
end
-- Table to convert entered text values to numeric values.
timeText = {
['seconds'] = 1,
['minutes'] = 60,
['hours'] = 3600,
['days'] = 86400,
['weeks'] = 604800,
['months'] = 2678400,
['years'] = 31557600
}
-- Table containing tables of possible units to use in output.
timeUnits = {
[1] = { 'second', 'seconds', 'second\'s', 'seconds\'' },
[60] = { 'minute', 'minutes', 'minute\'s', 'minutes\'' },
[3600] = { 'hour', 'hours', 'hour\'s', 'hours\'' },
[86400] = { 'day', 'days', 'day\'s', 'days\'' },
[604800] = { 'week', 'weeks', 'week\'s', 'weeks\'' },
[2678400] = { 'month', 'months', 'month\'s', 'months\'' },
[31557600] = { 'year', 'years', 'year\'s', 'years\'' }
}
return p