Module:Current events calendar
Template:Module rating Template:Module rating
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 link of form: More November 2024 events....
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.
November 2024 | ||||||
---|---|---|---|---|---|---|
S | M | T | W | T | F | S |
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
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.
January 1997 | ||||||
---|---|---|---|---|---|---|
S | M | T | W | T | F | S |
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Sandbox version
Script error: No such module "current events calendar/sandbox".
-- 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| %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') -- 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 :addClass('infobox') :css{ display = 'table', width = '100%', float = 'initial', ['max-width'] = '350px', margin = temporaryMarginAdjustment, ['text-align'] = 'center', ['background-color'] = '#f5faff', border = '1px solid #cedff2' } -- Headings :tag('tr') :css('background-color', '#cedff2') :tag('th') :css{['text-align'] = 'center'} :tag('span') :addClass('noprint') :wikitext(makeWikilink('Portal:Current events/' .. dateStuff.previousMonthAndYear, '◀')) :done() :done() :tag('th') :attr('colspan', '5') :css{['text-align'] = 'center'} :wikitext(makeWikilink('Portal:Current events/' .. monthAndYear, monthAndYear)) :done() :tag('th') :css{['text-align'] = 'center'} :tag('span') :addClass('noprint') :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 " " -- 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') :addClass('noprint') :tag('td') :attr('colspan', '7') :css{['padding-top'] = '3px', ['padding-bottom'] = '5px', ['font-size'] = '78%', ['text-align'] = 'right'} :wikitext(makeWikilink('Portal:Current events/' .. monthAndYear, 'More ' .. monthAndYear .. ' events... ')) end return tostring(root) end return p