Editing Module:Age

Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. Read the Privacy Policy to learn what information we collect about you and how we use it.

If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.

Latest revision Your text
Line 1: Line 1:
-- Implement various "age of" and other date-related templates.
-- Implement various "age of" and other date-related templates.
local mtext = {
-- Message and other text that should be localized.
-- Also need to localize text in table names in function dateDifference.
['mt-bad-param1'] =            'Invalid parameter $1',
['mt-bad-param2'] =            'Parameter $1=$2 is invalid',
['mt-bad-show'] =              'Parameter show=$1 is not supported here',
['mt-cannot-add'] =            'Cannot add "$1"',
['mt-conflicting-show'] =      'Parameter show=$1 conflicts with round=$2',
['mt-date-wrong-order'] =      'The second date must be later in time than the first date',
['mt-dd-future'] =              'Death date (first date) must not be in the future',
['mt-dd-wrong-order'] =        'Death date (first date) must be later in time than the birth date (second date)',
['mt-invalid-bd-age'] =        'Invalid birth date for calculating age',
['mt-invalid-dates-age'] =      'Invalid dates for calculating age',
['mt-invalid-end'] =            'Invalid end date in second parameter',
['mt-invalid-start'] =          'Invalid start date in first parameter',
['mt-need-jdn'] =              'Need valid Julian date number',
['mt-need-valid-bd'] =          'Need valid birth date: year, month, day',
['mt-need-valid-bd2'] =        'Need valid birth date (second date): year, month, day',
['mt-need-valid-date'] =        'Need valid date',
['mt-need-valid-dd'] =          'Need valid death date (first date): year, month, day',
['mt-need-valid-ymd'] =        'Need valid year, month, day',
['mt-need-valid-ymd-current'] = 'Need valid year|month|day or "currentdate"',
['mt-need-valid-ymd2'] =        'Second date should be year, month, day',
['mt-template-bad-name'] =      'The specified template name is not valid',
['mt-template-x'] =            'The template invoking this must have "|template=x" where x is the wanted operation',
['txt-and'] =                  ' and ',
['txt-or'] =                    ' or ',
['txt-category'] =              'Category:Age error',
['txt-comma-and'] =            ', and ',
['txt-error'] =                'Error: ',
['txt-format-default'] =        'mf',  -- 'df' (day first = dmy) or 'mf' (month first = mdy)
['txt-module-convertnumeric'] = 'Module:ConvertNumeric',
['txt-module-date'] =          'Module:Date',
['txt-sandbox'] =              'sandbox',
['txt-bda'] = '<span style="display:none"> (<span class="bday">$1</span>) </span>$2<span class="noprint ForceAgeToShow"> (age&nbsp;$3)</span>',
['txt-dda'] = '$2<span style="display:none">($1)</span> (aged&nbsp;$3)',
['txt-bda-disp'] = 'disp_raw',  -- disp_raw → age is a number only; disp_age → age is a number and unit (normally years but months or days if very young)
['txt-dda-disp'] = 'disp_raw',
['txt-dmy'] = '%-d %B %-Y',
['txt-mdy'] = '%B %-d, %-Y',
}
local isWarning = {
['mt-bad-param1'] = true,
}
local translate, from_en, to_en, isZero
if translate then
-- Functions to translate from en to local language and reverse go here.
-- See example at [[:bn:Module:বয়স]].
else
from_en = function (text)
return text
end
isZero = function (text)
return tonumber(text) == 0
end
end


