<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FTokoko%2FCalendar</id>
	<title>Module:Sandbox/Tokoko/Calendar - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FTokoko%2FCalendar"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Tokoko/Calendar&amp;action=history"/>
	<updated>2026-04-21T17:56:06Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Sandbox/Tokoko/Calendar&amp;diff=146323&amp;oldid=prev</id>
		<title>imported&gt;Legoktm: Replace Module:No globals with require( &quot;strict&quot; )</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Tokoko/Calendar&amp;diff=146323&amp;oldid=prev"/>
		<updated>2022-10-23T21:07:42Z</updated>

		<summary type="html">&lt;p&gt;Replace &lt;a href=&quot;/research/Module:No_globals&quot; title=&quot;Module:No globals&quot;&gt;Module:No globals&lt;/a&gt; with require( &amp;quot;strict&amp;quot; )&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require(&amp;#039;strict&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
local root = {}&lt;br /&gt;
&lt;br /&gt;
local function addRow(row)&lt;br /&gt;
	table.insert(root, row)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function isLeapYear(year)&lt;br /&gt;
    return year % 4 == 0 and (year % 100 ~= 0 or year % 400 == 0)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getDaysInMonth(month, year)&lt;br /&gt;
    return month == 2 and isLeapYear(year) and 29&lt;br /&gt;
           or (&amp;quot;\31\28\31\30\31\30\31\31\30\31\30\31&amp;quot;):byte(month)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getMonthNumber(m)&lt;br /&gt;
    if tonumber(m) ~= nil then&lt;br /&gt;
      return tonumber(m)&lt;br /&gt;
    elseif m == &amp;quot;current&amp;quot; then&lt;br /&gt;
      return tonumber(os.date(&amp;quot;%m&amp;quot;))&lt;br /&gt;
    elseif m == &amp;quot;next&amp;quot; then&lt;br /&gt;
      return tonumber(os.date(&amp;quot;%m&amp;quot;)) % 12 + 1&lt;br /&gt;
    elseif m == &amp;quot;last&amp;quot; then&lt;br /&gt;
      return (tonumber(os.date(&amp;quot;%m&amp;quot;)) - 2) % 12 + 1&lt;br /&gt;
    else&lt;br /&gt;
      return 1&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function applyDefaultValue(inputValue, defaultValue)&lt;br /&gt;
	return (inputValue and inputValue ~= &amp;quot;&amp;quot;) and inputValue or defaultValue&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getWeekdays(format)&lt;br /&gt;
	if format == &amp;quot;Mon1st&amp;quot; then&lt;br /&gt;
		return {&amp;quot;Mo&amp;quot;, &amp;quot;Tu&amp;quot;, &amp;quot;We&amp;quot;, &amp;quot;Th&amp;quot;, &amp;quot;Fr&amp;quot;, &amp;quot;Sa&amp;quot;, &amp;quot;Su&amp;quot;}&lt;br /&gt;
	elseif format == &amp;quot;iso&amp;quot; then&lt;br /&gt;
		return {&amp;quot;Wk&amp;quot;, &amp;quot;Mo&amp;quot;, &amp;quot;Tu&amp;quot;, &amp;quot;We&amp;quot;, &amp;quot;Th&amp;quot;, &amp;quot;Fr&amp;quot;, &amp;quot;Sa&amp;quot;, &amp;quot;Su&amp;quot;}&lt;br /&gt;
	else&lt;br /&gt;
		return {&amp;quot;Su&amp;quot;, &amp;quot;Mo&amp;quot;, &amp;quot;Tu&amp;quot;, &amp;quot;We&amp;quot;, &amp;quot;Th&amp;quot;, &amp;quot;Fr&amp;quot;, &amp;quot;Sa&amp;quot;}&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getIsoWeekNumber(year, month, day)&lt;br /&gt;
	local daysFromStart = os.difftime(os.time{year= year, month=month, day=day}, os.time{year=year, month=1, day=1}) / 86400&lt;br /&gt;
	local daysUntilEnd = os.difftime(os.time{year= year + 1, month=1, day=1}, os.time{year=year, month=month, day=day}) / 86400&lt;br /&gt;
	local firstWeekday = tonumber(os.date(&amp;quot;%w&amp;quot;,os.time{year=year, month=month, day=1}))&lt;br /&gt;
	local nextFirstWeekday = tonumber(os.date(&amp;quot;%w&amp;quot;,os.time{year=year+1, month=month, day=1}))&lt;br /&gt;
	&lt;br /&gt;
	if daysUntilEnd &amp;lt; 4 and nextFirstWeekday &amp;gt;= 4 then return 1 end&lt;br /&gt;
	local daysFromFirstMonday = daysFromStart	- (8 - firstWeekday)&lt;br /&gt;
	local iso = math.floor(daysFromFirstMonday / 7) + 2 - (firstWeekday &amp;gt; 5 and 1 or 0)&lt;br /&gt;
	return iso == 0 and getIsoWeekNumber(year - 1, 12, 26) or iso&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function make_link(text, flag, pref, suff)&lt;br /&gt;
	return flag and &amp;quot;[[&amp;quot; .. pref .. text .. suff .. &amp;quot;|&amp;quot; .. text .. &amp;quot;]]&amp;quot; or text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function format_date(date)&lt;br /&gt;
	return date &amp;lt; 10 and &amp;quot;&amp;amp;nbsp;&amp;quot; .. date or date&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function _calendar(frame, _monthNumber, full_mode, float)&lt;br /&gt;
	local monthNumber = _monthNumber&lt;br /&gt;
	&lt;br /&gt;
	local year = tonumber(applyDefaultValue(frame.args.year,os.date(&amp;quot;%Y&amp;quot;)))&lt;br /&gt;
	local month = os.date(&amp;quot;%B&amp;quot;, os.time{year=year, month=monthNumber, day=1})&lt;br /&gt;
	local show_year = applyDefaultValue(frame.args.show_year,&amp;quot;on&amp;quot;)&lt;br /&gt;
	local format = applyDefaultValue(frame.args.format,&amp;quot;Sun1st&amp;quot;) --format = &amp;quot;iso&amp;quot;&lt;br /&gt;
	local colspan = (format == &amp;quot;iso&amp;quot; and 8 or 7)&lt;br /&gt;
	local prevnext = applyDefaultValue(frame.args.prevnext == &amp;quot;on&amp;quot;, false)&lt;br /&gt;
	local end_note = applyDefaultValue(frame.args.EndNote, &amp;quot;&amp;quot;)&lt;br /&gt;
	local colour = frame.args.colour&lt;br /&gt;
	local title_colour = applyDefaultValue(colour,frame.args.title_colour)&lt;br /&gt;
	local week_colour = applyDefaultValue(colour,frame.args.week_colour)&lt;br /&gt;
	local wknum_colour = frame.args.wknum_colour&lt;br /&gt;
	local lk = applyDefaultValue(frame.args.lk, &amp;quot;&amp;quot;)&lt;br /&gt;
	local show_link_year = string.match(lk, &amp;quot;y&amp;quot;)&lt;br /&gt;
	local show_link_month = string.match(lk, &amp;quot;m&amp;quot;)&lt;br /&gt;
	local show_link_day = string.match(lk, &amp;quot;d&amp;quot;)&lt;br /&gt;
	local lk_pref = frame.args.lk_pref&lt;br /&gt;
	local lk_suff = frame.args.lk_suff&lt;br /&gt;
	local lk_pref_d = applyDefaultValue(lk_pref,frame.args.lk_pref_d)&lt;br /&gt;
	local lk_suff_d = applyDefaultValue(lk_suff,frame.args.lk_suff_d)&lt;br /&gt;
	local lk_pref_m = applyDefaultValue(lk_pref,frame.args.lk_pref_m)&lt;br /&gt;
	local lk_suff_m = applyDefaultValue(lk_suff,frame.args.lk_suff_m)&lt;br /&gt;
	local lk_pref_mnext = frame.args.lk_pref_mnext&lt;br /&gt;
	local lk_pref_mprev = frame.args.lk_pref_mprev&lt;br /&gt;
	local lk_suff_mnext = frame.args.lk_suff_mnext&lt;br /&gt;
	local lk_suff_mprev = frame.args.lk_suff_mprev&lt;br /&gt;
	if full_mode and show_year == &amp;quot;on&amp;quot; then show_year = &amp;quot;with month&amp;quot; end &lt;br /&gt;
	&lt;br /&gt;
	-- calculate helper variables&lt;br /&gt;
	local prevMonth = os.date(&amp;quot;%B&amp;quot;, os.time{year=year, month=(monthNumber - 2) % 12 + 1, day=1})&lt;br /&gt;
	local nextMonth = os.date(&amp;quot;%B&amp;quot;, os.time{year=year, month=monthNumber % 12 + 1, day=1})&lt;br /&gt;
	local firstWeekday = tonumber(os.date(&amp;quot;%w&amp;quot;,os.time{year=year, month=monthNumber, day=1}))&lt;br /&gt;
	local daysInMonth = getDaysInMonth(monthNumber, year)&lt;br /&gt;
&lt;br /&gt;
	-- constuct title&lt;br /&gt;
	addRow(&amp;quot;{| class=\&amp;quot;toccolours &amp;quot; .. float ..  &amp;quot;\&amp;quot; style=\&amp;quot;text-align:center;\&amp;quot; cellpadding=2 cellspacing=0\n&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
	addRow(&amp;quot;|- class=\&amp;quot;navbox-title\&amp;quot;&amp;quot; .. &amp;quot; style=\&amp;quot;background:&amp;quot; .. title_colour .. &amp;quot;;\&amp;quot;\n&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
	local title_colspan = (prevnext and colspan - 2 or colspan)&lt;br /&gt;
	local title = make_link(month .. (show_year == &amp;quot;with month&amp;quot; and &amp;quot; &amp;quot; .. year or &amp;quot;&amp;quot;), show_link_month, lk_pref_m, lk_suff_m)&lt;br /&gt;
	local title_row = &amp;quot;|colspan=\&amp;quot;&amp;quot; .. title_colspan .. &amp;quot;\&amp;quot;|&amp;#039;&amp;#039;&amp;#039;&amp;quot; .. title .. &amp;quot;&amp;#039;&amp;#039;&amp;#039;\n&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	if prevnext then&lt;br /&gt;
		addRow(&amp;quot;|[[&amp;quot; .. lk_pref_mprev .. prevMonth .. lk_suff_mprev .. &amp;quot;|  &amp;lt;&amp;lt; ]]\n&amp;quot; .. title_row .. &amp;quot;|[[&amp;quot; .. lk_pref_mnext .. nextMonth .. lk_suff_mnext .. &amp;quot;|  &amp;gt;&amp;gt; ]]\n&amp;quot;)&lt;br /&gt;
	else &lt;br /&gt;
		addRow(title_row)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- construct weekdays&lt;br /&gt;
	addRow(&amp;quot;|- class=\&amp;quot;navbox-title\&amp;quot;&amp;quot; .. &amp;quot; style=\&amp;quot;background:&amp;quot; .. week_colour .. &amp;quot;;\&amp;quot;\n&amp;quot;)&lt;br /&gt;
	for i, wd in ipairs(getWeekdays(format)) do&lt;br /&gt;
    	addRow(&amp;quot;|&amp;#039;&amp;#039;&amp;#039;&amp;quot; .. wd .. &amp;quot;&amp;#039;&amp;#039;&amp;#039;\n&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	addRow(&amp;quot;|-\n&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	-- construct dates&lt;br /&gt;
	local daysToMiss = firstWeekday - ((format == &amp;quot;Mon1st&amp;quot; or format == &amp;quot;iso&amp;quot;) and 1 or 0)&lt;br /&gt;
	local date = - daysToMiss + 1&lt;br /&gt;
	local num_rows = full_mode and 6 or math.ceil((daysInMonth + daysToMiss) / 7)&lt;br /&gt;
	&lt;br /&gt;
	for i = 1, num_rows * colspan do&lt;br /&gt;
		local lastColumn = i % colspan == 0&lt;br /&gt;
		local firstColumn = i % colspan == 1&lt;br /&gt;
		&lt;br /&gt;
		if format == &amp;quot;iso&amp;quot; and firstColumn then&lt;br /&gt;
			addRow(&amp;quot;| class=\&amp;quot;navbox-abovebelow\&amp;quot; style=\&amp;quot;background:&amp;quot; .. wknum_colour .. &amp;quot;;\&amp;quot;|&amp;quot; .. getIsoWeekNumber(year, monthNumber, date) .. &amp;quot;\n&amp;quot;)&lt;br /&gt;
		elseif date &amp;gt; 0 and date &amp;lt;= daysInMonth then&lt;br /&gt;
			addRow(&amp;quot;|&amp;quot; .. make_link(format_date(date), show_link_day, lk_pref_d .. month .. &amp;quot; &amp;quot;, lk_suff_d) .. &amp;quot;\n&amp;quot;)&lt;br /&gt;
			date = date + 1&lt;br /&gt;
		else &lt;br /&gt;
			addRow(&amp;quot;|&amp;amp;nbsp;\n&amp;quot;) &lt;br /&gt;
			date = date + 1&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if(lastColumn) then addRow(&amp;quot;|-\n&amp;quot;) end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if end_note ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		addRow(&amp;quot;|- class=\&amp;quot;navbox-title\&amp;quot; \n&amp;quot;)&lt;br /&gt;
		addRow(&amp;quot;|colspan=\&amp;quot;&amp;quot; .. colspan ..&amp;quot;\&amp;quot;|&amp;quot; .. end_note .. &amp;quot;\n&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if show_year == &amp;quot;on&amp;quot; then&lt;br /&gt;
		addRow(&amp;quot;|- class=\&amp;quot;navbox-title\&amp;quot;&amp;quot; .. &amp;quot; style=\&amp;quot;background:&amp;quot; .. title_colour .. &amp;quot;;\&amp;quot;\n&amp;quot;)&lt;br /&gt;
		addRow(&amp;quot;|colspan=\&amp;quot;&amp;quot; .. colspan .. &amp;quot;\&amp;quot;|&amp;#039;&amp;#039;&amp;#039;&amp;quot; .. make_link(year, show_link_year, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;) .. &amp;quot;&amp;#039;&amp;#039;&amp;#039;\n&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	addRow(&amp;quot;|}&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
&lt;br /&gt;
	local _month = frame.args.month&lt;br /&gt;
	local full_calendar = not (_month and _month ~= &amp;quot;&amp;quot;)&lt;br /&gt;
	local year = tonumber(applyDefaultValue(frame.args.year,os.date(&amp;quot;%Y&amp;quot;)))&lt;br /&gt;
	&lt;br /&gt;
	local title = applyDefaultValue(frame.args.title,&amp;quot;&amp;quot;)&lt;br /&gt;
	local col = applyDefaultValue(frame.args.col,4)&lt;br /&gt;
	local row = frame.args.row&lt;br /&gt;
	local float = &amp;quot;float&amp;quot; .. applyDefaultValue(frame.args.float,&amp;quot;left&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	if full_calendar then &lt;br /&gt;
		&lt;br /&gt;
		addRow(&amp;quot;{| class=\&amp;quot;&amp;quot; .. float .. &amp;quot;\&amp;quot; style=none\n&amp;quot;)&lt;br /&gt;
		addRow(&amp;quot;! colspan=&amp;quot; .. col .. &amp;quot; style=\&amp;quot;text-align:center; font-size:larger;\&amp;quot; | &amp;quot; .. title .. &amp;quot; &amp;quot; .. year .. &amp;quot;\n&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
		for i=1, 12 do &lt;br /&gt;
			if (i - 1) % col == 0 then addRow(&amp;quot;|- style=\&amp;quot;vertical-align: top;\&amp;quot;\n&amp;quot;) end&lt;br /&gt;
			addRow(&amp;quot;|\n&amp;quot;)&lt;br /&gt;
			_calendar(frame, i, true, &amp;quot;&amp;quot;)&lt;br /&gt;
			addRow(&amp;quot;\n&amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		addRow(&amp;quot;|}&amp;quot;)&lt;br /&gt;
	else &lt;br /&gt;
		_calendar(frame, getMonthNumber(frame.args.month), false, float)	&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--return &amp;quot;&amp;lt;nowiki&amp;gt;&amp;quot; .. table.concat(root) .. &amp;quot;&amp;lt;/nowiki&amp;gt; \n&amp;quot; .. &lt;br /&gt;
	return table.concat(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Legoktm</name></author>
	</entry>
</feed>