Sətir 1: |
Sətir 1: |
− | -- Replacement for [[Template:Time ago]] | + | -- Implement [[Template:Time ago]] |
− | local numberSpell = require('Module:NumberSpell')._main | + | |
− | local yesno = require('Module:Yesno')
| + | local numberSpell, yesno -- lazy load |
| + | |
| + | function numberSpell(arg) |
| + | numberSpell = require('Module:NumberSpell')._main |
| + | return numberSpell(arg) |
| + | end |
| + | |
| + | function yesno(arg) |
| + | yesno = require('Module:Yesno') |
| + | return yesno(arg) |
| + | end |
| | | |
| local p = {} | | local p = {} |
| | | |
| -- Table to convert entered text values to numeric values. | | -- Table to convert entered text values to numeric values. |
− | timeText = { | + | local timeText = { |
| ['saniyə'] = 1, | | ['saniyə'] = 1, |
| ['dəqiqə'] = 60, | | ['dəqiqə'] = 60, |
Sətir 12: |
Sətir 22: |
| ['gün'] = 86400, | | ['gün'] = 86400, |
| ['həftə'] = 604800, | | ['həftə'] = 604800, |
− | ['ay'] = 2678400, | + | ['ay'] = 2629800, -- 365.25 * 24 * 60 * 60 / 12 |
| ['il'] = 31557600 | | ['il'] = 31557600 |
| } | | } |
| | | |
| -- Table containing tables of possible units to use in output. | | -- Table containing tables of possible units to use in output. |
− | timeUnits = { | + | local timeUnits = { |
| [1] = { 'saniyə', 'saniyə', "second's", "seconds'" }, | | [1] = { 'saniyə', 'saniyə', "second's", "seconds'" }, |
| [60] = { 'dəqiqə', 'dəqiqə', "minutes'", "minutes'" }, | | [60] = { 'dəqiqə', 'dəqiqə', "minutes'", "minutes'" }, |
| [3600] = { 'saat', 'saat', "hour's", "hours'" }, | | [3600] = { 'saat', 'saat', "hour's", "hours'" }, |
| [86400] = { 'gün', 'gün', "day's", "days'" }, | | [86400] = { 'gün', 'gün', "day's", "days'" }, |
− | [604800] = { 'həftə', 'həftə', "week's", "weeks'" }, | + | [604800] = { 'həftə', 'həftə', "week's", "weeks'", unit = 'w' }, |
− | [2678400] = { 'ay', 'ay', "month's", "months'" }, | + | [2629800] = { 'ay', 'ay', "month's", "months'", unit = 'm' }, |
− | [31557600] = { 'il', 'il', "year's", "years'" } | + | [31557600] = { 'il', 'il', "year's", "years'", unit = 'y' } |
| } | | } |
| | | |
Sətir 32: |
Sətir 42: |
| local auto_magnitude_num | | local auto_magnitude_num |
| local min_magnitude_num | | local min_magnitude_num |
− | 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 |
| local purge = args.purge | | local purge = args.purge |
− | local spell_out = args.spellout
| + | |
− | local spell_out_max = args.spelloutmax
| |
− |
| |
| -- Add a purge link if something (usually "yes") is entered into the purge parameter | | -- Add a purge link if something (usually "yes") is entered into the purge parameter |
| if purge then | | if purge then |
Sətir 48: |
Sətir 54: |
| | | |
| -- Check that the entered timestamp is valid. If it isn't, then give an error message. | | -- 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], true ) | + | local success, inputTime = pcall( lang.formatDate, lang, 'xnU', args[1] ) |
− | if not noError then | + | if not success then |
| return '<strong class="error">Error: first parameter cannot be parsed as a date or time.</strong>' | | return '<strong class="error">Error: first parameter cannot be parsed as a date or time.</strong>' |
| end | | end |
| | | |
| -- Store the difference between the current time and the inputted time, as well as its absolute value. | | -- Store the difference between the current time and the inputted time, as well as its absolute value. |
− | local timeDiff = lang:formatDate( 'U', nil, true ) - inputTime | + | local timeDiff = lang:formatDate( 'xnU' ) - inputTime |
| local absTimeDiff = math.abs( timeDiff ) | | local absTimeDiff = math.abs( timeDiff ) |
| | | |
Sətir 63: |
Sətir 69: |
| -- Calculate the appropriate unit of time if it was not specified as an argument. | | -- Calculate the appropriate unit of time if it was not specified as an argument. |
| local autoMagnitudeData = { | | local autoMagnitudeData = { |
− | { denom = 63115200, amn = 31557600 }, | + | { factor = 2, amn = 31557600 }, |
− | { denom = 5356800, amn = 2678400 }, | + | { factor = 2, amn = 2629800 }, |
− | { denom = 172800, amn = 86400 }, | + | { factor = 2, amn = 86400 }, |
− | { denom = 7200, amn = 3600 }, | + | { factor = 2, amn = 3600 }, |
− | { denom = 120, amn = 60 } | + | { factor = 2, amn = 60 } |
| } | | } |
− | for i, t in ipairs( autoMagnitudeData ) do | + | for _, t in ipairs( autoMagnitudeData ) do |
− | if absTimeDiff / t.denom >= 1 then | + | if absTimeDiff / t.amn >= t.factor then |
| auto_magnitude_num = t.amn | | auto_magnitude_num = t.amn |
− | break | + | |
| end | | end |
| end | | end |
Sətir 88: |
Sətir 94: |
| end | | end |
| | | |
| + | local result_num |
| 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 unit = timeUnits[magnitude_num].unit |
| + | if unit and absTimeDiff >= 864000 then |
| + | local Date = require('Module:Date')._Date |
| + | local input = lang:formatDate('Y-m-d H:i:s', args[1]) -- Date needs a clean date |
| + | input = Date(input) |
| + | if input then |
| + | local id |
| + | if input.hour == 0 and input.minute == 0 then |
| + | id = 'currentdate' |
| + | else |
| + | id = 'currentdatetime' |
| + | end |
| + | result_num = (Date(id) - input):age(unit) |
| + | end |
| + | end |
| + | result_num = result_num or math.floor ( absTimeDiff / magnitude_num ) |
| | | |
| local punctuation_key, suffix | | local punctuation_key, suffix |
Sətir 120: |
Sətir 142: |
| end | | end |
| end | | end |
− | result_unit = timeUnits[ magnitude_num ][ punctuation_key ] | + | local result_unit = timeUnits[ magnitude_num ][ punctuation_key ] |
| | | |
| -- Convert numerals to words if appropriate. | | -- Convert numerals to words if appropriate. |
− | spell_out_max = tonumber( spell_out_max ) -- Would cause script errors if not a number. | + | local spell_out = args.spellout |
| + | local spell_out_max = tonumber(args.spelloutmax) |
| local result_num_text | | local result_num_text |
− | if ( spell_out == 'auto' and 1 <= result_num and result_num <= 9 and result_num <= ( spell_out_max or 9 ) ) | + | if spell_out and ( |
− | or ( yesno( spell_out ) and 1 <= result_num and result_num <= 100 and result_num <= ( spell_out_max or 100 ) ) | + | ( spell_out == 'auto' and 1 <= result_num and result_num <= 9 and result_num <= ( spell_out_max or 9 ) ) or |
| + | ( yesno( spell_out ) and 1 <= result_num and result_num <= 100 and result_num <= ( spell_out_max or 100 ) ) |
| + | ) |
| then | | then |
| result_num_text = numberSpell( result_num ) | | result_num_text = numberSpell( result_num ) |
Sətir 133: |
Sətir 158: |
| end | | end |
| | | |
− | result = result_num_text .. ' ' .. result_unit .. suffix -- Spaces for suffix have been added in earlier. | + | local result = result_num_text .. ' ' .. result_unit .. suffix -- Spaces for suffix have been added in earlier. |
| return result .. purge | | return result .. purge |
| end | | end |