Difference between revisions of "Module:Current events monthly archive"
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 | + | 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: | + | 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