Module:Current events calendar

Revision as of 06:33, 27 May 2017 by Vivaporius (talk | contribs) (1 revision imported)

This module generates calendars for Portal:Current events and Category:Current events archives. The current day and the previous six days are linked to the corresponding section of the page. The module also supports archival calendars when month and year parameters are passed. Note that the Current Month version will only link the previous six days and will include a

Usage on Portal:Current events

{{#invoke:current events calendar|main}}

Usage on Category:Current events archives pages

{{#invoke:current events calendar|main|year=[four digit numerical year]|month=[One or two digit number from 1 to 12]}}

Example: Current Events front page version

This version assumes that it is displayed in a page that will set padding/margins/gutters in parent containing elements. It will expand to a maximum of 350px wide and remain centered in the column. It includes a link to the full month's page in the footer. Only the six most recent days of the month will have hyperlinks, reflecting the 6 most recent days of content on the Portal:Current events page.

<<May 2024>>
SMTWTFS
1234
567891011
12131415161718
19202122232425
262728293031
   More May 2024 events...

Example: Current Events archive version

This version assumes that it is displayed in a page that uses a table-based layout and expect individual children to set their margins and padding. It will expand to a maximum of 350px wide and puts an 8px margin on the top and left side of the calendar. It has no footer. All days will have links to the appropriate section of the page it is displayed in.

<<May 2024>>
SMTWTFS
1234
567891011
12131415161718
19202122232425
262728293031
   More May 2024 events...

Sandbox version

Script error: No such module "current events calendar/sandbox".



-- This module renders the calendar seen on [[Portal:Current events]].

local p = {}

local function makeWikilink(link, display)
	if display then
		return string.format('[[%s|%s]]', link, display)
	else
		return string.format('[[%s]]', link)
	end
end

function p.main()
	local dateStuff = p.getDateStuff()
	local dayStrings = p.makeDayStrings(dateStuff)
	return p.export(dayStrings, dateStuff)
end

function p.getDateStuff()
	-- Gets date data.
	local dateStuff = {}
	local lang = mw.language.getContentLanguage()
	--Year
	local year = lang:formatDate('Y')
	year = tonumber(year)
	dateStuff.year = year
	-- Month
	local month = lang:formatDate('F')
	dateStuff.month = month
	-- Month and year
	local monthAndYear = lang:formatDate('F Y')
	local firstOfMonth = lang:formatDate('01-m-Y')
	dateStuff.monthAndYear = monthAndYear
	-- Previous month and year
	dateStuff.previousMonthAndYear = lang:formatDate('F Y', firstOfMonth .. ' -1 month')
	-- Next month and year
	dateStuff.nextMonthAndYear = lang:formatDate('F Y', firstOfMonth .. ' +1 month')
	-- Day
	local day = lang:formatDate('j')
	day = tonumber(day)
	dateStuff.day = day
	-- Days in month
	local daysInMonth = lang:formatDate('j', firstOfMonth .. ' +1 month -1 day')
	daysInMonth = tonumber(daysInMonth)
	dateStuff.daysInMonth = daysInMonth
	-- Weekday of the first day of the month
	local firstWeekday = lang:formatDate('w', firstOfMonth) -- Sunday = 0, Saturday = 6
	firstWeekday = tonumber(firstWeekday)
	firstWeekday = firstWeekday + 1 -- Make compatible with Lua tables. Sunday = 1, Saturday = 7.
	dateStuff.firstWeekday = firstWeekday
	return dateStuff
end

function p.makeDayStrings(dateStuff)
	local calStrings = {}
	local currentDay = dateStuff.day
	local isLinkworthy = p.isLinkworthy
	local currentMonth = dateStuff.month
	local currentYear = dateStuff.year
	local makeDayLink = p.makeDayLink
	for day = 1, dateStuff.daysInMonth do
		if isLinkworthy(day, currentDay) then
			calStrings[#calStrings + 1] = makeDayLink(day, currentMonth, currentYear)
		else
			calStrings[#calStrings + 1] = tostring(day)
		end
	end
	return calStrings
end

function p.isLinkworthy(day, currentDay)
	-- Returns true if the calendar day should be linked, and false if not.
	-- Days should be linked if they are the current day or if they are within the six
	-- preceding days, as that is the number of items on the current events page.
	if currentDay - 6 <= day and day <= currentDay then
		return true
	else
		return false
	end
end

function p.makeDayLink(day, month, year)
	return string.format("'''[[#%d %s %d|%d]]'''", year, month, day, day)
end

function p.export(dayStrings, dateStuff)
	-- Generates the calendar HTML.
	local monthAndYear = dateStuff.monthAndYear
	local root = mw.html.create('table')
	root
		:addClass('infobox')
		:css{width = '250px', ['text-align'] = 'center', ['background-color'] = '#f5faff', border = '1px solid #cedff2'}
		
		-- Headings
		:tag('tr')
			:css('background-color', '#cedff2')
			:tag('td')
				:css{['padding-top'] = '1px', ['padding-bottom'] = '3px'}
				:wikitext(makeWikilink('Portal:Current events/' .. dateStuff.previousMonthAndYear, '<<'))
				:done()
			:tag('td')
				:attr('colspan', '5')
				:css{padding = '1px 4px', ['font-weight'] = 'bold'}
				:wikitext(makeWikilink('Portal:Current events/' .. monthAndYear, monthAndYear))
				:done()
			:tag('td')
				:css{['padding-top'] = '1px', ['padding-bottom'] = '3px'}
				:wikitext(makeWikilink('Portal:Current events/' .. dateStuff.nextMonthAndYear, '>>'))

	-- Day of week headings
	local dayHeadingRow = root:tag('tr')
	local weekdays = {'S', 'M', 'T', 'W', 'T', 'F', 'S'}
	for i, weekday in ipairs(weekdays) do
		dayHeadingRow:tag('td')
			:wikitext(weekday)
	end
	
	-- Days
	local colspan = dateStuff.firstWeekday - 1
	local cellCount = 0 -- Tracks the number of day cells.
	local firstDayRow = root:tag('tr')
	if colspan > 1 then
		firstDayRow:tag('td')
			:attr('colspan', tostring(colspan))
	elseif colspan == 1 then
		firstDayRow:tag('td')
	end
	for i = colspan + 1, 7 do -- Finish the first row
		cellCount = cellCount + 1
		firstDayRow:tag('td')
			:wikitext(dayStrings[cellCount])
	end
	while cellCount < #dayStrings do -- Second day row onwards
		local otherDayRow = root:tag('tr')
		for i = 1, 7 do
			cellCount = cellCount + 1
			local dayString = dayStrings[cellCount]
			if not dayString then
				break
			end
			otherDayRow:tag('td')
				:wikitext(dayString)
		end
	end

	-- Footer
	root:tag('tr')
		:tag('td')
			:attr('colspan', '7')
			:css{['padding-top'] = '3px', ['padding-bottom'] = '5px', ['font-size'] = '78%', ['text-align'] = 'left'}
			:wikitext('&nbsp;&nbsp; ' .. makeWikilink('Portal:Current events/' .. monthAndYear, 'More ' .. monthAndYear .. ' events...'))
	
	return tostring(root)
end

return p