Jump to content

Module:Ka̱la̱nda naat mbwuot mi̱ di̱ yong huni

Neet di̱ Wikipedia

This module generates calendars for A̱na̱nwuai:Naat mbwuot mi̱ di̱ yong huni and Sa: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 Zwat Swak ma̱ng Sweang 2024 events....

{{#invoke:ka̱la̱nda naat mbwuot mi̱ di̱ yong huni|main}}
{{#invoke:ka̱la̱nda naat mbwuot mi̱ di̱ yong huni|main|year=[four digit numerical year]|month=[One or two digit number from 1 to 12]}}

Example: Current Events front page version

[jhyuk a̱tyin ka]

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 A̱na̱nwuai:Naat mbwuot mi̱ di̱ yong huni page.

Zwat Swak ma̱ng Sweang 2024
LaTa̱TlLrLmJuA̱s
1234567
891011121314
15161718192021
22232425262728
293031

Example: Current Events archive version

[jhyuk a̱tyin ka]

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.

Zwat Jhyiung 1997
LaTa̱TlLrLmJuA̱s
1234
567891011
12131415161718
19202122232425
262728293031

Sandbox version

[jhyuk a̱tyin ka]
Zwat Swak ma̱ng Sweang 2024
LaTa̱TlLrLmJuA̱s
1234567
891011121314
15161718192021
22232425262728
293031

-- This module renders the calendar seen on [[A̱na̱nwuai:Naat mbwuot mi̱ di̱ yong huni]].

--[[
	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

local function 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.
--]]

	local lang = mw.language.getContentLanguage()
	local firstOfMonth = lang:formatDate('01-m-Y', argsDate)
	return {
		argsDate = argsDate,
		year = tonumber(lang:formatDate('Y', argsDate)),
		month = lang:formatDate('F', argsDate),
		monthAndYear = lang:formatDate('F Y', argsDate),
		previousMonthAndYear = lang:formatDate('F Y', firstOfMonth .. ' -1 month'),
		nextMonthAndYear = lang:formatDate('F Y', firstOfMonth .. ' +1 month'),
		day = tonumber(lang:formatDate('j', argsDate)),
		daysInMonth = tonumber(lang:formatDate('j', firstOfMonth .. ' +1 month -1 day')),
		-- Weekday of the first day of the month
		-- Make compatible with Lua tables so we add 1. Sunday = 1, Saturday = 7.
		firstWeekday = tonumber(lang:formatDate('w', firstOfMonth)) + 1
	}
end

local function 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.
	return currentDay - 6 <= day and day <= currentDay
end

local function makeDayStrings(dateStuff)
	local calStrings = {}
	local currentDay = dateStuff.day
	local currentMonth = dateStuff.month
	local currentYear = dateStuff.year
	for day = 1, dateStuff.daysInMonth do
		if dateStuff.argsDate or isLinkworthy(day, currentDay) then
			table.insert(calStrings, string.format(
				"[[#%d %s %d|%d]]",
				currentYear,
				currentMonth,
				day,
				day
			))
		else
			table.insert(calStrings, tostring(day))
		end
	end
	return calStrings
end

local function export(dayStrings, dateStuff)
	-- Generates the calendar HTML.
	local monthAndYear = dateStuff.monthAndYear
	local root = mw.html.create('table')
	root
		:addClass('current-events-calendar')
		-- 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.
		:addClass(dateStuff.argsDate and 'current-events-calendar-archive')
		-- Headings
		:tag('caption')
			:tag('span')
				:addClass('noprint')
				:wikitext(makeWikilink(
					'A̱na̱nwuai:Naat mbwuot mi̱ di̱ yong huni/' .. dateStuff.previousMonthAndYear,
					'◀'
				))
				:done()
			:tag('span')
				:wikitext(makeWikilink(
					'A̱na̱nwuai:Naat mbwuot mi̱ di̱ yong/' .. monthAndYear,
					monthAndYear
				))
				:done()
			:tag('span')
				:addClass('noprint')
				:wikitext(makeWikilink(
					'A̱na̱nwuai:Naat mbwuot mi̱ di̱ yong/' .. dateStuff.nextMonthAndYear,
					'▶'
				))

	-- Day of week headings
	local dayHeadingRow = root:tag('tr')
	local weekdays = {'La', 'Ta̱', 'Tl', 'Lr', 'Lm', 'Ju', 'A̱s'}
	for _, weekday in ipairs(weekdays) do
		dayHeadingRow:tag('th'):wikitext(weekday)
	end

	-- Days
	-- Tracks the number of day cells. Negative values used for initial blank cells.
	local cellCount = 1 - dateStuff.firstWeekday
	while cellCount < #dayStrings do -- Weekly rows
		local weeklyRow = root:tag('tr')
		for i = 1, 7 do -- Always make 7 cells.
			cellCount = cellCount + 1
			-- Use a blank cell if there is no corresponding dateString
			local dayString = dayStrings[cellCount] or ''
			weeklyRow:tag('td'):wikitext(dayString)
		end
	end

	-- Footer
	if not dateStuff.argsDate then -- No footer necessary on Archive pages.
		root:tag('tr')
			:addClass('current-events-calendar-footer')
		    :addClass('noprint')
			:tag('td')
				:attr('colspan', '7')
				:wikitext(makeWikilink(
					'A̱na̱nwuai:Naat mbwuot mi̱ di̱ yong/' .. monthAndYear,
					'Naat mbwuot ' .. monthAndYear .. ' ghyang...&nbsp;&nbsp;&nbsp;'
				))
	end
	
	return 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
		-- Construct a date, YYY-M-DD format.
		argsDate = frame.args.year .. "-" .. frame.args.month .. "-01"
	end
	local dateStuff = getDateStuff(argsDate)
	return frame:extensionTag{
		name = 'templatestyles',
		args = { src = 'Module:Ka̱la̱nda naat mbwuot mi̱ di̱ yong/styles.css' }
	} .. export(makeDayStrings(dateStuff), dateStuff)
end

return p