Module:Current events calendar: Difference between revisions
Vivaporius (talk | contribs) m (1 revision imported) |
Vivaporius (talk | contribs) m (1 revision imported) |
||
(One intermediate revision by one other user not shown) | |||
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 |
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. |
|||
⚫ | |||
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 81: | Line 101: | ||
function p.makeDayLink(day, month, year) |
function p.makeDayLink(day, month, year) |
||
return string.format("'''[[#%d %s %d|%d]]'''", year, month, day, day) |
return string.format("'''[[#%d %s %d| %d ]]'''", year, month, day, day) |
||
end |
end |
||
Line 88: | Line 108: | ||
local monthAndYear = dateStuff.monthAndYear |
local monthAndYear = dateStuff.monthAndYear |
||
local root = mw.html.create('table') |
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 |
root |
||
:addClass('infobox') |
:addClass('infobox') |
||
:css{ |
|||
:css{width = '250px', ['text-align'] = 'center', ['background-color'] = '#f5faff', border = '1px solid #cedff2'} |
|||
display = 'table', |
|||
⚫ | |||
width = '100%', |
|||
float = 'initial', |
|||
['max-width'] = '350px', |
|||
margin = temporaryMarginAdjustment, |
|||
['text-align'] = 'center', |
|||
['background-color'] = '#f5faff', |
|||
border = '1px solid #cedff2' |
|||
⚫ | |||
-- Headings |
-- Headings |
||
:tag('tr') |
:tag('tr') |
||
:css('background-color', '#cedff2') |
:css('background-color', '#cedff2') |
||
:tag(' |
:tag('th') |
||
:css{[' |
:css{['text-align'] = 'center'} |
||
⚫ | |||
⚫ | |||
:addClass('noprint') |
|||
⚫ | |||
:done() |
|||
:done() |
:done() |
||
:tag(' |
:tag('th') |
||
:attr('colspan', '5') |
:attr('colspan', '5') |
||
:css{ |
:css{['text-align'] = 'center'} |
||
:wikitext(makeWikilink('Portal:Current events/' .. monthAndYear, monthAndYear)) |
:wikitext(makeWikilink('Portal:Current events/' .. monthAndYear, monthAndYear)) |
||
:done() |
:done() |
||
:tag(' |
:tag('th') |
||
:css{[' |
:css{['text-align'] = 'center'} |
||
⚫ | |||
⚫ | |||
:addClass('noprint') |
|||
⚫ | |||
-- Day of week headings |
-- Day of week headings |
||
Line 112: | Line 150: | ||
local weekdays = {'S', 'M', 'T', 'W', 'T', 'F', 'S'} |
local weekdays = {'S', 'M', 'T', 'W', 'T', 'F', 'S'} |
||
for i, weekday in ipairs(weekdays) do |
for i, weekday in ipairs(weekdays) do |
||
dayHeadingRow:tag(' |
dayHeadingRow:tag('th') |
||
:css{['width'] = '14%', ['text-align'] = 'center'} |
|||
:wikitext(weekday) |
:wikitext(weekday) |
||
end |
end |
||
-- Days |
-- Days |
||
local |
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') |
|||
⚫ | |||
if colspan > 1 then |
|||
⚫ | |||
⚫ | |||
elseif colspan == 1 then |
|||
⚫ | |||
⚫ | |||
for i = colspan + 1, 7 do -- Finish the first row |
|||
cellCount = cellCount + 1 |
|||
firstDayRow:tag('td') |
|||
:wikitext(dayStrings[cellCount]) |
|||
⚫ | |||
while cellCount < #dayStrings do -- Second day row onwards |
|||
local otherDayRow = root:tag('tr') |
|||
⚫ | |||
cellCount = cellCount + 1 |
cellCount = cellCount + 1 |
||
local dayString = dayStrings[cellCount] |
local dayString = dayStrings[cellCount] or " " -- Use a blank cell if there is no corresponding dateString |
||
⚫ | |||
if not dayString then |
|||
:css{['text-align'] = 'center'} |
|||
break |
|||
end |
|||
⚫ | |||
:wikitext(dayString) |
:wikitext(dayString) |
||
end |
end |
||
Line 145: | Line 169: | ||
-- Footer |
-- Footer |
||
if not dateStuff.argsDate then -- No footer necessary on Archive pages. |
|||
⚫ | |||
:tag(' |
root:tag('tr') |
||
:addClass('noprint') |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
return tostring(root) |
return tostring(root) |
Latest revision as of 03:12, 12 May 2022
This module is rated as alpha. It is ready for third-party input, and may be used on a few pages to see if problems arise, but should be watched. Suggestions for new features or changes in their input and output mechanisms are welcome. |
This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. |
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
Usage on Portal:Current events[edit]
{{#invoke:current events calendar|main}}
Usage on Category:Current events archives pages[edit]
{{#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[edit]
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.
June 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[edit]
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[edit]
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