Module:Sandbox/Ste1la/Dates Explained

-- 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 = local obtain = 0 --> extracting dates --check if is uncertain and if epoca exists -- 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