-- This module renders the calendars seen on .-- The code is based on .
--
local p =
local function makeWikilink(link, display) if display then return string.format('%s', link, display) else return string.format('%s', link) endend
local function getDateStuff(argsDate)
--
-- 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 dateStuffend
local function makeDayStrings(dateStuff) local format = string.format local calStrings = local currentDay = dateStuff.day local currentMonth = dateStuff.month local currentYear = dateStuff.year for day = 1, dateStuff.daysInMonth do table.insert(calStrings, format(" %d ", currentYear, currentMonth, day, day )) end return calStringsend
local function export(dayStrings, dateStuff) -- Generates the calendar HTML. local monthAndYear = dateStuff.monthAndYear local root = mw.html.create('table') root :addClass('current-events-calendar-days')
-- Headings :tag('caption') :wikitext(makeWikilink('Portal:Current events/' .. monthAndYear, monthAndYear)) :done
-- Day of week headings local dayHeadingRow = root:tag('tr') local weekdays = for i, weekday in ipairs(weekdays) do dayHeadingRow:tag('th') :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') :wikitext(dayString) end end
return mw.getCurrentFrame:extensionTag .. tostring(root)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 = getDateStuff(argsDate) local dayStrings = makeDayStrings(dateStuff) return export(dayStrings, dateStuff)end
return p