Jump to content

Module:Current events calendar: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
Margin override of CSS override from Minerva.css
Updated code will accept month and year parameters to generate historical calendars
Line 1: Line 1:
-- This module renders the calendar seen on [[Portal:Current events]].
-- This module renders the calendar seen on [[Portal:Current events]].

--[[
Incoming expected variables:
frame.args.year = Integer value for year
frame.args.month = Integer value for month, 1 based.
--]]


local p = {}
local p = {}
Line 11: Line 17:
end
end


function p.main()
function p.main(frame)
local dateStuff = p.getDateStuff()
local argsDate = nil
if (frame and frame.args and frame.args.year and frame.args.month) then
-- If a date is passed in, assume that the display page is an Archive page.
-- If no date passed in, assume that the display page is the current Current Events page
argsDate = frame.args.year .. "-" .. frame.args.month .. "-01" -- Construct a date, YYY-M-DD format.
end
local dateStuff = p.getDateStuff(argsDate)
local dayStrings = p.makeDayStrings(dateStuff)
local dayStrings = p.makeDayStrings(dateStuff)
return p.export(dayStrings, dateStuff)
return p.export(dayStrings, dateStuff)
end
end


function p.getDateStuff()
function p.getDateStuff(argsDate)

--[[
Note: This function takes advantage of the formatDate's second argument to
create data for the archival calendars. If the second arg (argsDate) is nil,
then formatDate assumes the current date/time.
--]]

