Jump to content

Module:Sandbox/Cyborg Coder/Dates

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Cyborg Coder (talk | contribs) at 03:30, 6 December 2018. The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
--Cyborg Coder Google Code-in, Lua Task 7 - Date formatting
local p = {}

local function leapd(y)
	if y % 1000 == 0 then return 29 end
	if y % 100 == 0 then return 28 end
	if y% 4 == 0 then return 29 end
	return 28
end

months = { "jan", "feb", "mar", "apr", "may", "jun",
	"jul", "aug", "sep", "oct", "nov", "dec" }
local days_in_month = { 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
days_in_month[0] = 0
local month_idx = {}
for i, v in ipairs(months) do
	month_idx[v] = i
end

local function day_try(d, m, y)
	days_in_month[2] = leapd(y)
	if d < 1 or d > days_in_month[m] then
		return "Invalid"
	end
	return "Valid"
end

function p.date(frame)
	local date = frame.args.text or mw.text.trim(frame.args[1] or "")
	date = " " .. date
	local dformat = frame.args.format or default
	if date == "" then date = "No date" end
	--local d, y = date:match("(%d+)%D+(%d+)")
	local d = date:match("%D(%d%d)%D")
	local y = date:match("(%d%d%d+)")
	local mnth = date:match("%a+") or ""
	mnth = string.upper(string.sub(mnth, 1, 1)) .. string.sub(mnth, 2)
	if not months[string.lower(string.sub(mnth, 1, 3))] ~= nil then mnth = date:match("%u%a+") or "" end
	d, y = tonumber(d) or 1, tonumber(y) or 0
	local m = month_idx[mnth:sub(1,3):lower()] or tonumber(date:match("%D0(%d)")) or 0
	local v = day_try(d, m, y)
	local out = date .. " = " .. d .. " " .. m .. " " .. y .. " " .. mnth
	out = out .. " = " .. v
	if v == "Invalid" then return out .. " -> Invalid Entry" end
	out = out .. " -> ".. d .. " " .. mnth .. " " .. y
	return out .. "<br>"
end

return p