Module:Date Stuff: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
function p.main(frame) | |||
local orgiArgs = frame:getParent().args | |||
local args = {} | |||
for k, v in pairs(orgiArgs) do | |||
v = v:match('^%s*(.-)%s*$') | |||
if v ~= '' then | |||
args[k] = v | |||
end | |||
end | |||
if args[1] == "date" then | |||
return p.date(args) | |||
elseif args[1] == "age" then | |||
return p.age(args) | |||
end | |||
end | |||
--Splits a string based on specified delimiter | --Splits a string based on specified delimiter | ||
Line 51: | Line 67: | ||
--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.date( | function p.date(args) | ||
return writeDate(convertShortDate( | return writeDate(convertShortDate(args[2], args[3])) | ||
end | end | ||
Revision as of 19:55, 24 May 2022
Documentation for this module may be created at Module:Date Stuff/doc
local p = {}
function p.main(frame)
local orgiArgs = frame:getParent().args
local args = {}
for k, v in pairs(orgiArgs) do
v = v:match('^%s*(.-)%s*$')
if v ~= '' then
args[k] = v
end
end
if args[1] == "date" then
return p.date(args)
elseif args[1] == "age" then
return p.age(args)
end
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(date, 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
date = Split(date, "-")
if date[2] == nil then
date = {nil, nil, date[1], 1, nil}
elseif date[3] == nil then
date = {monthNames[tonumber(date[1])], nil, date[2], nil, 1}
else
date = {monthNames[tonumber(date[1])], date[2], date[3], nil, nil}
end
return date
end
--Writes that date based on what is given.
function writeDate(date)
if date[4] == 1 then
return date[3]
elseif date[5] == 1 then
return date[1].." "..date[3]
else
return date[1].." "..date[2]..", "..date[3]
end
end
--Converts a short from date to a long from date using the specified calendar
function p.date(args)
return writeDate(convertShortDate(args[2], args[3]))
end
--Calculates a persons age using the specified calendar
function p.age(frame)
firstDate = frame:getParent().args[1]
secondDate = frame:getParent().args[2]
status = frame:getParent().args[3]
calendar = frame:getParent().args[4]
--checks if firstDate is not nil, and if it is returns the second date
if firstDate ~= nil then
firstDate = convertShortDate(firstDate, calendar)
secondDate = convertShortDate(secondDate, calendar)
elseif firstDate == nil then
return writeDate(convertShortDate(secondDate))
end
--Checks which math formula to use, based on how much of the date there is.
if firstDate[4] == 1 or secondDate[4] == 1 or firstDate[5] == 1 or secondDate[5] == 1 or firstDate[2] <= secondDate[2] then
age = math.floor(secondDate[3] - firstDate[3])
elseif firstDate[2] >= secondDate[2] then
age = math.floor(secondDate[3] - firstDate[3] - 1)
end
--Determines if age or aged is required
if status == "alive" then
return writeDate(firstDate).." (age "..age..")"
elseif status == "dead" then
return writeDate(secondDate).." (aged "..age..")"
end
end
return p