Difference between revisions of "Module:Current events monthly archive"

From blackwiki
Jump to navigation Jump to search
blackwiki>RossO
(Initial code for Structural injection)
blackwiki>RossO
(Drafting outlines disabled)
Line 42: Line 42:
 
function p.startPrimarySection(frame)
 
function p.startPrimarySection(frame)
 
local root = "<div style='display: flex;'>"
 
local root = "<div style='display: flex;'>"
root = root .. "<div style='flex: auto; outline: green 3px dotted;'>"
+
root = root .. "<div style='flex: auto; outline: green 0px dotted;'>"
 
return root
 
return root
 
end
 
end
Line 50: Line 50:
 
end
 
end
 
function p.startSecondarySection(frame)
 
function p.startSecondarySection(frame)
local root = "<div style='flex: 0 0 280px; outline: green 3px dotted;'>"
+
local root = "<div style='flex: 0 0 280px; outline: yellow 0px dotted;'>"
 
return root
 
return root
 
end
 
end

Revision as of 05:30, 5 October 2017

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.

Preview this against:
	Portal:Current events/September 2011/Sandbox
	User:RossO/sandbox/Current events monthly intro

--]]

local p = {}

function p.main(frame)
	local isArchive = false
	if (frame and frame.args and frame.args.year and frame.args.month) then
		isArchive = true
	end
	local argsYear = tonumber(frame.args.year or os.date( "%Y" ))
	local argsMonth = tonumber(frame.args.month or os.date( "%m" ))

	local dateStuff = p.getDateStuff(argsMonth, argsYear, isArchive)
	return p.exportPageIntro(dateStuff)
end

function p.archiveNote(frame)
	local isArchive = false
	if (frame and frame.args and frame.args.year and frame.args.month) then
		isArchive = true
	end
	local argsYear = tonumber(frame.args.year or os.date( "%Y" ))
	local argsMonth = tonumber(frame.args.month or os.date( "%m" ))

	local dateStuff = p.getDateStuff(argsMonth, argsYear, isArchive)
	return p.exportArchiveNote(dateStuff)
end

function p.startPrimarySection(frame)
	local root = "<div style='display: flex;'>"
	root = root .. "<div style='flex: auto; outline: green 0px dotted;'>"
	return root
end
function p.endPrimarySection(frame)
	local root = "</div>"
	return root
end
function p.startSecondarySection(frame)
	local root = "<div style='flex: 0 0 280px; outline: yellow 0px dotted;'>"
	return root
end
function p.endSecondarySection(frame)
	local root = "</div>"
	root = root .. "</div>"
	return root
end

--[[
	Purpose: Construct the dateStuff object. This object is just properties, used by multiple functions.
	Reference: https://www.mediawiki.org/wiki/Help:Extension:ParserFunctions#.23time
	NOTE: HTML/Wikitext string construction will always end with a blank space.
--]]

