<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mbwiki.stairwaygames.work/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ACalendar_widget</id>
	<title>Module:Calendar widget - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mbwiki.stairwaygames.work/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ACalendar_widget"/>
	<link rel="alternate" type="text/html" href="https://mbwiki.stairwaygames.work/w/index.php?title=Module:Calendar_widget&amp;action=history"/>
	<updated>2026-04-07T16:26:21Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>https://mbwiki.stairwaygames.work/w/index.php?title=Module:Calendar_widget&amp;diff=5699&amp;oldid=prev</id>
		<title>Admin coral island: Created page with &quot;-- Module to create Calendar widget  -- require(&#039;Dev:No globals&#039;); local getArgs = require (&#039;Dev:Arguments&#039;).getArgs;  local lang_obj = mw.language.getContentLanguage();  local daysinmonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} local dayname = {&#039;Sunday&#039;, &#039;Monday&#039;, &#039;Tuesday&#039;, &#039;Wednesday&#039;, &#039;Thursday&#039;, &#039;Friday&#039;, &#039;Saturday&#039;} local dayabbr = {} for i, v in ipairs(dayname) do 	dayabbr[i] = v:sub(1, 2) end  local iso_dayname = {&#039;Monday&#039;, &#039;Tuesday&#039;, &#039;Wednesday&#039;,...&quot;</title>
		<link rel="alternate" type="text/html" href="https://mbwiki.stairwaygames.work/w/index.php?title=Module:Calendar_widget&amp;diff=5699&amp;oldid=prev"/>
		<updated>2023-08-04T02:57:57Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;--&lt;a href=&quot;/w/index.php?title=Module_to_create_Calendar_widget_--&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Module to create Calendar widget -- (page does not exist)&quot;&gt;Module to create Calendar widget  --&lt;/a&gt; require(&amp;#039;Dev:No globals&amp;#039;); local getArgs = require (&amp;#039;Dev:Arguments&amp;#039;).getArgs;  local lang_obj = mw.language.getContentLanguage();  local daysinmonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} local dayname = {&amp;#039;Sunday&amp;#039;, &amp;#039;Monday&amp;#039;, &amp;#039;Tuesday&amp;#039;, &amp;#039;Wednesday&amp;#039;, &amp;#039;Thursday&amp;#039;, &amp;#039;Friday&amp;#039;, &amp;#039;Saturday&amp;#039;} local dayabbr = {} for i, v in ipairs(dayname) do 	dayabbr[i] = v:sub(1, 2) end  local iso_dayname = {&amp;#039;Monday&amp;#039;, &amp;#039;Tuesday&amp;#039;, &amp;#039;Wednesday&amp;#039;,...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[[&lt;br /&gt;
Module to create Calendar widget&lt;br /&gt;
&lt;br /&gt;
--]]&lt;br /&gt;
require(&amp;#039;Dev:No globals&amp;#039;);&lt;br /&gt;
local getArgs = require (&amp;#039;Dev:Arguments&amp;#039;).getArgs;&lt;br /&gt;
&lt;br /&gt;
local lang_obj = mw.language.getContentLanguage();&lt;br /&gt;
&lt;br /&gt;
local daysinmonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}&lt;br /&gt;
local dayname = {&amp;#039;Sunday&amp;#039;, &amp;#039;Monday&amp;#039;, &amp;#039;Tuesday&amp;#039;, &amp;#039;Wednesday&amp;#039;, &amp;#039;Thursday&amp;#039;, &amp;#039;Friday&amp;#039;, &amp;#039;Saturday&amp;#039;}&lt;br /&gt;
local dayabbr = {}&lt;br /&gt;
for i, v in ipairs(dayname) do&lt;br /&gt;
	dayabbr[i] = v:sub(1, 2)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local iso_dayname = {&amp;#039;Monday&amp;#039;, &amp;#039;Tuesday&amp;#039;, &amp;#039;Wednesday&amp;#039;, &amp;#039;Thursday&amp;#039;, &amp;#039;Friday&amp;#039;, &amp;#039;Saturday&amp;#039;, &amp;#039;Sunday&amp;#039;}&lt;br /&gt;
local iso_dayabbr = {}&lt;br /&gt;
for i, v in ipairs(iso_dayname) do&lt;br /&gt;
	iso_dayabbr[i] = v:sub(1, 2)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local monthname = {}&lt;br /&gt;
local monthabbr = {}&lt;br /&gt;
if 0 == #monthname then&lt;br /&gt;
	for m = 1, 12 do&lt;br /&gt;
		monthname[m] = lang_obj:formatDate (&amp;quot;F&amp;quot;, &amp;#039;2019-&amp;#039; .. m);					-- table of long month names&lt;br /&gt;
		monthabbr[m] = lang_obj:formatDate (&amp;quot;M&amp;quot;, &amp;#039;2019-&amp;#039; .. m);					-- table of abbreviated month names&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S _ L E A P &amp;gt;----------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
returns true when &amp;lt;year&amp;gt; is a leapyear&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function is_leap (year)&lt;br /&gt;
	return &amp;#039;1&amp;#039; == lang_obj:formatDate (&amp;#039;L&amp;#039;, tostring(year));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; D A Y _ O F _ W E E K &amp;gt;--------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
returns 1 to 7; 1 == Sunday; 1 == Monday when iso true&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function day_of_week (year, month, day, iso)&lt;br /&gt;
	return&lt;br /&gt;
		iso and lang_obj:formatDate (&amp;#039;N&amp;#039;, year .. &amp;#039;-&amp;#039; .. month .. &amp;#039;-&amp;#039; .. day) or	-- ISO: 1 = monday&lt;br /&gt;
		lang_obj:formatDate (&amp;#039;w&amp;#039;, year .. &amp;#039;-&amp;#039; .. month .. &amp;#039;-&amp;#039; .. day) + 1;			-- 1 = sunday&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S _ S E T &amp;gt;------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Returns true if argument is set; false otherwise. Argument is &amp;#039;set&amp;#039; when it exists (not nil) or when it is not an empty string.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function is_set( var )&lt;br /&gt;
	return not (var == nil or var == &amp;#039;&amp;#039;);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[=[-------------------------&amp;lt; M A K E _ W I K I L I N K &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Makes a wikilink; when both link and display text is provided, returns a wikilink in the form [[L|D]]; if only&lt;br /&gt;
link is provided, returns a wikilink in the form [[L]]; if neither are provided or link is omitted, returns an&lt;br /&gt;
empty string.&lt;br /&gt;
&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
local function make_wikilink (link, display)&lt;br /&gt;
	if is_set (link) then&lt;br /&gt;
		if is_set (display) then&lt;br /&gt;
			return table.concat ({&amp;#039;[[&amp;#039;, link, &amp;#039;|&amp;#039;, display, &amp;#039;]]&amp;#039;});&lt;br /&gt;
		else&lt;br /&gt;
			return table.concat ({&amp;#039;[[&amp;#039;, link, &amp;#039;]]&amp;#039;});&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;&amp;#039;;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; G E T _ D I S P L A Y _ Y E A R &amp;gt;----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
returns year from props with prefixed and suffixed wikilink if appropriate; this function used for both yearly&lt;br /&gt;
and stand-alone calendars&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function get_display_year (props)&lt;br /&gt;
	local year_text = props.year;&lt;br /&gt;
	local lk_prefix = props.lk_pref_y or props.lk_pref;&lt;br /&gt;
	local lk_suffix = props.lk_suff_y or props.lk_suff;&lt;br /&gt;
&lt;br /&gt;
	if props.lk_y then															-- if to be linked&lt;br /&gt;
		if lk_prefix or lk_suffix then											-- when prefix or suffix, [[prefix .. link .. suffix|label]]&lt;br /&gt;
			year_text = make_wikilink ((lk_prefix or &amp;#039;&amp;#039;) .. year_text .. (lk_suffix or &amp;#039;&amp;#039;), year_text);&lt;br /&gt;
		else&lt;br /&gt;
			year_text = make_wikilink (year_text);								-- just year&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return year_text;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; G E T _ D I S P L A Y _ M O N T H &amp;gt;--------------------------------------------&lt;br /&gt;
&lt;br /&gt;
returns month from argument or props with wikilink, prefix, suffix ...&lt;br /&gt;
&lt;br /&gt;
argument mnum is nil when rendering stand-alone calendar&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function get_display_month (mnum, props)&lt;br /&gt;
	local month_text = mnum or props.month_num;&lt;br /&gt;
	month_text = monthname[month_text];&lt;br /&gt;
&lt;br /&gt;
	local lk_prefix = props.lk_pref_m or props.lk_pref;&lt;br /&gt;
	local lk_suffix = props.lk_suff_m or props.lk_suff;&lt;br /&gt;
&lt;br /&gt;
	if props[&amp;#039;lk_m&amp;amp;y&amp;#039;] then														-- stand-alone month calendars only&lt;br /&gt;
		month_text = month_text .. &amp;#039; &amp;#039; .. props.year;							-- composite month and year link&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if props.lk_m or props[&amp;#039;lk_m&amp;amp;y&amp;#039;] then&lt;br /&gt;
		if lk_prefix or lk_suffix then											-- when prefix or suffix, [[prefix .. link .. suffix|label]]&lt;br /&gt;
			month_text = make_wikilink ((lk_prefix or &amp;#039;&amp;#039;) .. month_text .. (lk_suffix or &amp;#039;&amp;#039;), month_text);&lt;br /&gt;
		else&lt;br /&gt;
			month_text = make_wikilink (month_text);							-- just month name or composite month/year&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return month_text;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; G E T _ D I S P L A Y _ D A Y &amp;gt;------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
returns day with wikilink (month and day), link prefix, link suffix ... (text doesn&amp;#039;t get prefix / suffix)&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function get_display_day (day_text, mnum, props)&lt;br /&gt;
	local lk_prefix = props.lk_pref_d or props.lk_pref;&lt;br /&gt;
	local lk_suffix = props.lk_suff_d or props.lk_suff;&lt;br /&gt;
&lt;br /&gt;
	if props.lk_d then&lt;br /&gt;
		local link_text = (lk_prefix or &amp;#039;&amp;#039;) .. monthname[mnum] .. &amp;#039; &amp;#039; .. day_text .. (lk_suffix or &amp;#039;&amp;#039;);&lt;br /&gt;
		day_text = make_wikilink (link_text, day_text);&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return day_text;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; R E P E A T _ T A G S &amp;gt;--------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
create &amp;lt;tag&amp;gt; ... &amp;lt;/tag&amp;gt;... string to be included into another tag as :wikitext(...)&lt;br /&gt;
&lt;br /&gt;
items is a table of items, each of which will be wrapped in &amp;lt;tag&amp;gt;...&amp;lt;/tag&amp;gt;&lt;br /&gt;
options is a table of optional class, css, and attribute settings for these tags&lt;br /&gt;
	options.attr is a table of attribute / value pairs: {[&amp;#039;attribute&amp;#039;] = &amp;#039;value&amp;#039;, ...}&lt;br /&gt;
	options.css is a table of attribute / value pairs: {[&amp;#039;attribute&amp;#039;] = &amp;#039;value&amp;#039;, ...}&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function repeat_tags (tag, items, options)&lt;br /&gt;
	local tags = {};															-- table of &amp;lt;tag&amp;gt;...&amp;lt;/tag&amp;gt; tag strings&lt;br /&gt;
	local opt_attr = options.attr or {};										-- if options not supplied, use empty table&lt;br /&gt;
	local css_opts = options.css or {};&lt;br /&gt;
	&lt;br /&gt;
	for i, item in ipairs (items) do&lt;br /&gt;
		local repeat_tag = mw.html.create (tag);								-- new td object&lt;br /&gt;
		repeat_tag&lt;br /&gt;
			:addClass (options.class)&lt;br /&gt;
			:attr (opt_attr)&lt;br /&gt;
			:css (css_opts)&lt;br /&gt;
			:wikitext (item)													-- the item to be wrapped in &amp;lt;tag&amp;gt;...&amp;lt;/tag&amp;gt;&lt;br /&gt;
			:done()																-- close &amp;lt;td&amp;gt;&lt;br /&gt;
		table.insert (tags, tostring (repeat_tag));								-- make a string of this object&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return table.concat (tags);													-- concatenate them all together&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; G E T _ R O W _ D A T E S &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
gets a week (row) of calendar dates each in its own &amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt;; inserts iso week number &amp;lt;td&amp;gt; tag ahead of column 1&lt;br /&gt;
when props.iso_wk true.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function get_row_dates (firstday, mnum, row, props)&lt;br /&gt;
	local options = {[&amp;#039;class&amp;#039;]=&amp;#039;mcal&amp;#039;};											-- table of otions for these td tags&lt;br /&gt;
	local td_items = {};														-- table of &amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt; tag strings&lt;br /&gt;
	local result = {};&lt;br /&gt;
	local hilite;&lt;br /&gt;
	&lt;br /&gt;
	for col = 1, 7 do&lt;br /&gt;
		local dom = 7 * (row-1) + col + 1 - firstday							-- calculate day of month for row/col position&lt;br /&gt;
		local day;&lt;br /&gt;
		&lt;br /&gt;
		if props.iso_wk and 1 == col then										-- when column 1, insert iso week number &amp;lt;td&amp;gt; ahead of first &amp;#039;dom&amp;#039;&lt;br /&gt;
			local iso_wk = lang_obj:formatDate (&amp;#039;W&amp;#039;, props.year .. &amp;#039;-&amp;#039; .. mnum .. &amp;#039;-&amp;#039; .. ((1 &amp;gt; dom) and 1 or dom));&lt;br /&gt;
			local css_opts = props.wknum_color and {[&amp;#039;background&amp;#039;] = props.wknum_color} or {};&lt;br /&gt;
			&lt;br /&gt;
			table.insert (result, repeat_tags (&amp;#039;td&amp;#039;, {iso_wk}, {[&amp;#039;class&amp;#039;]=&amp;#039;mcal_iso&amp;#039;, [&amp;#039;css&amp;#039;] = css_opts}));&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if dom &amp;lt; 1 or dom &amp;gt; daysinmonth[mnum] then&lt;br /&gt;
			day = &amp;quot;&amp;amp;nbsp;&amp;quot;														-- before or after month, blank cell&lt;br /&gt;
		else&lt;br /&gt;
			day = get_display_day (dom, mnum, props);							-- make wikilinks from month and day if required&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if props.today then														-- highlight today&amp;#039;s date when displayed&lt;br /&gt;
			if (props.year == props.this_ynum) and (mnum == props.this_mnum) and  (dom == props.this_dnum) then&lt;br /&gt;
				hilite = col;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		table.insert (td_items, day);&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for i, td_item in ipairs (td_items) do&lt;br /&gt;
		if i == hilite then&lt;br /&gt;
			table.insert (result, repeat_tags (&amp;#039;td&amp;#039;, {td_item}, {&lt;br /&gt;
				[&amp;#039;class&amp;#039;]=&amp;#039;mcal today&amp;#039;,&lt;br /&gt;
				[&amp;#039;css&amp;#039;] = props.today_color and&lt;br /&gt;
					{[&amp;#039;background-color&amp;#039;] = props.today_color}&lt;br /&gt;
					or {[&amp;#039;outline&amp;#039;] = &amp;#039;1px solid&amp;#039;}&lt;br /&gt;
			}));&lt;br /&gt;
		else&lt;br /&gt;
			table.insert (result, repeat_tags (&amp;#039;td&amp;#039;, {td_item}, options));&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return table.concat (result);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; G E T _ W E E K _ D A Y _ H D R &amp;gt;----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
create header row of day-of-week abbreviations with title attributes&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function get_week_day_hdr (props)&lt;br /&gt;
	local headers = {};&lt;br /&gt;
	local css_opts = props.week_color and {[&amp;#039;background&amp;#039;] = props.week_color} or {}&lt;br /&gt;
&lt;br /&gt;
	if props.iso_wk then&lt;br /&gt;
		table.insert (headers, repeat_tags (&amp;#039;th&amp;#039;, {&amp;#039;Wk&amp;#039;}, {[&amp;#039;class&amp;#039;]=&amp;#039;mcal&amp;#039;, [&amp;#039;attr&amp;#039;]={[&amp;#039;title&amp;#039;] = &amp;#039;ISO week number&amp;#039;}, [&amp;#039;css&amp;#039;] = css_opts}));			-- iso week header&lt;br /&gt;
		for i, abbr in ipairs (iso_dayabbr) do&lt;br /&gt;
			table.insert (headers, repeat_tags (&amp;#039;th&amp;#039;, {iso_dayabbr[i]}, {[&amp;#039;class&amp;#039;]=&amp;#039;mcal&amp;#039;, [&amp;#039;attr&amp;#039;]={[&amp;#039;title&amp;#039;] = iso_dayname[i]}, [&amp;#039;css&amp;#039;] = css_opts}));&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		for i, abbr in ipairs (dayabbr) do&lt;br /&gt;
			table.insert (headers, repeat_tags (&amp;#039;th&amp;#039;, {dayabbr[i]}, {[&amp;#039;class&amp;#039;]=&amp;#039;mcal&amp;#039;, [&amp;#039;attr&amp;#039;]={[&amp;#039;title&amp;#039;] = dayname[i]}, [&amp;#039;css&amp;#039;] = css_opts}));&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return table.concat (headers);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; G E T _ M O N T H _ H D R &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
create main header row for month calendars, with or without year and with or without previous / next links&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function get_month_hdr (mnum, props)&lt;br /&gt;
	local result = {};&lt;br /&gt;
	local prev = &amp;#039;&amp;#039;;&lt;br /&gt;
	local next = &amp;#039;&amp;#039;;&lt;br /&gt;
	local hdr_year = &amp;#039;&amp;#039;;&lt;br /&gt;
	local col_span = (props.iso_wk and 8) or 7;									-- assume no prev/next&lt;br /&gt;
&lt;br /&gt;
	if not props.hide_year and props.month_num then								-- props.month_num has value only for stand-alone month calendars&lt;br /&gt;
		hdr_year = get_display_year (props);									-- if to be shown, add wikilink, etc when required&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if props.prevnext then&lt;br /&gt;
		prev = monthname[(0 &amp;lt; mnum-1) and mnum-1 or 12];&lt;br /&gt;
		next = monthname[(13 &amp;gt; mnum+1) and mnum+1 or 1];&lt;br /&gt;
&lt;br /&gt;
		if is_set (hdr_year) then&lt;br /&gt;
			prev = prev .. &amp;#039; &amp;#039; .. ((0 &amp;lt; mnum-1) and hdr_year or hdr_year-1);	-- january-1 = december previous year&lt;br /&gt;
			next = next .. &amp;#039; &amp;#039; .. ((13 &amp;gt; mnum+1) and hdr_year or hdr_year+1);	-- december+1 = january next year&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		local link_text = (props.lk_pref_mprev or &amp;#039;&amp;#039;) .. prev .. (props.lk_suff_mprev or &amp;#039;&amp;#039;)&lt;br /&gt;
		prev = make_wikilink (link_text, &amp;#039;&amp;lt;&amp;lt;&amp;#039;);&lt;br /&gt;
		&lt;br /&gt;
		link_text = (props.lk_pref_mnext or &amp;#039;&amp;#039;) .. next .. (props.lk_suff_mnext or &amp;#039;&amp;#039;)&lt;br /&gt;
		next = make_wikilink (link_text, &amp;#039;&amp;gt;&amp;gt;&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		table.insert (result, repeat_tags (&amp;#039;td&amp;#039;, {prev}, {[&amp;#039;css&amp;#039;]={[&amp;#039;text-align&amp;#039;]=&amp;#039;center&amp;#039;}}));	-- insert prev now, insert next later&lt;br /&gt;
		col_span = col_span - 2;												-- narrow the month year &amp;lt;th&amp;gt;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if props[&amp;#039;lk_m&amp;amp;y&amp;#039;] then														-- for composite links&lt;br /&gt;
		table.insert (result, repeat_tags (&amp;#039;th&amp;#039;, {get_display_month (mnum, props)}, {[&amp;#039;class&amp;#039;]=&amp;#039;mcal&amp;#039;, [&amp;#039;attr&amp;#039;]={[&amp;#039;colspan&amp;#039;]=col_span}}));&lt;br /&gt;
	else&lt;br /&gt;
		table.insert (result, repeat_tags (&amp;#039;th&amp;#039;, {get_display_month (mnum, props) .. &amp;#039; &amp;#039; .. hdr_year}, {[&amp;#039;class&amp;#039;]=&amp;#039;mcal&amp;#039;, [&amp;#039;attr&amp;#039;]={[&amp;#039;colspan&amp;#039;]=col_span}}));&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if props.prevnext then&lt;br /&gt;
		table.insert (result, repeat_tags (&amp;#039;td&amp;#039;, {next}, {[&amp;#039;css&amp;#039;]={[&amp;#039;text-align&amp;#039;]=&amp;#039;center&amp;#039;}}));&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return table.concat (result);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; D I S P L A Y M O N T H &amp;gt;------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
generate the html to display a month calendar&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function display_month (mnum, props)&lt;br /&gt;
	if props.leap then daysinmonth[2] = 29 end&lt;br /&gt;
	local firstday = day_of_week (props.year, mnum, 1, props.iso);				-- get first day number of the first day of the month; 1 == Sunday&lt;br /&gt;
&lt;br /&gt;
	local table_css = {};&lt;br /&gt;
	if props.m_center then&lt;br /&gt;
		table_css = {															-- TODO: make a separate class in styles.css?&lt;br /&gt;
			[&amp;#039;clear&amp;#039;] = &amp;#039;both&amp;#039;,&lt;br /&gt;
			[&amp;#039;margin-left&amp;#039;] = &amp;#039;auto&amp;#039;,&lt;br /&gt;
			[&amp;#039;margin-right&amp;#039;] = &amp;#039;auto&amp;#039;,&lt;br /&gt;
			}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if props.month_num then														-- month_num only set when doing stand-alone month calendars&lt;br /&gt;
		table_css.border = &amp;#039;1px solid grey&amp;#039;;									-- put this is styles.css as a separate class?&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local month_cal = mw.html.create (&amp;#039;table&amp;#039;);&lt;br /&gt;
	month_cal&lt;br /&gt;
		:addClass (&amp;#039;calendar-widget mcal&amp;#039; .. (props.m_float_r and &amp;#039; floatright&amp;#039; or &amp;#039;&amp;#039;))			-- float table right; leading space required to separate classes&lt;br /&gt;
		:css (table_css)&lt;br /&gt;
		:tag (&amp;#039;tr&amp;#039;)																-- for month name header&lt;br /&gt;
			:addClass (&amp;#039;mcalhdr&amp;#039;)&lt;br /&gt;
			:css (props.title_color and {[&amp;#039;background&amp;#039;] = props.title_color} or {})&lt;br /&gt;
			:wikitext (get_month_hdr (mnum, props))&lt;br /&gt;
			:done()																-- close &amp;lt;tr&amp;gt;&lt;br /&gt;
		:tag (&amp;#039;tr&amp;#039;)																-- for weekday header&lt;br /&gt;
			:addClass (&amp;#039;mcalhdr&amp;#039;)&lt;br /&gt;
			:wikitext (get_week_day_hdr (props))&lt;br /&gt;
			:done()																-- close &amp;lt;tr&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	local numrows = math.ceil ((firstday + daysinmonth[mnum] - 1) / 7);			-- calculate number of rows needed for this calendar&lt;br /&gt;
	for row = 1, numrows do&lt;br /&gt;
		month_cal&lt;br /&gt;
			:tag (&amp;#039;tr&amp;#039;)															-- for this week&lt;br /&gt;
			:addClass (&amp;#039;mcal&amp;#039;)&lt;br /&gt;
			:wikitext (get_row_dates (firstday, mnum, row, props));				-- get dates for this week&lt;br /&gt;
	end&lt;br /&gt;
	month_cal:done()															-- close &amp;lt;table&amp;gt;&lt;br /&gt;
--mw.log (tostring (month_cal))&lt;br /&gt;
	return tostring (month_cal)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; G E T _ R O W _ C A L E N D A R S &amp;gt;--------------------------------------------&lt;br /&gt;
&lt;br /&gt;
create &amp;lt;td&amp;gt; ... &amp;lt;/td&amp;gt;... string to be included into &amp;lt;tr&amp;gt;...&amp;lt;/tr&amp;gt; as :wikitext(...)&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function get_row_calendars (cols, row_num, props)&lt;br /&gt;
	local mnum;																	-- month number&lt;br /&gt;
	local options = {[&amp;#039;class&amp;#039;]=&amp;#039;ycal&amp;#039;};											-- table of otions for these td tags&lt;br /&gt;
	local td_items = {};														-- table of &amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt; tag strings&lt;br /&gt;
	&lt;br /&gt;
	for col_num = 1, cols do&lt;br /&gt;
		mnum = cols * (row_num - 1) + col_num									-- calculate month number from row and column values&lt;br /&gt;
		if mnum &amp;lt; 13 then														-- some sort of error return if ever 13+?&lt;br /&gt;
			table.insert (td_items, display_month (mnum, props));				-- get a calendar for month number mnum&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return repeat_tags (&amp;#039;td&amp;#039;, td_items, options)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; G E T _ Y E A R _ H E A D E R &amp;gt;------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
create html header for yearly calendar;&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function get_year_header (props)&lt;br /&gt;
	local css_opts = {};&lt;br /&gt;
	&lt;br /&gt;
	if props.hide_year then														-- for accesibility, when |hide_year=yes&lt;br /&gt;
		css_opts[&amp;#039;display&amp;#039;] = &amp;#039;none&amp;#039;;											-- use css to hide the year header (but not when |title= has a value)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local header = mw.html.create(&amp;#039;tr&amp;#039;);&lt;br /&gt;
		header&lt;br /&gt;
			:addClass (&amp;#039;ycalhdr&amp;#039;)&lt;br /&gt;
			:tag (&amp;#039;th&amp;#039;)&lt;br /&gt;
				:addClass (&amp;#039;ycal&amp;#039;)&lt;br /&gt;
				:css(css_opts)&lt;br /&gt;
				:attr (&amp;#039;colspan&amp;#039;, props.cols)&lt;br /&gt;
				:wikitext (props.title or get_display_year (props));				-- &lt;br /&gt;
	return tostring (header)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; D I S P L A Y _ Y E A R &amp;gt;------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
create a twelve-month calendar; default is 4 columns × 3 rows&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function display_year(props)&lt;br /&gt;
	local year = props.year&lt;br /&gt;
	local cols = props.cols&lt;br /&gt;
	local rows = math.ceil (12 / cols);&lt;br /&gt;
	local mnum;&lt;br /&gt;
	&lt;br /&gt;
	local year_cal = mw.html.create(&amp;#039;table&amp;#039;);&lt;br /&gt;
	year_cal&lt;br /&gt;
		:addClass (&amp;#039;calendar-widget ycal&amp;#039; .. (props.y_float_r and &amp;#039; floatright&amp;#039; or &amp;#039;&amp;#039;))			-- float table right; leading space required to separate classes&lt;br /&gt;
		:css (props.y_center and {[&amp;#039;clear&amp;#039;] = &amp;#039;both&amp;#039;, [&amp;#039;margin-left&amp;#039;] = &amp;#039;auto&amp;#039;, [&amp;#039;margin-right&amp;#039;] = &amp;#039;auto&amp;#039;} or {})	-- centers table; TODO: add to styles.css?&lt;br /&gt;
		:wikitext (get_year_header(props));										-- get year header if not hidden&lt;br /&gt;
&lt;br /&gt;
	for row_num = 1, rows do&lt;br /&gt;
		year_cal&lt;br /&gt;
			:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:addClass (&amp;#039;ycal&amp;#039;)&lt;br /&gt;
			:wikitext(get_row_calendars (cols, row_num, props))					-- get calendars for this row each wrapped in &amp;lt;td&amp;gt;...&amp;lt;/td&amp;gt; tags as wikitext for this &amp;lt;tr&amp;gt;...&amp;lt;/tr&amp;gt;&lt;br /&gt;
	end&lt;br /&gt;
	year_cal:done()																-- close &amp;lt;table&amp;gt;&lt;br /&gt;
--mw.log (tostring (year_cal))&lt;br /&gt;
	return tostring (year_cal)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; _ C A L E N D A R &amp;gt;------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
module entry point.  args is the parent frame args table&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function _calendar (args)&lt;br /&gt;
	local props = {};															-- separate calendar properties table to preserve arguments as originally provided&lt;br /&gt;
	local this_year_num = tonumber (lang_obj:formatDate (&amp;#039;Y&amp;#039;));&lt;br /&gt;
	local this_month_num = tonumber (lang_obj:formatDate (&amp;#039;n&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
	props.this_ynum = this_year_num;											-- for highlighting &amp;#039;today&amp;#039; in a calendar display&lt;br /&gt;
	props.this_mnum = this_month_num;&lt;br /&gt;
	props.this_dnum = tonumber (lang_obj:formatDate (&amp;#039;j&amp;#039;));&lt;br /&gt;
&lt;br /&gt;
	props.year = args.year and tonumber(args.year) or this_year_num;&lt;br /&gt;
	if (1583 &amp;gt; props.year) or (1582 == props.year and 10 &amp;gt; props.month_num) then	-- gregorian calendar only (1583 for yearly calendar because gregorian started in October of 1582)&lt;br /&gt;
		props.year = this_year_num;												-- so use this year&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	props.leap = is_leap (props.year)&lt;br /&gt;
	&lt;br /&gt;
	props.title = args.title;													-- year calendar title&lt;br /&gt;
&lt;br /&gt;
	props.cols = tonumber(args.cols or 4);										-- yearly calendar number of columns&lt;br /&gt;
	if 1 &amp;gt; props.cols or 12 &amp;lt; props.cols then&lt;br /&gt;
		props.cols = 4;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if args.month then&lt;br /&gt;
		local mnum = tonumber(args.month)&lt;br /&gt;
		if not mnum then														-- month provided as some sort of text string&lt;br /&gt;
			if args.month == &amp;quot;current&amp;quot; then&lt;br /&gt;
				props.month_num = this_month_num&lt;br /&gt;
				props.year = this_year_num&lt;br /&gt;
			elseif args.month == &amp;quot;last&amp;quot; then&lt;br /&gt;
				mnum = this_month_num - 1&lt;br /&gt;
				if mnum == 0 then&lt;br /&gt;
					props.month_num = 12										-- december last year&lt;br /&gt;
					props.year = this_year_num - 1								-- last year&lt;br /&gt;
				else&lt;br /&gt;
					props.month_num = mnum;										-- previous month&lt;br /&gt;
				end&lt;br /&gt;
			elseif args.month == &amp;quot;next&amp;quot; then&lt;br /&gt;
				mnum = this_month_num + 1&lt;br /&gt;
				if mnum == 13 then&lt;br /&gt;
					props.month_num = 1											-- january next year&lt;br /&gt;
					props.year = this_year_num + 1								-- next year&lt;br /&gt;
				else&lt;br /&gt;
					props.month_num = mnum;										-- next month&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				local good&lt;br /&gt;
				good, props.month_num = pcall (lang_obj.formatDate, lang_obj, &amp;#039;n&amp;#039;, args.month);&lt;br /&gt;
				&lt;br /&gt;
				if not good then&lt;br /&gt;
					props.month_num = this_month_num&lt;br /&gt;
				else&lt;br /&gt;
					props.month_num = tonumber (props.month_num)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			props.month_num =  (13 &amp;gt; mnum and 0 &amp;lt; mnum) and mnum or this_month_num;	-- month provided as a number&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		props.prevnext = &amp;#039;yes&amp;#039; == (args.prevnext and args.prevnext:lower());	-- show previous / next links in month header only in single month calendars&lt;br /&gt;
&lt;br /&gt;
		if args.lk_pref_mprev or args.lk_suff_mprev then&lt;br /&gt;
			props.lk_pref_mprev = args.lk_pref_mprev;&lt;br /&gt;
			props.lk_suff_mprev = args.lk_suff_mprev;&lt;br /&gt;
			props.prevnext = true;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if args.lk_pref_mnext or args.lk_suff_mnext then&lt;br /&gt;
			props.lk_pref_mnext = args.lk_pref_mnext;&lt;br /&gt;
			props.lk_suff_mnext = args.lk_suff_mnext;&lt;br /&gt;
			props.prevnext = true;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		props.m_center = &amp;#039;center&amp;#039; == (args.float and args.float:lower());		-- month calendar positions; default is left&lt;br /&gt;
		props.m_float_r = &amp;#039;right&amp;#039; == (args.float and args.float:lower());&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	props.iso_wk = &amp;#039;yes&amp;#039; == (args.iso_wk and args.iso_wk:lower());				-- show iso format with week numbers when true&lt;br /&gt;
	props.iso = &amp;#039;yes&amp;#039; == (args.iso and args.iso:lower()) or props.iso_wk;		-- iso format without week number unless props.iso_wk true; always true when props.iso_wk true&lt;br /&gt;
	&lt;br /&gt;
	args.lk = args.lk and args.lk:lower();&lt;br /&gt;
	if args.lk and ({[&amp;#039;yes&amp;#039;]=1, [&amp;#039;m&amp;amp;y&amp;#039;]=1, [&amp;#039;dm&amp;amp;y&amp;#039;]=1, [&amp;#039;dm&amp;#039;]=1, [&amp;#039;my&amp;#039;]=1, [&amp;#039;dy&amp;#039;]=1, [&amp;#039;d&amp;#039;]=1, [&amp;#039;m&amp;#039;]=1, [&amp;#039;y&amp;#039;]=1})[args.lk] then	-- if valid keywords&lt;br /&gt;
		if &amp;#039;yes&amp;#039; == args.lk then												-- all date components are individually linked&lt;br /&gt;
			props.lk_d = true;&lt;br /&gt;
			props.lk_m = true;&lt;br /&gt;
			props.lk_y = true;&lt;br /&gt;
		elseif &amp;#039;m&amp;amp;y&amp;#039; == args.lk and props.month_num then						-- stand-alone month calendars only; month and year as a single composite link&lt;br /&gt;
			props[&amp;#039;lk_m&amp;amp;y&amp;#039;] = true;&lt;br /&gt;
		elseif &amp;#039;dm&amp;amp;y&amp;#039; == args.lk and props.month_num then						-- stand-alone month calendars only; month and year as a single composite link&lt;br /&gt;
			props[&amp;#039;lk_m&amp;amp;y&amp;#039;] = true;&lt;br /&gt;
			props.lk_d = true;&lt;br /&gt;
		else&lt;br /&gt;
			props.lk_d = &amp;#039;d&amp;#039; == args.lk:match (&amp;#039;d&amp;#039;);							-- decode the keywords to know which components are to be linked&lt;br /&gt;
			props.lk_m = &amp;#039;m&amp;#039; == args.lk:match (&amp;#039;m&amp;#039;);&lt;br /&gt;
			props.lk_y = &amp;#039;y&amp;#039; == args.lk:match (&amp;#039;y&amp;#039;);&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not (props.title or props.lk_y or props[&amp;#039;lk_m&amp;amp;y&amp;#039;]) then&lt;br /&gt;
		props.hide_year = (&amp;#039;yes&amp;#039; == args.hide_year) or (&amp;#039;off&amp;#039; == args.show_year);	-- year normally displayed; this hides year display but not when linked or replaced with title&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	props.lk_pref = args.lk_pref;												-- prefix for all links except previous and next&lt;br /&gt;
	props.lk_suff = args.lk_suff;												-- suffix for all links except previous and next&lt;br /&gt;
&lt;br /&gt;
	for _, v in ipairs ({&amp;#039;y&amp;#039;, &amp;#039;m&amp;#039;, &amp;#039;d&amp;#039;}) do										-- loop through calendar parts for link prefix and suffix parameters&lt;br /&gt;
		props[&amp;#039;lk_pref_&amp;#039; .. v] = args[&amp;#039;lk_pref_&amp;#039; .. v] or args.lk_pref;			-- set prefix values&lt;br /&gt;
		props[&amp;#039;lk_suff_&amp;#039; .. v] = args[&amp;#039;lk_suff_&amp;#039; .. v] or args.lk_suff;			-- set suffix values&lt;br /&gt;
		if props[&amp;#039;lk_pref_&amp;#039; .. v] or props[&amp;#039;lk_suff_&amp;#039; .. v] then				-- set the calendar link flags as necessary&lt;br /&gt;
			props[&amp;#039;lk_&amp;#039; .. v] = true;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not (props.m_center or props.m_float_r) then								-- these may aleady be set for stand-alone month calendar&lt;br /&gt;
		props.y_center = &amp;#039;center&amp;#039; == (args.float and args.float:lower());&lt;br /&gt;
		props.y_float_r = &amp;#039;right&amp;#039; == (args.float and args.float:lower());&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	props.today = &amp;#039;yes&amp;#039; == (args.show_today and args.show_today:lower());		-- highlight today&amp;#039;s date in calendars where it is displayed&lt;br /&gt;
	props.today_color = args.today_color or args.today_colour;&lt;br /&gt;
	&lt;br /&gt;
	props.title_color = args.title_color or args.title_colour or args.color or args.colour;&lt;br /&gt;
	props.week_color = args.week_color or args.week_colour or args.color or args.colour;&lt;br /&gt;
	props.wknum_color = args.wknum_color or args.wknum_colour;&lt;br /&gt;
	&lt;br /&gt;
-- TODO: add all other args{} from template or invoke to props{} modified as appropriate&lt;br /&gt;
&lt;br /&gt;
	if props.month_num then														-- set only when rendering stand-alone month calendar&lt;br /&gt;
		return display_month (props.month_num, props);&lt;br /&gt;
	else&lt;br /&gt;
		return display_year (props);&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; C A L E N D A R &amp;gt;--------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
template entry point.  All parameters are template parameters; there are no special invoke parameters&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function calendar (frame)&lt;br /&gt;
	local args=getArgs (frame);&lt;br /&gt;
	return _calendar (args);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E X P O R T E D   F U N C T I O N S &amp;gt;------------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	calendar = calendar,&lt;br /&gt;
	}&lt;/div&gt;</summary>
		<author><name>Admin coral island</name></author>
	</entry>
</feed>