Module:Calendar2

From The Wiki Camp 2
Jump to navigation Jump to search

Documentation for this module may be created at Module:Calendar2/doc

local mArguments = require('Module:Arguments')
local p = {}

function p.yearStartsOn(year) -- implements wikifunctions Z20291
	-- returns what weekday a year starts on. Sunday is 0
	local day = tonumber(year) - 1
    local result = (year + math.floor(day / 4) - math.floor(day / 100) + math.floor(day / 400)) % 7
	return result
end

local function Fuckup(frame) -- Takes an input frame from an invoke or a template.
	args = mArguments.getArgs(frame)
	args["year"] = args["year"] or os.date("*t")["year"]
	local y = args["year"] --make sure there's a year
	
	args["leap"] = 0 --offset one to the later months if it's a leap year
	if (y % 4 == 0) and not ((y % 100 == 0) and (y % 400 ~= 0)) then args["leap"] = 1 end -- Z20182
	return args
end



local function Month(length, offset, frame) -- Takes an input frame passed through Fuckup
	
	local f, j = {}, 1	-- frame haunted
	for k, v in pairs(frame) do f[k] = v end 
	local i = ((p.yearStartsOn(f["year"]) + offset) % 7) --Sunday aligned at 0
	local w = math.ceil((i + length) / 7) --week count
	
	n = [[{| border=1 style="width: 100%; text-align: center; border: 3px outset #514747;" 
!style="background-color:salmon;"|SUNDAY
!style="background-color:khaki;"|MONDAY
!style="background-color:lightpink;"|TUESDAY 
!style="background-color:yellowgreen;"|WEDNESDAY
!style="background-color:coral;"|THURSDAY
!style="background-color:turquoise;"|FRIDAY
!style="background-color:plum;"|SATURDAY
|+ ''']] .. f["month"] .."'''\n|-\n" .. string.rep("|style=\"width: 14%\"|\n<br/>\n", i)

	for i = i + 1, i + length do
		n = n .. "\n|"
		if i <= 7 then n = n .. "style=\"width: 14%\"|" end
		n = n .. j .. "\n" .. (f[j] or "<br />")
		if i % 7 == 0 then
			n = n .. "\n|-\n"
		end
		j = j + 1
	end
	
	for i = j + i, w*7 do
		n = n .. "\n|" .. (f[j] or "")
		j = j + 1
	end
	n = n .. "\n|}" --ww
	return n
	--return m
end

--[[function for each month. user-facing element.
	Use: {{Calendar page|month=<month>|year=<year>|<day 1>|<day 2>|...|<day n>|<day n+1>}}
	Month (function, capitalised) is required. Year defaults to current.
	Days are optional and can go above the maximum. 
	]]--
function p.January(frame)
	frame = Fuckup(frame)
	local length = 31
	local offset = 0
	m = Month(length, offset, frame)
	return m
end 
function p.February(frame)
	frame = Fuckup(frame)
	local length = 28 + frame["leap"]
	local offset = 31
	m = Month(length, offset, frame)
	return m
end
function p.March(frame)
	frame = Fuckup(frame)
	local length = 31
	local offset = 31 + (28 + frame["leap"])
	m = Month(length, offset, frame)
	return m
end
function p.April(frame)
	frame = Fuckup(frame)
	local length = 30
	local offset = 62 + (28 + frame["leap"])
	m = Month(length, offset, frame)
	return m
end
function p.May(frame)
	frame = Fuckup(frame)
	local length = 31
	local offset = 92 + (28 + frame["leap"])
	m = Month(length, offset, frame)
	return m
end
function p.June(frame)
	frame = Fuckup(frame)
	local length = 30
	local offset = 123 + (28 + frame["leap"])
	m = Month(length, offset, frame)
	return m
end
function p.July(frame)
	frame = Fuckup(frame)
	local length = 31
	local offset = 153 + (28 + frame["leap"])
	m = Month(length, offset, frame)
	return m
end
function p.August(frame)
	frame = Fuckup(frame)
	local length = 31
	local offset = 184 + (28 + frame["leap"])
	m = Month(length, offset, frame)
	return m
end
function p.September(frame)
	frame = Fuckup(frame)
	local length = 30
	local offset = 215 + (28 + frame["leap"])
	m = Month(length, offset, frame)
	return m
end
function p.October(frame)
	frame = Fuckup(frame)
	local length = 31
	local offset = 245 + (28 + frame["leap"])
	m = Month(length, offset, frame)
	return m
end
function p.November(frame)
	frame = Fuckup(frame)
	local length = 30
	local offset = 276 + (28 + frame["leap"])
	m = Month(length, offset, frame)
	return m
end
function p.December(frame)
	frame = Fuckup(frame)
	local length = 31
	local offset = 306 + (28 + frame["leap"])
	m = Month(length, offset, frame)
	return m
end
function p.NewMonth(frame) -- arbitrary month length and time in the year
	frame = Fuckup(frame)
	frame["month"] = frame["name"] or frame["month"]
	local length = frame["length"] or 10
	local offset = frame["offset"] or 164
	m = Month(length, offset, frame)
	return m
end


return p