local _Date, _currentDate
local _Date, _currentDate
Line 64: Line 5:
-- Return objects exported from the date module or its sandbox.
-- Return objects exported from the date module or its sandbox.
if not _Date then
if not _Date then
local sandbox = frame:getTitle():find(mtext['txt-sandbox'], 1, true) and ('/' .. mtext['txt-sandbox']) or ''
local sandbox = frame:getTitle():find('sandbox', 1, true) and '/sandbox' or ''
local datemod = require(mtext['txt-module-date'] .. sandbox)
local datemod = require('Module:Date' .. sandbox)
local realDate = datemod._Date
_Date = datemod._Date
_currentDate = datemod._current
_currentDate = datemod._current
if to_en then
_Date = function (...)
local args = {}
for i, v in ipairs({...}) do
args[i] = to_en(v)
end
return realDate(unpack(args))
end
else
_Date = realDate
end
end
end
return _Date, _currentDate
return _Date, _currentDate
Line 116: Line 46:
end
end
return text
return text
end
local function dateFormat(args)
-- Return string for wanted date format.
local default = mtext['txt-format-default']
local other = default == 'df' and 'mf' or 'df'
local wanted = stripToNil(args[other]) and other or default
return wanted == 'df' and mtext['txt-dmy'] or mtext['txt-mdy']
end
local function substituteParameters(text, ...)
-- Return text after substituting any given parameters for $1, $2, etc.
return mw.message.newRawMessage(text, ...):plain()
end
end


Line 138: Line 55:
end
end


local function message(msg, ...)
local function message(msg, id)
-- Return formatted message text for an error or warning.
-- Return formatted message text for an error or warning.
local function getText(msg)
return mtext[msg] or error('Bug: message "' .. tostring(msg) .. '" not defined')
end
local categories = {
local categories = {
error = mtext['txt-category'],
error = '[[Category:Age error]]',
warning = mtext['txt-category'],
warning = '[[Category:Age error]]',  -- same as error until determine whether 'Age warning' would be worthwhile
}
}
local a, b, k, category
local a, b, category
local text = substituteParameters(getText(msg), ...)
if id == 'warning' then
if isWarning[msg] then
a = '<sup>[<i>'
a = '<sup>[<i>'
b = '</i>]</sup>'
b = '</i>]</sup>'
k = 'warning'
else
else
a = '<strong class="error">' .. getText('txt-error')
a = '<strong class="error">Error: '
b = '</strong>'
b = '</strong>'
k = 'error'
end
end
if mw.title.getCurrentTitle():inNamespaces(0) then
if mw.title.getCurrentTitle():inNamespaces(0) then
-- Category only in namespaces: 0=article.
-- Category only in namespaces: 0=article.
category = '[[' .. categories[k] .. ']]'
category = categories[id or 'error']
end
end
return
return
a ..
a ..
mw.text.nowiki(text) ..
mw.text.nowiki(msg) ..
b ..
b ..
(category or '')
(category or '')
Line 195: Line 106:
-- i == 1 for the first number which can optionally start with an uppercase letter.
-- i == 1 for the first number which can optionally start with an uppercase letter.
number = tostring(number)
number = tostring(number)
return require(mtext['txt-module-convertnumeric']).spell_number(
return require('Module:ConvertNumeric').spell_number(
number,
number,
nil,                      -- fraction numerator
nil,                      -- fraction numerator
Line 204: Line 115:
options.ordinal            -- true: 'first' instead of 'one'
options.ordinal            -- true: 'first' instead of 'one'
) or number
) or number
end
local function makeExtra(args, flagCurrent)
-- Return extra text that will be inserted before the visible result
-- but after any sort key.
local extra = args.prefix or ''
if mw.ustring.len(extra) > 1 then
-- Parameter "~" gives "~3" whereas "over" gives "over 3".
if extra:sub(-6, -1) ~= '&nbsp;' then
extra = extra .. ' '
end
end
if flagCurrent then
extra = '<span class="currentage"></span>' .. extra
end
return extra
end
end


