Module:Sandbox/Kid116/Dates

local p = {} function p.Dates (frame) input = mw.text.trim(frame.args[1]) input = " " .. input .. " "	xformat = frame.args.format or 0 xsuffix = frame.args.suffix or 0 hasDate = 0 hasMonth = 0 hasYear = 0 year = 0 month = 0 xdate = 0 specialSuffix = 0 ly = 0 valid = 1 txt = "" a = 0 b = 0 p.yr if hasYear~=0 then if input:find ("%d%d%p%d%d%p%d%d%d%d") or input:find ("%d%d%d%d%p%d%d%p%d%d") then p.isoType else p.Monthss p.Date end else p.Monthss if hasMonth~=0 then p.Date else if input:find ("%s%d%d%s") then if input:find ("AD") or input:find ("BC") or input:find ("CE") or input:find ("BCE") then year = tonumber(string.sub(input, input:find ("%s%d%d%s")+1, input:find ("%s%d%d%s")+2)) a = 1 end else valid = 0 end end end if hasYear then p.leapYear end p.validation if a == 1 then valid = 1 end

if valid ~= 0 then if xsuffix == 0 then if input:find ("AD") or input:find ("BC") or input:find ("CE") or input:find ("BCE") then if year ~= 0 then if input:find ("AD") then xsuffix = "AD" end if input:find ("BC") then xsuffix = "BE" end if input:find ("CE") then xsuffix = "CE" end if input:find ("BCE") then xsuffix = "BCE" end end end end if xsuffix ~= 0 then p.suffixes else if xformat == 0 then xformat = "dmy" if input:find (",") then xformat = "mdy" end if input:find ("-") or input:find ("/") then xformat = "iso" end end if xdate == 0 and month == 0 and year ~= 0 then xformat = "year" end if xdate ~= 0 and month == 0 and year ~= 0 then xformat = "year" end p.formats end if specialSuffix then p.sSuffixes end else txt = "Invalid entry. " end return txt .. " " end function p.yr if input:find ("%s%d%d%d%s") then hasYear = 1 year = string.sub(input, input:find ("%s%d%d%d%s") + 1, input:find ("%s%d%d%d%s") + 3) end if input:find ("%s%d%d%d%d%s") then hasYear = 1 year = string.sub(input, input:find ("%s%d%d%d%d%s") + 1, input:find ("%s%d%d%d%d%s") + 4) end if input:find ("%p%d%d%d%d%s") then hasYear = 1 year = string.sub(input, input:find ("%p%d%d%d%d%s") + 1, input:find ("%p%d%d%d%d%s") + 4) end if input:find ("%s%d%d%d%d%p") then hasYear = 1 year = string.sub(input, input:find ("%s%d%d%d%d%p") + 1, input:find ("%s%d%d%d%d%p") + 4) end year = tonumber(year) end function p.sSuffix if input:find ("uncertain") or input:find ("sometime") or input:find ("around") then if input:find ("uncertain who") then specialSuffix = 2 else specialSuffix = 1 end end if input:find ("lord") and input:find ("year") then specialSuffix = 3 end end function p.isoType if input:find ("%d%d%p%d%d%p%d%d%d%d") then temp1 = tonumber(string.sub(input, input:find ("%d%d%p%d%d%p%d%d%d%d"), input:find ("%d%d%p%d%d%p%d%d%d%d") + 1)) temp2 = tonumber(string.sub(input, input:find ("%d%d%p%d%d%p%d%d%d%d") + 3, input:find ("%d%d%p%d%d%p%d%d%d%d") + 4)) end if input:find ("%d%d%d%d%p%d%d%p%d%d") then temp1 = tonumber(string.sub(input, input:find ("%d%d%d%d%p%d%d%p%d%d") + 5, input:find ("%d%d%d%d%p%d%d%p%d%d") + 6)) temp2 = tonumber(string.sub(input, input:find ("%d%d%d%d%p%d%d%p%d%d") + 8, input:find ("%d%d%d%d%p%d%d%p%d%d") + 9)) end if temp1 12 then month = temp1 xdate = temp2 end if temp1 > 12 and temp2 < 13 then month = temp2 xdate = temp1 end if temp1 > 31 and temp2 > 31 then valid = 0 end if temp1 < 13 and temp2 < 13 then month = temp2 xdate = temp1 end end function p.Monthss Months = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }	for i = 1, 12 do		if input:find (Months[i]) then month = i			hasMonth = 1 end end end function p.Date if input:find ("%s%d%a%a%s") or input:find ("%s%d%d%a%a%s") then if input:find ("%s%d%a%a%s") then xdate = tonumber(string.sub(input, input:find ("%s%d%a%a%s") + 1, input:find ("%s%d%a%a%s") + 1)) end if input:find ("%s%d%d%a%a%s") then xdate = tonumber(string.sub(input, input:find ("%s%d%d%a%a%s") + 1, input:find ("%s%d%d%a%a%s") + 2)) end else if input:find ("%s%d%d%s") or input:find ("%s%d%d%p") then if input:find ("%s%d%d%s") and input:find ("%s%d%d%p") then if input:find ("%s%d%d%s") < input:find ("%s%d%d%p") then xdate = tonumber(string.sub(input, input:find ("%s%d%d%s") + 1, input:find ("%s%d%d%s") + 2)) else xdate = tonumber(string.sub(input, input:find ("%s%d%d%p") + 1, input:find ("%s%d%d%p") + 2)) end else if input:find ("%s%d%d%s") then xdate = tonumber(string.sub(input, input:find ("%s%d%d%s") + 1, input:find ("%s%d%d%s") + 2)) else xdate = tonumber(string.sub(input, input:find ("%s%d%d%p") + 1, input:find ("%s%d%d%p") + 2)) end end if xdate > 31 then valid = 0 end if xdate then hasDate = 1 end end end end function p.leapYear if year % 100 ~= 0 and year % 4 == 0 then ly = 1 else if year % 400 == 0 then ly = 1 end end end function p.validation if hasYear == 0 and hasMonth == 0 then valid = 0 end if month > 12 then valid = 0 end if month == 4 then if xdate > 30 then valid = 0 end end if month == 6 then if xdate > 30 then valid = 0 end end if month == 9 then if xdate > 30 then valid = 0 end end if month == 11 then if xdate > 30 then valid = 0 end end if month == 2 then if ly == 1 then if xdate > 29 then valid = 0 end else if xdate > 28 then valid = 0 end end end if xdate then hasDate = 1 else hasDate = 0 end end function p.formats Months = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" }	if xformat == "dmy" then if hasDate ~= 0 then txt = txt .. xdate .. " " 			end if hasMonth ~= 0 then txt = txt .. Months[month] .. " "			end if hasYear ~= 0 then txt = txt .. year end end if xformat == "mdy" then if month ~= 0 then txt = txt .. Months[month] .. " "		end if xdate ~= 0 then txt = txt .. xdate end if year ~= 0 then txt = txt .. ", " .. year end end if xformat == "iso" then txt = txt .. year if month < 10 then month = "0" .. month txt = txt .. "-" .. month else txt = txt .. "-" .. month end if xdate < 10 then xdate = "0" .. xdate txt = txt .. "-" .. xdate else txt = txt .. "-" .. xdate end end if xformat == "year" then if hasYear then txt = txt .. year .. " "		else txt = "More information required. " end end end function p.suffixes if xsuffix == "AD" then txt = year .. " AD " end if xsuffix == "BC" then txt = "BC " .. year .. " "	end if xsuffix == "CE" then txt = year .. " CE " end if xsuffix == "BCE" then txt = year .. " BCE " end if specialSuffix == 1 then txt = "c. " .. txt end end function p.sSuffixes if specialSuffix == 2 then txt = txt .. " (uncertain who was present)" end if specialSuffix == 3 then txt = "" .. year .. " AD" end end return p