function p.getDateStuff(monthNumber, yearNumber, isArchive)

	-- Gets date data.
	local dateStuff = {}
	local constructedDate = yearNumber .. "-" .. monthNumber .. "-01" -- Construct a date, YYY-M-DD format.
	local lang = mw.language.getContentLanguage()

	local beVerb = "is"
	if (isArchive) then
		beVerb = "was"
	end
	-- Support for future tense 'will be' can go here.
	dateStuff.beVerb = beVerb

	--Year and Leap Year
	dateStuff.year = tonumber(yearNumber)
	local leapBool = tonumber(lang:formatDate('L', constructedDate))
	dateStuff.leapBool = leapBool
	local leapDesc = "common"
	if (leapBool == 1) then
		leapDesc = "leap"
		if (math.fmod(yearNumber, 400) == 0) then
			leapDesc = "century leap"
		end
	end
	dateStuff.leapDesc = leapDesc

	-- Month and Name
	local monthName = lang:formatDate('F', constructedDate)
	dateStuff.monthName = monthName
	dateStuff.monthNumber = tonumber(monthNumber)

	--Decade/Century/Millennium Note
	local decadeFlag = false
	local decadeNote = ""
	local decadeNumber = math.floor(yearNumber / 10) * 10
	local centuryCount = math.floor((yearNumber - 1) / 100) + 1 -- Fenceposts
	local millenniumCount = math.floor((yearNumber - 1) / 1000) + 1 -- Fenceposts
	local notePrefix = "It " .. beVerb .. " the "
	local noteInfix = "month of the "
	local noteFirstOrLast = "first "
	if (monthNumber == 12) then
		noteFirstOrLast = "last "
	end
	local ordinalSuffix = {
		"1st", "2nd", "3rd", "4th", "5th", "6th", "7th", "8th", "9th", "10th",
		"11th", "12th", "13th", "14th", "15th", "16th", "17th", "18th", "19th", "20th",
		"21st", "22nd", "23rd", "24th", "25th", "26th", "27th", "28th", "29th", "30th"
	}
	if (math.fmod(yearNumber, 1000) == 0 and monthNumber == 12) then
		decadeNote = "[[" .. ordinalSuffix[millenniumCount] .. " millennium]] "
		decadeNote = decadeNote .. "and the " --Millenniums always overlap centuries.
		decadeFlag = true
	end
	if (math.fmod(yearNumber, 1000) == 1 and monthNumber == 1) then
		decadeNote = "[[" .. ordinalSuffix[millenniumCount] .. " millennium]] "
		decadeNote = decadeNote .. "and the " --Millenniums always overlap centuries.
		decadeFlag = true
	end
	if (math.fmod(yearNumber, 100) == 0 and monthNumber == 12) then
		decadeNote = decadeNote .. "[[" .. ordinalSuffix[centuryCount] .. " century]]. "
		decadeFlag = true
	end
	if (math.fmod(yearNumber, 100) == 1 and monthNumber == 1) then
		decadeNote = decadeNote .. "[[" .. ordinalSuffix[centuryCount] .. " century]]. "
		decadeFlag = true
	end

	if (math.fmod(yearNumber, 10) == 9 and monthNumber == 12) then
		decadeNote = "[[" .. decadeNumber .. "s]] decade. "
		decadeFlag = true
	end
	if (math.fmod(yearNumber, 10) == 0 and monthNumber == 1) then
		decadeNote = "[[" .. decadeNumber .. "s]] decade. "
		decadeFlag = true
	end

	dateStuff.decadeNote = notePrefix .. noteFirstOrLast .. noteInfix .. decadeNote
	if (decadeFlag == false) then
		dateStuff.decadeNote = ""
	end


	--Moon Note
	local moonNote = ""
	if (monthNumber == 2) then
		-- https://www.quora.com/When-was-the-last-time-the-entire-month-of-February-passed-without-a-Full-Moon/answer/Alan-Marble
		if (yearNumber == 1961 or yearNumber == 1999 or yearNumber == 2018 or yearNumber == 2037 or yearNumber == 2067 or yearNumber == 2094) then
			moonNote = "This month had no full moon. "
		end
	end
	dateStuff.moonNote = moonNote

	-- First Day of the Month
	local firstOfMonth = lang:formatDate('01-m-Y', constructedDate)

	-- Weekday of the first day of the month
	local firstDayOfMonthName = lang:formatDate('l', firstOfMonth)
	dateStuff.firstDayOfMonthName = firstDayOfMonthName

	-- Days in month
	local daysInMonth = lang:formatDate('j', firstOfMonth .. ' +1 month -1 day')
	dateStuff.daysInMonth = tonumber(daysInMonth)

	-- Weekday of the last day of the month
	local lastDayOfMonthName = lang:formatDate('l', firstOfMonth .. ' +1 month -1 day')
	dateStuff.lastDayOfMonthName = lastDayOfMonthName

	return dateStuff
end

function p.exportPageIntro(dateStuff)

--[[
	Purpose: Construct WikiMarkup for the Intro paragraph.
	Reference: https://www.mediawiki.org/wiki/Help:Extension:ParserFunctions#.23time
--]]

	local monthOrdinal = {"first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth", "tenth", "eleventh", "twelfth and final"}
	local root = mw.html.create('div')
		:tag('p')
			:wikitext("'''''[[" .. dateStuff.monthName .. "]] [[" .. dateStuff.year .. "]]''' " .. dateStuff.beVerb .. " the " .. monthOrdinal[dateStuff.monthNumber] .. " month of the " .. dateStuff.leapDesc .. " year. ")
			:wikitext("" .. dateStuff.moonNote .. "" .. dateStuff.decadeNote .. "")
			:wikitext("The calendar for the month begins on a [[" .. dateStuff.firstDayOfMonthName .. "]] and ends on a [[" .. dateStuff.lastDayOfMonthName .. "]] after " .. dateStuff.daysInMonth .. " days.''")
			:done()
	
	return tostring(root)
end

function p.exportArchiveNote(dateStuff)

--[[
	Purpose: Construct WikiMarkup for the Archive Note heading and paragraph.
--]]

	local root = mw.html.create('div')
		:tag('h2')
			: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 " .. dateStuff.monthName .. " " .. dateStuff.year .. ".''")
			:done()	
	return tostring(root)
end

return p