Line 226: Line 121:
-- Assume value is a valid number which has not overflowed.
-- Assume value is a valid number which has not overflowed.
if sortable == 'sortable_table' or sortable == 'sortable_on' or sortable == 'sortable_debug' then
if sortable == 'sortable_table' or sortable == 'sortable_on' or sortable == 'sortable_debug' then
local sortKey
local sortkey
if value == 0 then
if value == 0 then
sortKey = '5000000000000000000'
sortkey = '5000000000000000000'
else
else
local mag = math.floor(math.log10(math.abs(value)) + 1e-14)
local mag = math.floor(math.log10(math.abs(value)) + 1e-14)
local prefix
if value > 0 then
if value > 0 then
sortKey = 7000 + mag
prefix = 7000 + mag
else
else
sortKey = 2999 - mag
prefix = 2999 - mag
value = value + 10^(mag+1)
value = value + 10^(mag+1)
end
end
sortKey = string.format('%d', sortKey) .. string.format('%015.0f', math.floor(value * 10^(14-mag)))
sortkey = string.format('%d', prefix) .. string.format('%015.0f', math.floor(value * 10^(14-mag)))
end
end
local result
local lhs, rhs
if sortable == 'sortable_table' then
if sortable == 'sortable_table' then
result = 'data-sort-value="_SORTKEY_"|'
lhs = 'data-sort-value="'
elseif sortable == 'sortable_debug' then
rhs = '"|'
result = '<span data-sort-value="_SORTKEY_♠"><span style="border:1px solid">_SORTKEY_♠</span></span>'
else
else
result = '<span data-sort-value="_SORTKEY_♠"></span>'
lhs = sortable == 'sortable_debug' and
'<span style="border:1px solid;display:inline;" class="sortkey">' or
'<span style="display:none" class="sortkey">'
rhs = '♠</span>'
end
end
return (result:gsub('_SORTKEY_', sortKey))
return lhs .. sortkey .. rhs
end
end
end
end
Line 293: Line 191:
hm = { 'H', 'M', id = 'hm' },
hm = { 'H', 'M', id = 'hm' },
hms = { 'H', 'M', 'S', id = 'hms' },
hms = { 'H', 'M', 'S', id = 'hms' },
M = { 'M', id = 'M' },
s = { 'S', id = 's' },
d = { 'd', id = 'd' },
d = { 'd', id = 'd' },
dh = { 'd', 'H', id = 'dh' },
dh = { 'd', 'H', id = 'dh' },
Line 343: Line 239:
return 'error'
return 'error'
end
end
return message('mt-need-valid-date')
return message('Need valid date')
end
end
local add = stripToNil(args.add)
local add = stripToNil(args.add)
Line 350: Line 246:
date = date + item
date = date + item
if not date then
if not date then
return message('mt-cannot-add', item)
return message('Cannot add "' .. item .. '"')
end
end
end
end
end
end
local sortKey, result
local prefix, result
local sortable = translateParameters.sortable[args.sortable]
local sortable = translateParameters.sortable[args.sortable]
if sortable then
if sortable then
local value = (date.partial and date.partial.first or date).jdz
local value = (date.partial and date.partial.first or date).jdz
sortKey = makeSort(value, sortable)
prefix = makeSort(value, sortable)
end
end
if show ~= 'hide' then
if show ~= 'hide' then
result = date[show]
result = date[show]
if result == nil then
if result == nil then
result = from_en(date:text(show))
result = date:text(show)
elseif type(result) == 'boolean' then
elseif type(result) == 'boolean' then
result = result and '1' or '0'
result = result and '1' or '0'
else
else
result = from_en(tostring(result))
result = tostring(result)
end
end
end
end
return (sortKey or '') .. makeExtra(args) .. (result or '')
return (prefix or '') .. (result or '')
end
end


local function rangeJoin(range)
local function rangeJoin(range)
-- Return text to be used between a range of ages.
-- Return text to be used between a range of ages.
return range == 'dash' and '–' or mtext['txt-or']
return range == 'dash' and '–' or '&nbsp;or '
end
end


