Module:Date Stuff: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary Tag: Manual revert |
||
(54 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
function p.date(frame) | |||
local orgiArgs = frame.args | |||
local args = {} | |||
for k, v in pairs(orgiArgs) do | |||
v = v:match('^%s*(.-)%s*$') | |||
if v ~= '' then | |||
args[k] = v | |||
end | |||
end | |||
return p._date(args) | |||
end | |||
function p.age(frame) | |||
local orgiArgs = frame.args | |||
local args = {} | |||
if orgiArgs[1] == "{{{1}}}" or orgiArgs[2] == "{{{2}}}" or orgiArgs[4] == "{{{3}}}" then | |||
return error("Missing a parameter") | |||
end | |||
for k, v in pairs(orgiArgs) do | |||
v = v:match('^%s*(.-)%s*$') | |||
if v ~= '' then | |||
args[k] = v | |||
end | |||
end | |||
return p._age(args) | |||
end | |||
--Splits a string based on specified delimiter | --Splits a string based on specified delimiter | ||
Line 11: | Line 38: | ||
--Takes a short form date and converts it to a long form, and marks if it is only a year, or a month and year | --Takes a short form date and converts it to a long form, and marks if it is only a year, or a month and year | ||
function convertShortDate( | function convertShortDate(shortDate, calendar) | ||
--In place of a long if elseif, I've put all the months into a single variable, with each in its numerical place. | --In place of a long if elseif, I've put all the months into a single variable, with each in its numerical place. | ||
--This also allows us to add other calendars here | --This also allows us to add other calendars here | ||
if calendar == "Solandria" then | if calendar == "Solandria" then | ||
monthNames = {"Miry", "Ozdary", "Rydust", "Iptust", "Tosey", "Iverly", "Eohe", "Kasgust", "Andust", "Bepry", "Nindust", "Tymust", "Ekage", "Aphly", "Asust", "Syranust"} | monthNames = {"Miry", "Ozdary", "Rydust", "Iptust", "Tosey", "Iverly", "Eohe", "Kasgust", "Andust", "Bepry", "Nindust", "Tymust", "Ekage", "Aphly", "Asust", "Syranust"} | ||
elseif calendar == "Eberron" then | |||
monthNames = {"Zarantyr", "Olarune", "Therendor", "Eyre", "Dravago", "Nymm", "Lharvion", "Barrakas", "Rhann", "Sypheros", "Aryth", "Vult"} | |||
elseif calendar == "Forgotten Realms" then | |||
monthNames = {"Hammer", "Alturiak", "Ches", "Tarsakh", "Mirtul", "Kythorn", "Flamerule", "Eleasis", "Eleint", "Marpenoth", "Uktar", "Nightal"} | |||
elseif calendar == "IRL" then | |||
monthNames = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} | |||
end | end | ||
--Takes the provided variable and seperates it out into a table | --Takes the provided variable and seperates it out into a table | ||
--Also | --Also marks if it is only a year or a month and year | ||
local shortDate = Split(shortDate, "-") | |||
if | if shortDate[2] == nil then | ||
dateTable = {nil, nil, nil, tonumber(shortDate[1]), "year"} | |||
elseif | elseif shortDate[3] == nil then | ||
dateTable = {monthNames[tonumber(shortDate[1])], tonumber(shortDate[1]), nil, tonumber(shortDate[2]), "month-year"} | |||
else | else | ||
dateTable = {monthNames[tonumber(shortDate[1])], tonumber(shortDate[1]), tonumber(shortDate[2]), tonumber(shortDate[3]), "month-day-year"} | |||
end | end | ||
return dateTable | |||
return | |||
end | end | ||
--Writes that date based on what is given. | --Writes that date based on what is given. | ||
function writeDate( | function writeDate(dateTable) | ||
if | if dateTable[5] == "year" then | ||
return | return dateTable[4] | ||
elseif | elseif dateTable[5] == "month-year" then | ||
return | return dateTable[1].." ("..dateTable[2]..") "..dateTable[4] | ||
elseif dateTable[5] == "month-day-year" then | |||
return | return dateTable[1].." ("..dateTable[2]..") "..dateTable[3]..", "..dateTable[4] | ||
end | end | ||
end | end | ||
--Converts a short from date to a long from date using the specified calendar | --Converts a short from date to a long from date using the specified calendar | ||
function p. | function p._date(args) | ||
return writeDate(convertShortDate( | return writeDate(convertShortDate(args[1], args[2])) | ||
end | end | ||
--Calculates a persons age using the specified calendar | --Calculates a persons age using the specified calendar | ||
function p. | function p._age(args) | ||
local birthDate = convertShortDate(args[1], args[4]) | |||
secondDate = | local secondDate = convertShortDate(args[2], args[4]) | ||
local status = args[3] | |||
--Checks which math formula to use, based on how much of the date there is. | --Checks which math formula to use, based on how much of the date there is. | ||
if | if birthDate[5] == "year" or secondDate == "year" then | ||
age = math.floor(secondDate[4] - birthDate[4]) | |||
elseif birthDate[5] == "month-year" or secondDate == "month-year" then | |||
if birthDate[2] <= secondDate[2] then | |||
age = math.floor(secondDate[4] - birthDate[4]) | |||
elseif birthDate[2] > secondDate[2] then | |||
age = math.floor(secondDate[4] - birthDate[4] - 1) | |||
end | |||
elseif birthDate[5] == "month-day-year" or secondDate == "month-day-year" then | |||
if birthDate[2] < secondDate[2] then | |||
age = math.floor(secondDate[4] - birthDate[4]) | |||
elseif birthDate[2] == secondDate[2] then | |||
if birthDate[3] <= secondDate[3] then | |||
age = math.floor(secondDate[4] - birthDate[4]) | |||
elseif birthDate[3] > secondDate[3] then | |||
age = math.floor(secondDate[4] - birthDate[4] - 1) | |||
end | |||
elseif birthDate[2] > secondDate[2] then | |||
age = math.floor(secondDate[4] - birthDate[4] - 1) | |||
end | |||
end | end | ||
--Determines if age or aged is required | --Determines if age or aged is required | ||
if status == "alive" then | if status == "alive" then | ||
local longDate = writeDate(birthDate) | |||
return longDate.." (age "..age..")" | |||
elseif status == "dead" then | elseif status == "dead" then | ||
return writeDate(secondDate).." (aged "..age..")" | return writeDate(secondDate).." (aged "..age..")" |
Latest revision as of 20:04, 31 May 2022
Documentation for this module may be created at Module:Date Stuff/doc
local p = {}
function p.date(frame)
local orgiArgs = frame.args
local args = {}
for k, v in pairs(orgiArgs) do
v = v:match('^%s*(.-)%s*$')
if v ~= '' then
args[k] = v
end
end
return p._date(args)
end
function p.age(frame)
local orgiArgs = frame.args
local args = {}
if orgiArgs[1] == "{{{1}}}" or orgiArgs[2] == "{{{2}}}" or orgiArgs[4] == "{{{3}}}" then
return error("Missing a parameter")
end
for k, v in pairs(orgiArgs) do
v = v:match('^%s*(.-)%s*$')
if v ~= '' then
args[k] = v
end
end
return p._age(args)
end
--Splits a string based on specified delimiter
function Split(s, delimiter)
result = {};
for match in (s..delimiter):gmatch("(.-)"..delimiter) do
table.insert(result, match);
end
return result;
end
--Takes a short form date and converts it to a long form, and marks if it is only a year, or a month and year
function convertShortDate(shortDate, calendar)
--In place of a long if elseif, I've put all the months into a single variable, with each in its numerical place.
--This also allows us to add other calendars here
if calendar == "Solandria" then
monthNames = {"Miry", "Ozdary", "Rydust", "Iptust", "Tosey", "Iverly", "Eohe", "Kasgust", "Andust", "Bepry", "Nindust", "Tymust", "Ekage", "Aphly", "Asust", "Syranust"}
elseif calendar == "Eberron" then
monthNames = {"Zarantyr", "Olarune", "Therendor", "Eyre", "Dravago", "Nymm", "Lharvion", "Barrakas", "Rhann", "Sypheros", "Aryth", "Vult"}
elseif calendar == "Forgotten Realms" then
monthNames = {"Hammer", "Alturiak", "Ches", "Tarsakh", "Mirtul", "Kythorn", "Flamerule", "Eleasis", "Eleint", "Marpenoth", "Uktar", "Nightal"}
elseif calendar == "IRL" then
monthNames = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}
end
--Takes the provided variable and seperates it out into a table
--Also marks if it is only a year or a month and year
local shortDate = Split(shortDate, "-")
if shortDate[2] == nil then
dateTable = {nil, nil, nil, tonumber(shortDate[1]), "year"}
elseif shortDate[3] == nil then
dateTable = {monthNames[tonumber(shortDate[1])], tonumber(shortDate[1]), nil, tonumber(shortDate[2]), "month-year"}
else
dateTable = {monthNames[tonumber(shortDate[1])], tonumber(shortDate[1]), tonumber(shortDate[2]), tonumber(shortDate[3]), "month-day-year"}
end
return dateTable
end
--Writes that date based on what is given.
function writeDate(dateTable)
if dateTable[5] == "year" then
return dateTable[4]
elseif dateTable[5] == "month-year" then
return dateTable[1].." ("..dateTable[2]..") "..dateTable[4]
elseif dateTable[5] == "month-day-year" then
return dateTable[1].." ("..dateTable[2]..") "..dateTable[3]..", "..dateTable[4]
end
end
--Converts a short from date to a long from date using the specified calendar
function p._date(args)
return writeDate(convertShortDate(args[1], args[2]))
end
--Calculates a persons age using the specified calendar
function p._age(args)
local birthDate = convertShortDate(args[1], args[4])
local secondDate = convertShortDate(args[2], args[4])
local status = args[3]
--Checks which math formula to use, based on how much of the date there is.
if birthDate[5] == "year" or secondDate == "year" then
age = math.floor(secondDate[4] - birthDate[4])
elseif birthDate[5] == "month-year" or secondDate == "month-year" then
if birthDate[2] <= secondDate[2] then
age = math.floor(secondDate[4] - birthDate[4])
elseif birthDate[2] > secondDate[2] then
age = math.floor(secondDate[4] - birthDate[4] - 1)
end
elseif birthDate[5] == "month-day-year" or secondDate == "month-day-year" then
if birthDate[2] < secondDate[2] then
age = math.floor(secondDate[4] - birthDate[4])
elseif birthDate[2] == secondDate[2] then
if birthDate[3] <= secondDate[3] then
age = math.floor(secondDate[4] - birthDate[4])
elseif birthDate[3] > secondDate[3] then
age = math.floor(secondDate[4] - birthDate[4] - 1)
end
elseif birthDate[2] > secondDate[2] then
age = math.floor(secondDate[4] - birthDate[4] - 1)
end
end
--Determines if age or aged is required
if status == "alive" then
local longDate = writeDate(birthDate)
return longDate.." (age "..age..")"
elseif status == "dead" then
return writeDate(secondDate).." (aged "..age..")"
end
end
return p