Module:Date Stuff

From Stiles Wiki
Revision as of 20:16, 5 July 2021 by Maxwells (talk | contribs)
Jump to navigation Jump to search

Documentation for this module may be created at Module:Date Stuff/doc

local p = {}

--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"}
  end

  --Takes the provided variable and seperates it out into a table
  --Also makrs if it is only a year or a montha nd 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(frame)
  return writeDate(convertShortDate(frame.args[1], frame.args[2]))
end


--Calculates a persons age using the specified calendar
function p.age(frame)
  firstDate = frame.args[1]
  secondDate = frame.args[2]
  status = frame.args[3]
  calendar = frame.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