Line 407: Line 303:
local name = names[components[i]]
local name = names[components[i]]
if name then
if name then
if type(name) == 'table' then
local plural = names.plural
name = mw.getContentLanguage():plural(islist and v[2] or v, name)
if not plural or (islist and v[2] or v) == 1 then
plural = ''
end
end
text:add(vstr .. sep .. name)
text:add(vstr .. sep .. name .. plural)
else
else
text:add(vstr)
text:add(vstr)
Line 425: Line 322:
elseif options.join == 'sep_serialcomma' and text.n > 2 then
elseif options.join == 'sep_serialcomma' and text.n > 2 then
first = ', '
first = ', '
last = mtext['txt-comma-and']
last = ', and '
else
else
first = ', '
first = ', '
last = mtext['txt-and']
last = ' and '
end
end
for i, v in ipairs(text) do
for i, v in ipairs(text) do
Line 447: Line 344:
end
end
return
return
(options.sortKey or '') ..
(options.prefix or '') ..
(options.extra or '') ..
(options.extra or '') ..
sign ..
sign ..
Line 458: Line 355:
-- which have been validated.
-- which have been validated.
local names = {
local names = {
-- Each name is:
-- * a string if no plural form of the name is used; or
-- * a table of strings, one of which is selected using the rules at
--  https://translatewiki.net/wiki/Plural/Mediawiki_plural_rules
abbr_off = {
abbr_off = {
plural = 's',
sep = '&nbsp;',
sep = '&nbsp;',
y = {'year', 'years'},
y = 'year',
m = {'month', 'months'},
m = 'month',
w = {'week', 'weeks'},
w = 'week',
d = {'day', 'days'},
d = 'day',
H = {'hour', 'hours'},
H = 'hour',
M = {'minute', 'minutes'},
M = 'minute',
S = {'second', 'seconds'},
S = 'second',
},
},
abbr_on = {
abbr_on = {
Line 482: Line 376:
},
},
abbr_infant = {      -- for {{age for infant}}
abbr_infant = {      -- for {{age for infant}}
plural = 's',
sep = '&nbsp;',
sep = '&nbsp;',
y = {'yr', 'yrs'},
y = 'yr',
m = {'mo', 'mos'},
m = 'mo',
w = {'wk', 'wks'},
w = 'wk',
d = {'day', 'days'},
d = 'day',
H = {'hr', 'hrs'},
H = 'hr',
M = {'min', 'mins'},
M = 'min',
S = {'sec', 'secs'},
S = 'sec',
},
},
abbr_raw = {},
abbr_raw = {},
Line 529: Line 424:
range = parms.range and true or nil,
range = parms.range and true or nil,
}
}
local sortKey
local prefix
if parms.sortable then
if parms.sortable then
local value = diff.age_days + (parms.wantDuration and 1 or 0)  -- days and fraction of a day
local value = diff.age_days + (parms.wantDuration and 1 or 0)  -- days and fraction of a day
Line 535: Line 430:
value = -value
value = -value
end
end
sortKey = makeSort(value, parms.sortable)
prefix = makeSort(value, parms.sortable)
end
end
local textOptions = {
local textOptions = {
prefix = prefix,
suffix = parms.suffix,  -- not currently used
extra = parms.extra,
extra = parms.extra,
format = parms.format,
format = parms.format,
Line 543: Line 440:
isnegative = diff.isnegative,
isnegative = diff.isnegative,
range = parms.range,
range = parms.range,
sortKey = sortKey,
spell = parms.spell,
spell = parms.spell,
suffix = parms.suffix,  -- not currently used
}
}
if show.id == 'hide' then
if show.id == 'hide' then
return sortKey or ''
return prefix or ''
end
end
local values = { diff:age(show.id, diffOptions) }
local values = { diff:age(show.id, diffOptions) }
Line 564: Line 459:
}
}
return
return
(textOptions.sortKey or '') ..
(textOptions.prefix or '') ..
makeText({ diff.partial.mindiff:age(show.id, diffOptions) }, show, names[abbr], opt) ..
makeText({ diff.partial.mindiff:age(show.id, diffOptions) }, show, names[abbr], opt) ..
rangeJoin(textOptions.range) ..
rangeJoin(textOptions.range) ..
Line 570: Line 465:
(textOptions.suffix or '')
(textOptions.suffix or '')
end
end
return message('mt-bad-show', show.id)
return message('Parameter show=' .. show.id .. ' is not supported here')
end
end


