Module:Current events monthly archive

From blackwiki
Revision as of 06:34, 25 September 2017 by blackwiki>RossO (Better formatting)
Jump to navigation Jump to search

Usage

{{#invoke:Current events monthly archive|main}}

{{#invoke:Current events monthly archive|main|year=1996|month=12}}

This will eventually be extended to support the layout components for the Portal:Current events archive pages.



-- This module renders the introductory content on Monthly archive pages for the [[Portal:Current events]].

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

local p = {}

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

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.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')
	-- The next two lines help to make the table-layout-based Archive pages look good. When the 
	-- Archives have been converted to a grid-based layout, this logic can be removed, and the
	-- corressponding CSS margin attribute can be simplified.
	local temporaryMarginAdjustment = "auto !important"
	if dateStuff.argsDate then temporaryMarginAdjustment = "8px 0 0 8px" end
	root
		-- Intro paragraph
		:tag('p')
			:wikitext("'''[[" .. dateStuff.month .. "]] [[" .. dateStuff.year .. "]]''' was the ninth month of that common year. The month, which began on a [[Thursday]], ended on a [[Friday]] after " .. dateStuff.daysInMonth .. " days.")
			:done()
		:tag('p')
			:wikitext("== [[Portal:Current events]] == ")
			:done()
		:tag('p')
			:wikitext("''This is an [[Portal:Current events/How to archive the portal|archived version]] of Wikipedia's [[Portal:Current events|Current events Portal]] from September 2011.''")
			:done()
		:tag('p')
			:wikitext("{| style='background-color:transparent' cellspacing=0 cellpadding=0")
			:done()
		:tag('p')
			:wikitext("== [[Portal:Current events]] == ")
			:done()
		:tag('p')
			:wikitext("| style='vertical-align:top;' |")
			:done()
		:tag('p')
			:wikitext("{{Portal:Current events/Month Inclusion|2011 September}}")
			:done()
		:tag('p')
			:wikitext("|style='vertical-align:top;width:250px'|")
			:done()
		:tag('p')
			:wikitext("{{Portal:Current events/September 2011/Calendar}}")
			:done()
		:tag('p')
			:wikitext("{{Portal:Current events/September 2011/Sidebar}}")
			:done()
		:tag('p')
			:wikitext("==References==")
			:done()
		:tag('p')
			:wikitext("{{reflist}}")
			:done()
		:tag('p')
			:wikitext("{{commons category|September 2011}}")
			:done()
		:tag('p')
			:wikitext("{{Portal:Current events/Events by month}}")
			:done()
		:tag('p')
			:wikitext("[[Category:September|2011]]")
			:done()
		:tag('p')
			:wikitext("[[Category:2011|*2011-09]]")
			:done()
		:tag('p')
			:wikitext("[[Category:Current events archives]]")
			:done()
	
	return tostring(root)
end

return p