-- Gets date data.
-- Gets date data.
local dateStuff = {}
local dateStuff = {}
local lang = mw.language.getContentLanguage()
local lang = mw.language.getContentLanguage()
dateStuff.argsDate = argsDate
--Year
--Year
local year = lang:formatDate('Y')
local year = lang:formatDate('Y', argsDate)
year = tonumber(year)
year = tonumber(year)
dateStuff.year = year
dateStuff.year = year
-- Month
-- Month
local month = lang:formatDate('F')
local month = lang:formatDate('F', argsDate)
dateStuff.month = month
dateStuff.month = month
-- Month and year
-- Month and year
local monthAndYear = lang:formatDate('F Y')
local monthAndYear = lang:formatDate('F Y', argsDate)
local firstOfMonth = lang:formatDate('01-m-Y')
local firstOfMonth = lang:formatDate('01-m-Y', argsDate)
dateStuff.monthAndYear = monthAndYear
dateStuff.monthAndYear = monthAndYear
-- Previous month and year
-- Previous month and year
Line 37: Line 57:
dateStuff.nextMonthAndYear = lang:formatDate('F Y', firstOfMonth .. ' +1 month')
dateStuff.nextMonthAndYear = lang:formatDate('F Y', firstOfMonth .. ' +1 month')
-- Day
-- Day
local day = lang:formatDate('j')
local day = lang:formatDate('j', argsDate)
day = tonumber(day)
day = tonumber(day)
dateStuff.day = day
dateStuff.day = day
Line 60: Line 80:
local makeDayLink = p.makeDayLink
local makeDayLink = p.makeDayLink
for day = 1, dateStuff.daysInMonth do
for day = 1, dateStuff.daysInMonth do
if isLinkworthy(day, currentDay) then
if dateStuff.argsDate or isLinkworthy(day, currentDay) then
calStrings[#calStrings + 1] = makeDayLink(day, currentMonth, currentYear)
calStrings[#calStrings + 1] = makeDayLink(day, currentMonth, currentYear)
else
else
Line 124: Line 144:
:wikitext(weekday)
:wikitext(weekday)
end
end

-- Days
-- Days
local colspan = dateStuff.firstWeekday - 1
local cellCount = 1 - dateStuff.firstWeekday -- Tracks the number of day cells. Negative values used for initial blank cells.
local cellCount = 0 -- Tracks the number of day cells.
while cellCount < #dayStrings do -- Weekly rows
local firstDayRow = root:tag('tr')
local weeklyRow = root:tag('tr')
for i = 1, 7 do -- Always make 7 cells.
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')
:css{['text-align'] = 'center'}
: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
cellCount = cellCount + 1
local dayString = dayStrings[cellCount]
local dayString = dayStrings[cellCount] or "&nbsp;" -- Use a blank cell if there is no corresponding dateString
weeklyRow:tag('td')
if not dayString then
dayString = " "
end
otherDayRow:tag('td')
:css{['text-align'] = 'center'}
:css{['text-align'] = 'center'}
:wikitext(dayString)
:wikitext(dayString)
Line 156: Line 159:


-- Footer
-- Footer
if not dateStuff.argsDate then -- No footer necessary on Archive pages.
root:tag('tr')
:tag('td')
root:tag('tr')
:attr('colspan', '7')
:tag('td')
:attr('colspan', '7')
:css{['padding-top'] = '3px', ['padding-bottom'] = '5px', ['font-size'] = '78%', ['text-align'] = 'right'}
:css{['padding-top'] = '3px', ['padding-bottom'] = '5px', ['font-size'] = '78%', ['text-align'] = 'right'}
:wikitext('&nbsp;&nbsp; ' .. makeWikilink('Portal:Current events/' .. monthAndYear, 'More ' .. monthAndYear .. ' events... &nbsp;&nbsp;'))
:wikitext('&nbsp;&nbsp; ' .. makeWikilink('Portal:Current events/' .. monthAndYear, 'More ' .. monthAndYear .. ' events... &nbsp;&nbsp;'))
end
return tostring(root)
return tostring(root)

Revision as of 18:42, 1 September 2017

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

--[[
	Incoming expected variables:
		frame.args.year = Integer value for year
		frame.args.month = Integer value for month, 1 based.
--]]

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(frame)
	local argsDate = nil
	if (frame and frame.args and frame.args.year and frame.args.month) then
		-- If a date is passed in, assume that the display page is an Archive page.
		-- If no date passed in, assume that the display page is the current Current Events page
		argsDate = frame.args.year .. "-" .. frame.args.month .. "-01" -- Construct a date, YYY-M-DD format.
	end
	local dateStuff = p.getDateStuff(argsDate)
	local dayStrings = p.makeDayStrings(dateStuff)
	return p.export(dayStrings, dateStuff)
end

function p.getDateStuff(argsDate)

--[[
	Note: This function takes advantage of the formatDate's second argument to
	create data for the archival calendars. If the second arg (argsDate) is nil,
	then formatDate assumes the current date/time.
--]]

	-- Gets date data.
	local dateStuff = {}
	local lang = mw.language.getContentLanguage()
	dateStuff.argsDate = argsDate
	--Year
	local year = lang:formatDate('Y', argsDate)
	year = tonumber(year)
	dateStuff.year = year
	-- Month
	local month = lang:formatDate('F', argsDate)
	dateStuff.month = month
	-- Month and year
	local monthAndYear = lang:formatDate('F Y', argsDate)
	local firstOfMonth = lang:formatDate('01-m-Y', argsDate)
	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', argsDate)
	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 dateStuff.argsDate or 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|&nbsp;&nbsp;%d&nbsp;&nbsp;]]'''", 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{
			display = 'table',
			width = '100%',
			float = 'initial', 
			['max-width'] = '350px',
			margin = 'auto !important',
			['text-align'] = 'center',
			['background-color'] = '#f5faff',
			border = '1px solid #cedff2'
		}
		-- Headings
		:tag('tr')
			:css('background-color', '#cedff2')
			:tag('th')
				:css{['text-align'] = 'center'}
				:wikitext(makeWikilink('Portal:Current events/' .. dateStuff.previousMonthAndYear, '◀'))
				:done()
			:tag('th')
				:attr('colspan', '5')
				:css{['text-align'] = 'center'}
				:wikitext(makeWikilink('Portal:Current events/' .. monthAndYear, monthAndYear))
				:done()
			:tag('th')
				:css{['text-align'] = 'center'}
				: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('th')
			:css{['width'] = '14%', ['text-align'] = 'center'}
			:wikitext(weekday)
	end

	-- Days
	local cellCount = 1 - dateStuff.firstWeekday -- Tracks the number of day cells. Negative values used for initial blank cells.
	while cellCount < #dayStrings do -- Weekly rows
		local weeklyRow = root:tag('tr')
		for i = 1, 7 do -- Always make 7 cells.
			cellCount = cellCount + 1
			local dayString = dayStrings[cellCount] or "&nbsp;" -- Use a blank cell if there is no corresponding dateString
			weeklyRow:tag('td')
				:css{['text-align'] = 'center'}
				:wikitext(dayString)
		end
	end

	-- Footer
	if not dateStuff.argsDate then -- No footer necessary on Archive pages.
		root:tag('tr')
			:tag('td')
				:attr('colspan', '7')
				:css{['padding-top'] = '3px', ['padding-bottom'] = '5px', ['font-size'] = '78%', ['text-align'] = 'right'}
				:wikitext('&nbsp;&nbsp; ' .. makeWikilink('Portal:Current events/' .. monthAndYear, 'More ' .. monthAndYear .. ' events... &nbsp;&nbsp;'))
	end
	
	return tostring(root)
end

return p