มอดูล:Current events calendar

-- This module renders the calendar seen on Portal:Current events.
local config = {
	monthAndYearFormat = 'F พ.ศ. xkY',
	yearFormat = 'xkY',
	dayLinkFormat = "$3",
}
local p = {}
local function makeWikilink(link, display)
	if display then
		return string.format('%s', link, display)
	else
		return string.format('%s', link)
	end
end
function p.main()
	local dateStuff = p.getDateStuff()
	local dayStrings = p.makeDayStrings(dateStuff)
	return p.export(dayStrings, dateStuff)
end
function p.getDateStuff()
	-- Gets date data.
	local dateStuff = {}
	local lang = mw.language.getContentLanguage()
	--Year
	local year = lang:formatDate(config.yearFormat)
	year = tonumber(year)
	dateStuff.year = year
	-- Month
	local month = lang:formatDate('F')
	dateStuff.month = month
	-- Month and year
	local monthAndYear = lang:formatDate(config.monthAndYearFormat)
	local firstOfMonth = lang:formatDate('01-m-Y')
	dateStuff.monthAndYear = monthAndYear
	-- Previous month and year
	dateStuff.previousMonthAndYear = lang:formatDate(config.monthAndYearFormat, firstOfMonth .. ' -1 month')
	-- Next month and year
	dateStuff.nextMonthAndYear = lang:formatDate(config.monthAndYearFormat, firstOfMonth .. ' +1 month')
	-- Day
	local day = lang:formatDate('j')
	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 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 of week headings
	local dayHeadingRow = root:tag('tr')
	local weekdays = {'อา', 'จ', 'อ', 'พ', 'พฤ', 'ศ', 'ส'}
	for i, weekday in ipairs(weekdays) do
		dayHeadingRow:tag('td')
			:wikitext(weekday)
	end
	
	-- Days
	local colspan = dateStuff.firstWeekday - 1
	local cellCount = 0 -- Tracks the number of day cells.
	local firstDayRow = root:tag('tr')
		firstDayRow:tag('td')
			:attr('colspan', tostring(colspan))
	elseif colspan == 1 then
		firstDayRow:tag('td')
	end
	for i = colspan + 1, 7 do -- Finish the first row
		cellCount = cellCount + 1
		firstDayRow:tag('td')
			:wikitext(dayStringscellCount)
	end
	while cellCount < #dayStrings do -- Second day row onwards
		local otherDayRow = root:tag('tr')
		for i = 1, 7 do
			cellCount = cellCount + 1
			local dayString = dayStringscellCount
			if not dayString then
				break
			end
			otherDayRow:tag('td')
				:wikitext(dayString)
		end
	end
	-- Footer
	root:tag('tr')
		:tag('td')
			:attr('colspan', '7')
			:css{'padding-top' = '3px', 'padding-bottom' = '5px', 'font-size' = '78%', 'text-align' = 'left'}
			:wikitext('   ' .. makeWikilink(monthAndYear, 'ดูเพิ่มเกี่ยวกับเหตุการณ์ใน' .. monthAndYear))
	
	return tostring(root)
end
return p