Module:Sandbox/Safan41/Dates

Revision as of 05:45, 18 November 2018 by imported>Safan41
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Documentation for this module may be created at Module:Sandbox/Safan41/Dates/doc

local p = {} -- p stands for package

function p.dateformat( frame )
  local date, format = frame.args.date or "", frame.args.format -- Arguments
  local mnthlst = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}
  
  function dateextract(date) -- find date pattern, use os.time() to retrieve
    month, day, year = 1, 1, 1
    haha = true
    if string.match(date, "on the (%d+)%a?%a? of (%a+) in the year of our Lord (%d+)") then
    	day, month, year =  string.match(date, "on the (%d+)%a?%a? of (%a+) in the year of our Lord (%d+)")
    elseif string.match(date, "(%a+) (%d+)%a?%a?, (%d+)") then
      month, day, year = string.match(date, "(%a+) (%d+)%a?%a?, (%d+)")
    elseif string.match(date, "(%d+)%a?%a? (%a+) (%d+)") then
      day, month, year = string.match(date, "(%d+)%a?%a? (%a+) (%d+)")
    elseif string.match(date, "(%d+)%a?%a? (%a+) (%d+) BC") or string.match(date, "(%d+)%a?%a? (%a+) (%d+) BCE") or string.match(date, "(%d+)%a?%a? (%a+) (%d+) AD") or string.match(date, "(%d+)%a?%a? (%a+) (%d+) CE") then
      day, month, year = string.match(date, "(%d+)%a?%a? (%a+) (%d+)")
    elseif string.match(date, "(%d+)%a?%a? (%a+) (%d+)") then
      day, month, year = string.match(date, "(%d+)%a?%a? (%a+) (%d+)")
    elseif string.match(date, "(%d+)-(%d+)-(%d+)") then
      year, month, day = string.match(date, "(%d+)-(%d+)-(%d+)")
    elseif string.match(date, "(%d+)/(%d+)/(%d+)") then
      day, month, year = string.match(date, "(%d+)/(%d+)/(%d+)")
    elseif string.match(date, "(%a+) (%d+)") then
      month, year = string.match(date, "(%a+) (%d+)")
    elseif string.match(date, "(%d+)%a?%a? (%d+)") then
      day, year = string.match(date, "(%d+)%a?%a? (%d+)")
    elseif string.match(date, "(%d+) BC") or string.match(date, "(%d+) BCE") or string.match(date, "(%d+) AD") or string.match(date, "(%d+) CE") then
      year = string.match(date, "(%d+)")
    elseif string.match(date, "(%d+)%a?%a? (%a+)") then
      year, month  = string.match(date, "(%d+)%a?%a? (%a+)")
      haha = false
    elseif string.match(date, "(%d+)") then
      year = string.match(date, "(%d+)")
    else
      for mo in mnthlst do
        if string.match(date, "(".. mo ..")") then month = string.match(date, "(".. mo ..")") end
      end
      year = string.match(date, "(%4d)")
      day = string.match(date, "(%2d)") or string.match(date, "(%2d)th")
    end
    if type(month) == "string" then 
      for k,v in ipairs(mnthlst) do 
        if string.upper(v) == string.upper(month) or string.upper(string.sub(v, 1, 3)) == string.sub(string.upper(month), 1, 3) then 
        	month = k
        	haha = true
        	do break end
        end
      end
    end
    if not haha then
		return os.time{year=year, month=1, day=day}, haha
	else
		return os.time{year=year, month=month, day=day}, haha
	end
  end
  a, b, c = pcall(dateextract, date)
  if a == false then 
  	return "Invalid entry" 
  end
  yeet = b --date information
  
  if format then -- if there is a format, find format date using os.date() as specified
    if format == "mdy" then
      text = os.date("%B %d, %Y", yeet)
    elseif format == "dmy" then
      text = os.date("%d %B %Y", yeet)
    elseif format == "iso" then
      text = os.date("%Y-%m-%d", yeet)
    elseif format == "year" then
      text = os.date("%Y", yeet)
    elseif format == "monthandyear" then
      text = os.date("%B %Y", yeet)
  else -- no format, go off of pattern
    if string.match(date, "(%a+) (%d+)%a?%a?, (%d+)") then
      text = os.date("%B %d, %Y", yeet)
    
    elseif string.match(date, "(%d+)%a?%a? (%a+) (%d+) AD") then
      text = os.date("%d %B %Y", yeet) .. " AD"
    elseif string.match(date, "(%d+)%a?%a? (%a+) (%d+) BCE") then
      text = os.date("%d %B %Y", yeet) .. " BCE"
    elseif string.match(date, "(%d+)%a?%a? (%a+) (%d+) CE") then
      text = os.date("%d %B %Y", yeet) .. " CE"
    elseif string.match(date, "(%d+)%a?%a? (%a+) (%d+) BC") then 
      text = os.date("%d %B %Y", yeet) .. " BC"
      
    elseif string.match(date, "(%d+) AD") then
      text = os.date("%Y", yeet) .. " AD"
    elseif string.match(date, "(%d+) BCE") then
      text = os.date("%Y", yeet) .. " BCE"
    elseif string.match(date, "(%d+) CE") then
      text = os.date("%Y", yeet) .. " CE"
    elseif string.match(date, "(%d+) BC") then 
      text = os.date("%Y", yeet) .. " BC"
    
    elseif string.match(date, "(%d+)%a?%a? (%a+) (%d+)") or string.match(date, "on the (%d+)%a?%a? of (%a+) in the year of our Lord (%d+)") then
      text = os.date("%d %B %Y", yeet)
    elseif string.match(date, "(%d+)-(%d+)-(%d+)") or string.match(date, "(%d+)/(%d+)/(%d+)") then
      text = os.date("%Y-%m-%d", yeet)
    elseif string.match(date, "(%d+) (%d+)") then
        text = os.date("%Y", yeet)
    elseif string.match(date, "(%d+)%a?%a? (%a+)") then
        if not c then
        	text = os.date("%Y", yeet)
        else
        	text = os.date("%Y %B", yeet)
        end
    elseif string.match(date, "(%a+) (%d+)") then
      if not pcall(os.date("%B %Y", yeet)) then
        text = string.match(date, "(%d+)")
      else
        text = os.date("%B %Y", yeet)
      end
    elseif string.match(date, "(%d+)") then
      if not pcall(os.date("%Y", yeet)) then --If os.date() can't validate any numbers, return the numbers only
        text = string.match(date, "(%d+)")
      else
        text = os.date("%Y", yeet)
      end
    end
	end
end
	if string.match(date, "^sometime around ") or string.match(date, " %(uncertain%)$") then
		text = "circa " .. text
	end
	text = text:gsub('^0', ''):gsub(' 0', ' ')
    return text
end

return p