Line 591: Line 486:
-- Don't bother detecting if wantMixture is used because not needed and it is a poor option.
-- Don't bother detecting if wantMixture is used because not needed and it is a poor option.
if not text then
if not text then
if getopt.noMissing then
return nil  -- this gives a nil date which gives an error
end
text = 'currentdate'
text = 'currentdate'
if getopt.flag == 'usesCurrent' then
if getopt.flag == 'usesCurrent' then
Line 625: Line 517:
end
end
if getopt.omitZero and i % 3 ~= 1 then  -- omit zero months and days as unknown values but keep year 0 which is 1 BCE
if getopt.omitZero and i % 3 ~= 1 then  -- omit zero months and days as unknown values but keep year 0 which is 1 BCE
if isZero(fields[i]) then
if tonumber(fields[i]) == 0 then
fields[i] = nil
fields[i] = nil
getopt.partial = true
getopt.partial = true
Line 632: Line 524:
end
end
local fix = getopt.fix and 'fix' or ''
local fix = getopt.fix and 'fix' or ''
local noDefault = imax == 0 and getopt.noMissing
local partialText = getopt.partial and 'partial' or ''
local partialText = getopt.partial and 'partial' or ''
local dates = {}
local dates = {}
Line 644: Line 537:
for i = 1, nrDates do
for i = 1, nrDates do
local index = i == 1 and 1 or 4
local index = i == 1 and 1 or 4
local y, m, d = fields[index], fields[index+1], fields[index+2]
dates[i] = Date(fields[index], fields[index+1], fields[index+2])
if (m == 2 or m == '2') and (d == 29 or d == '29') then
-- Workaround error with following which attempt to use invalid date 2001-02-29.
-- {{age_ymwd|year1=2001|year2=2004|month2=2|day2=29}}
-- {{age_ymwd|year1=2001|month1=2|year2=2004|month2=1|day2=29}}
-- TODO Get rid of wantMixture because even this ugly code does not handle
-- 'Feb' or 'February' or 'feb' or 'february'.
if not ((y % 4 == 0 and y % 100 ~= 0) or y % 400 == 0) then
d = 28
end
end
dates[i] = Date(y, m, d)
end
end
else
else
Line 668: Line 550:
if (getopt.partial and y and (m or not d)) or (y and m and d) then
if (getopt.partial and y and (m or not d)) or (y and m and d) then
dates[i] = Date(fix, partialText, y, m, d)
dates[i] = Date(fix, partialText, y, m, d)
elseif not y and not m and not d then
elseif not y and not m and not d and not noDefault then
dates[i] = Date(flagCurrent())
dates[i] = Date(flagCurrent())
end
end
end
end
end
end
else
elseif not noDefault then
getopt.textdates = true  -- have parsed each date from a single text field
getopt.textdates = true  -- have parsed each date from a single text field
dates[1] = Date(fix, partialText, flagCurrent(fields[1]))
dates[1] = Date(fix, partialText, flagCurrent(fields[1]))
Line 681: Line 563:
end
end
if not dates[1] then
if not dates[1] then
return message(getopt.missing1 or 'mt-need-valid-ymd')
return message('Need valid year, month, day')
end
end
if getopt.single then
if getopt.single then
Line 687: Line 569:
end
end
if not dates[2] then
if not dates[2] then
return message(getopt.missing2 or 'mt-need-valid-ymd2')
return message('Second date should be year, month, day')
end
end
return dates[1], dates[2]
return dates[1], dates[2]
Line 698: Line 580:
local name = frame.args.template
local name = frame.args.template
if not name then
if not name then
return message('mt-template-x')
return message('The template invoking this must have "|template=x" where x is the wanted operation')
end
end
local args = frame:getParent().args
local args = frame:getParent().args
Line 795: Line 677:
local spec = specs[name]
local spec = specs[name]
if not spec then
if not spec then
return message('mt-template-bad-name')
return message('The specified template name is not valid')
end
end
if name == 'age_days' then
if name == 'age_days' then
Line 851: Line 733:
abbr = spec.abbr,
abbr = spec.abbr,
disp = spec.disp,
disp = spec.disp,
extra = makeExtra(args, getopt.usesCurrent and format ~= 'format_raw'),
extra = (getopt.usesCurrent and format ~= 'format_raw') and '<span class="currentage"></span>' or nil,
format = format or spec.format,
format = format or spec.format,
round = yes(args.round),
round = yes(args.round),
Line 859: Line 741:
}
}
if (spec.negative or frame.args.negative) == 'error' and parms.diff.isnegative then
if (spec.negative or frame.args.negative) == 'error' and parms.diff.isnegative then
return message('mt-date-wrong-order')
return message('The second date should not be before the first date')
end
end
return from_en(dateDifference(parms))
return dateDifference(parms)
end
end


