Module:Date Stuff: Difference between revisions

From Stiles Wiki
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(date, calendar)
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 makrs if it is only a year or a montha nd year
   --Also marks if it is only a year or a month and year
   date = Split(date, "/")
   local shortDate = Split(shortDate, "-")
    
    
   if date[2] == nil then
   if shortDate[2] == nil then
     date = {nil, nil, date[1], 1, nil}
     dateTable = {nil, nil, nil, tonumber(shortDate[1]), "year"}
   elseif date[3] == nil then
   elseif shortDate[3] == nil then
     date = {monthNames[tonumber(date[1])], nil, date[2], nil, 1}
     dateTable = {monthNames[tonumber(shortDate[1])], tonumber(shortDate[1]), nil, tonumber(shortDate[2]), "month-year"}
   else
   else
     date = {monthNames[tonumber(date[1])], date[2], date[3], nil, nil}
     dateTable = {monthNames[tonumber(shortDate[1])], tonumber(shortDate[1]), tonumber(shortDate[2]), tonumber(shortDate[3]), "month-day-year"}
   end
   end
 
   return dateTable
   return date
end
end


--Writes that date based on what is given.
--Writes that date based on what is given.
function writeDate(date)
function writeDate(dateTable)
   if date[4] == 1 then
   if dateTable[5] == "year" then
     return date[3]
     return dateTable[4]
   elseif date[5] == 1 then
   elseif dateTable[5] == "month-year" then
     return date[1].." "..date[3]
     return dateTable[1].." ("..dateTable[2]..") "..dateTable[4]
   else
   elseif dateTable[5] == "month-day-year" then
     return date[1].." "..date[2]..", "..date[3]
     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.date(frame)
function p._date(args)
   return writeDate(convertShortDate(frame.args[1], frame.args[2]))
   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.age(frame)
function p._age(args)
   firstDate = frame.args[1]
   local birthDate = convertShortDate(args[1], args[4])
   secondDate = frame.args[2]
   local secondDate = convertShortDate(args[2], args[4])
  status = frame.args[3]
   local status = 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.
   --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
   if birthDate[5] == "year" or secondDate == "year" then
    age = math.floor(secondDate[3] - firstDate[3])
    age = math.floor(secondDate[4] - birthDate[4])
  elseif firstDate[2] >= secondDate[2] then
  elseif birthDate[5] == "month-year" or secondDate == "month-year" then
    age = math.floor(secondDate[3] - firstDate[3] - 1)
    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
     return writeDate(firstDate).." (age "..age..")"
     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