Module:Sandbox/Ste1la/Dates

-- Ste1la Google Code-in, Date formatting

local p = {}

p.formatDate = function(frame) local date = frame.args.date or "" local format = frame.args.format or "" local circa local epoca = nil local out = "" local monthList = {"jan", "january", "feb", "february", "feb", "mar", "march", "apr", "april", "may", "jun", "june", "jul", "july", "aug", "august", "sep", "september", "oct", "october", "nov", "november", "dec", "december"} local obtain = 0 --> extracting dates --check if is uncertain and if epoca exists -- = date:find("uncertain")	if circa == nil then		circa = date:find("sometime")	end	if circa == nil then		circa = date:find("around")	end	if circa ~= nil then		out = out .. "circa "	end if date:find("uncertain") or date:find("sometime") or date:find("around") then out = out .. "circa " end epoca = date:find("AD") if epoca ~= nil then epoca = "AD" elseif epoca == nil then epoca = date:find("BCE") if epoca ~= nil then epoca = "BCE" elseif epoca == nil then epoca = date:find("BC") if epoca ~= nil then epoca = "BC" elseif epoca == nil then epoca = date:find("CE") if epoca ~= nil then epoca = "CE" end end end end --dmy local day, month, year = date:match("(%d+) (%w+) (%d+)") if day ~= nil and month ~= nil and year ~= nil then obtain = 1 inputFormat = "dmy" end --mdy if obtain == 0 then month, day, year = date:match("(%w+) (%d+), (%d+)")

if day ~= nil and month ~= nil and year ~= nil then obtain = 1 inputFormat = "mdy" end end --three number cases if obtain == 0 then day, month, year = date:match("(%d+)/(%d+)/(%d+)") if day ~= nil and month ~= nil and year ~= nil then obtain = 1 inputFormat = "iso" end end if obtain == 0 then day, month, year = date:match("(%d+)-(%d+)-(%d+)") if day ~= nil and month ~= nil and year ~= nil then obtain = 1 inputFormat = "iso" end end -- not any above, gets two numbers and checks for month if obtain == 0 then local i, j = date:find("%d+") if i ~= nil then year = date:sub(i, j) or 0 inputFormat = "year" if i ~= nil then i, j = date:find("%d+", j + 1) if i ~= nil then day = date:sub(i, j) or 0 inputFormat = "day" end end end for i = 1, 23 do			local temp = date:lower if temp:match(monthList[i]) ~= nil then month = temp:match(monthList[i]) if inputFormat == "year" then inputFormat = "month and year" elseif inputFormat == "day" then inputFormat = "all" end end i = i + 1 end if month == nil then month = "" end if day == nil then day = 0 end if year == nil then year = 0 end end

if (day == "" or day == 0) and (year == "" or year == 0) then return "Invalid entry" end if inputFormat == "day" then inputFormat = "year" end --converts month to number if tonumber(month) == nil then monthChange = 1 month = month:lower if month:match("jan") then month = 1 elseif month:match("feb") then month = 2 elseif month:match("mar") then month = 3 elseif month:match("apr") then month = 4 elseif month:match("may") then month = 5 elseif month:match("jun") then month = 6 elseif month:match("jul") then month = 7 elseif month:match("aug") then month = 8 elseif month:match("sep") then month = 9 elseif month:match("oct") then month = 10 elseif month:match("nov") then month = 11 elseif month:match("dec") then month = 12 else month = 0 end end -->switches variables -- sets year day = tonumber(day) month = tonumber(month) if day > 31 then local temp = year year = day day = temp elseif month > 31 then local temp = year year = month month = temp end

if month > 12 then local temp = day day = month month = temp end

--checks leap year if month == 2 and day > 29 then return "Invalid entry" end if month == 2 and day == 29 then local leap = year % 4 if leap ~= 0 then return "Invalid entry" end end --OUTPUTS DATAAAAAAAAAAA!!! -->reformat data if necessary if format ~= "" then inputFormat = "" end if format == "dmy" or format == "mdy" or format == "month and year" or 		inputFormat == "dmy" or inputFormat == "mdy" or inputFormat == "month and year" or		inputFormat == "all" then if month == 1 then month = "January" elseif month == 2 then month = "February" elseif month == 3 then month = "March" elseif month == 4 then month = "April" elseif month == 5 then month = "May" elseif month == 6 then month = "June" elseif month == 7 then month = "July" elseif month == 8 then month = "August" elseif month == 9 then month = "September" elseif month == 10 then month = "October" elseif month == 11 then month = "November" elseif month == 12 then month = "December" end end if day == 0 then day = "" end if month == 0 then month = "" end if year == 0 then year = "" end

if format == "dmy" then if day < 31 and year < 31 and month == "" then return "Invalid entry" end out = out .. day .. " " .. month .. " " .. year elseif format == "mdy" then out = out .. month .. " " .. day .. ", " .. year elseif format == "iso" then if month < 10 then month = "0" .. month end out = out .. year .. "-" .. month .. "-" .. day elseif format == "year" then out = out .. year elseif format == "month and year" then out = out .. month .. " " .. year elseif inputFormat == "dmy" then if tonumber(day) < 31 and tonumber(year) < 31 and month == "" then return "Invalid entry" end out = out .. day .. " " .. month .. " " .. year elseif inputFormat == "mdy" then out = out .. month .. " " .. day .. ", " .. year elseif inputFormat == "iso" then if month < 10 then month = "0" .. month end out = out .. year .. "-" .. month .. "-" .. day elseif inputFormat == "year" then out = out .. year elseif inputFormat == "month and year" then out = out .. year .. " " .. month else if day ~= "" or day ~= nil then out = out .. day .. " "		end if month ~= "" or month ~= nil then out = out .. month .. " "		end if year ~= "" or year ~= nil then out = out .. year end end if epoca ~= nil then out = out .. " " .. epoca end return out .. " " end

return p