Line 867: Line 749:
-- Implement [[Template:Birth date and age]].
-- Implement [[Template:Birth date and age]].
local args = frame:getParent().args
local args = frame:getParent().args
local options = {
local options = { noMissing=true, single=true }
missing1 = 'mt-need-valid-bd',
noMissing = true,
single = true,
}
local date = getDates(frame, options)
local date = getDates(frame, options)
if type(date) == 'string' then
if type(date) == 'string' then
Line 879: Line 757:
local diff = Date('currentdate') - date
local diff = Date('currentdate') - date
if diff.isnegative or diff.years > 150 then
if diff.isnegative or diff.years > 150 then
return message('mt-invalid-bd-age')
return message('Invalid birth date for calculating age')
end
end
local disp = mtext['txt-bda-disp']
local disp, show = 'disp_raw', 'y'
local show = 'y'
if diff.years < 2 then
if diff.years < 2 then
disp = 'disp_age'
disp = 'disp_age'
Line 891: Line 768:
end
end
end
end
local result = substituteParameters(
local df = stripToNil(args.df)  -- day first (dmy); default is month first (mdy)
mtext['txt-bda'],
local result = df and
date:text('%-Y-%m-%d'),
'%-d %B %-Y' or
from_en(date:text(dateFormat(args))),
'%B %-d, %-Y'
from_en(dateDifference({
result = '(<span class="bday">%-Y-%m-%d</span>) </span>' .. result
result = '<span style="display:none"> ' ..
date:text(result) ..
'<span class="noprint ForceAgeToShow"> ' ..
'(age&nbsp;' ..
dateDifference({
diff = diff,
diff = diff,
show = show,
show = show,
Line 901: Line 783:
disp = disp,
disp = disp,
sep = 'sep_space',
sep = 'sep_space',
}))
}) ..
)
')</span>'
local warnings = tonumber(frame.args.warnings)
local warnings = tonumber(frame.args.warnings)
if warnings and warnings > 0 then
if warnings and warnings > 0 then
Line 931: Line 813:
end
end
if invalid then
if invalid then
result = result .. message('mt-bad-param1', invalid)
result = result .. message('invalid parameter ' .. invalid, 'warning')
end
end
return result
end
 
local function dda(frame)
-- Implement [[Template:Death date and age]].
local args = frame:getParent().args
local options = {
missing1 = 'mt-need-valid-dd',
missing2 = 'mt-need-valid-bd2',
noMissing = true,
partial = true,
}
local date1, date2 = getDates(frame, options)
if type(date1) == 'string' then
return date1
end
local diff = date1 - date2
if diff.isnegative then
return message('mt-dd-wrong-order')
end
local Date = getExports(frame)
local today = Date('currentdate') + 1  -- one day in future allows for timezones
if date1 > today then
return message('mt-dd-future')
end
local years
if diff.partial then
years = diff.partial.years
years = type(years) == 'table' and years[2] or years
else
years = diff.years
end
if years > 150 then
return message('mt-invalid-dates-age')
end
local fmt_date, fmt_ymd
if date1.day then  -- y, m, d known
fmt_date = dateFormat(args)
fmt_ymd = '%-Y-%m-%d'
elseif date1.month then  -- y, m known; d unknown
fmt_date = '%B %-Y'
fmt_ymd = '%-Y-%m-00'
else  -- y known; m, d unknown
fmt_date = '%-Y'
fmt_ymd = '%-Y-00-00'
end
local result = substituteParameters(
mtext['txt-dda'],
date1:text(fmt_ymd),
from_en(date1:text(fmt_date)),
from_en(dateDifference({
diff = diff,
show = 'y',
abbr = 'abbr_off',
disp = mtext['txt-dda-disp'],
range = 'dash',
sep = 'sep_space',
}))
)
local warnings = tonumber(frame.args.warnings)
if warnings and warnings > 0 then
local good = {
df = true,
mf = true,
}
local invalid
local imax = options.textdates and 2 or 6
for k, _ in pairs(args) do
if type(k) == 'number' then
if k > imax then
invalid = tostring(k)
break
end
else
if not good[k] then
invalid = k
break
end
end
end
if invalid then
result = result .. message('mt-bad-param1', invalid)
end
end
end
end
Line 1,041: Line 839:
local date = Date('juliandate', args[1], args[2])
local date = Date('juliandate', args[1], args[2])
if date then
if date then
return from_en(date:text())
return date:text()
end
end
return message('mt-need-jdn')
return message('Need valid Julian date number')
end
end


Line 1,056: Line 854:
return tostring(date.jd)
return tostring(date.jd)
end
end
return message('mt-need-valid-ymd-current')
return message('Need valid year/month/day or "currentdate"')
end
end


Line 1,067: Line 865:
local args = frame:getParent().args
local args = frame:getParent().args
local parms = {
local parms = {
extra = makeExtra(args),
wantDuration = yes(args.duration),
wantDuration = yes(args.duration),
range = yes(args.range) or (args.range == 'dash' and 'dash' or nil),
range = yes(args.range) or (args.range == 'dash' and 'dash' or nil),
Line 1,075: Line 872:
local date1 = Date(fix, 'partial', stripToNil(args[1]) or 'currentdatetime')
local date1 = Date(fix, 'partial', stripToNil(args[1]) or 'currentdatetime')
if not date1 then
if not date1 then
return message('mt-invalid-start')
return message('Invalid start date in first parameter')
end
end
local date2 = Date(fix, 'partial', stripToNil(args[2]) or 'currentdatetime')
local date2 = Date(fix, 'partial', stripToNil(args[2]) or 'currentdatetime')
if not date2 then
if not date2 then
return message('mt-invalid-end')
return message('Invalid end date in second parameter')
end
end
parms.diff = date2 - date1
parms.diff = date2 - date1
Line 1,087: Line 884:
parm = translate[parm]
parm = translate[parm]
if parm == nil then  -- test for nil because false is a valid setting
if parm == nil then  -- test for nil because false is a valid setting
return message('mt-bad-param2', argname, args[argname])
return message('Parameter ' .. argname .. '=' .. args[argname] .. ' is invalid')
end
end
parms[argname] = parm
parms[argname] = parm
Line 1,098: Line 895:
if show then
if show then
if show.id ~= round then
if show.id ~= round then
return message('mt-conflicting-show', args.show, args.round)
return message('Parameter show=' .. args.show .. ' conflicts with round=' .. args.round)
end
end
else
else
Line 1,106: Line 903:
parms.round = true
parms.round = true
end
end
return from_en(dateDifference(parms))
return dateDifference(parms)
end
end


Line 1,112: Line 909:
age_generic = ageGeneric,          -- can emulate several age templates
age_generic = ageGeneric,          -- can emulate several age templates
birth_date_and_age = bda,          -- Template:Birth_date_and_age
birth_date_and_age = bda,          -- Template:Birth_date_and_age
death_date_and_age = dda,          -- Template:Death_date_and_age
gsd = dateToGsd,                    -- Template:Gregorian_serial_date
gsd = dateToGsd,                    -- Template:Gregorian_serial_date
extract = dateExtract,              -- Template:Extract
extract = dateExtract,              -- Template:Extract
Please note that all contributions to Nonbinary Wiki are considered to be released under the Creative Commons Attribution-ShareAlike (see Nonbinary Wiki:Copyrights for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. Do not submit copyrighted work without permission!
Cancel Editing help (opens in new window)

Template used on this page: