<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://moasspedia.org/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ACalendar_date</id>
	<title>Module:Calendar date - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://moasspedia.org/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ACalendar_date"/>
	<link rel="alternate" type="text/html" href="https://moasspedia.org/w/index.php?title=Module:Calendar_date&amp;action=history"/>
	<updated>2026-04-14T13:21:42Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.37.2</generator>
	<entry>
		<id>https://moasspedia.org/w/index.php?title=Module:Calendar_date&amp;diff=728&amp;oldid=prev</id>
		<title>Wikipedia&gt;Coffeeandcrumbs: ce</title>
		<link rel="alternate" type="text/html" href="https://moasspedia.org/w/index.php?title=Module:Calendar_date&amp;diff=728&amp;oldid=prev"/>
		<updated>2020-09-17T03:05:18Z</updated>

		<summary type="html">&lt;p&gt;ce&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--[[ &lt;br /&gt;
&lt;br /&gt;
Display Gregorian date of a holiday that moves year to year. Date data can be obtained from multiple sources as configured in Module:Calendar date/events&lt;br /&gt;
&lt;br /&gt;
  &amp;quot;localfile&amp;quot; = local data file (eg. https://en.wikipedia.org/wiki/Module:Calendar_date/localfiles/Hanukkah)&lt;br /&gt;
  &amp;quot;calculator&amp;quot; = user-supplied date calculator &lt;br /&gt;
  &amp;quot;wikidata&amp;quot; = &amp;lt;tbd&amp;gt; for holidays with their own date entity page such as https://www.wikidata.org/wiki/Q51224536&lt;br /&gt;
               &lt;br /&gt;
 ]]&lt;br /&gt;
&lt;br /&gt;
require(&amp;#039;Module:No globals&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
local cfg						-- Data structure from ~/events&lt;br /&gt;
local eventdata					-- Data structure from ~/localfiles/&amp;lt;holiday name&amp;gt;&lt;br /&gt;
local track = {}				-- Tracking category container&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; inlineError &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
     Critical error. Render output completely in red. Add to tracking category.&lt;br /&gt;
&lt;br /&gt;
 ]]&lt;br /&gt;
&lt;br /&gt;
local function inlineError(arg, msg, tname)&lt;br /&gt;
&lt;br /&gt;
	track[&amp;quot;Category:Calendar date template errors&amp;quot;] = 1&lt;br /&gt;
	return &amp;#039;&amp;lt;span style=&amp;quot;font-size:100%&amp;quot; class=&amp;quot;error citation-comment&amp;quot;&amp;gt;Error in {{&amp;#039; .. tname .. &amp;#039;}} - Check &amp;lt;code style=&amp;quot;color:inherit; border:inherit; padding:inherit;&amp;quot;&amp;gt;&amp;amp;#124;&amp;#039; .. arg .. &amp;#039;=&amp;lt;/code&amp;gt;  &amp;#039; .. msg .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; trimArg &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
	 trimArg returns nil if arg is &amp;quot;&amp;quot; while trimArg2 returns &amp;#039;true&amp;#039; if arg is &amp;quot;&amp;quot; &lt;br /&gt;
	 trimArg2 is for args that might accept an empty value, as an on/off switch like nolink=&lt;br /&gt;
&lt;br /&gt;
 ]]&lt;br /&gt;
&lt;br /&gt;
local function trimArg(arg)&lt;br /&gt;
	if arg == &amp;quot;&amp;quot; or arg == nil then&lt;br /&gt;
		return nil&lt;br /&gt;
	else&lt;br /&gt;
		return mw.text.trim(arg)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
local function trimArg2(arg)&lt;br /&gt;
	if arg == nil then&lt;br /&gt;
		return nil&lt;br /&gt;
	else&lt;br /&gt;
		return mw.text.trim(arg)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; tableLength &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
	Given a 1-D table, return number of elements&lt;br /&gt;
&lt;br /&gt;
  ]]&lt;br /&gt;
&lt;br /&gt;
local function tableLength(T)&lt;br /&gt;
	local count = 0&lt;br /&gt;
	for _ in pairs(T) do count = count + 1 end&lt;br /&gt;
	return count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[-------------------------&amp;lt; make_wikilink &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, no_link)&lt;br /&gt;
	if nil == no_link then&lt;br /&gt;
		if link and (&amp;#039;&amp;#039; ~= link) then&lt;br /&gt;
			if display and (&amp;#039;&amp;#039; ~= 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;
		end&lt;br /&gt;
	else																		-- no_link&lt;br /&gt;
		if display and (&amp;#039;&amp;#039; ~= display) then										-- if there is display text&lt;br /&gt;
			return display;														-- return that&lt;br /&gt;
		else&lt;br /&gt;
			return link or &amp;#039;&amp;#039;;													-- return the target article name or empty string&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; createTracking &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
	Return data in track[] ie. tracking categories&lt;br /&gt;
&lt;br /&gt;
  ]]&lt;br /&gt;
&lt;br /&gt;
local function createTracking()&lt;br /&gt;
&lt;br /&gt;
	local out = {};&lt;br /&gt;
	if tableLength(track) &amp;gt; 0 then&lt;br /&gt;
		for key, _ in pairs(track) do											-- loop through table&lt;br /&gt;
			table.insert (out, make_wikilink (key))								-- and convert category names to links&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat (out)													-- concat into one big string; empty string if table is empty&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; isValidDate &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
	Returns true if date is after 31 December 1899 , not after 2100, and represents a valid date &lt;br /&gt;
	(29 February 2017 is not a valid date).  Applies Gregorian leapyear rules. All arguments are required.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function isValidDate (year, month, day)&lt;br /&gt;
&lt;br /&gt;
	local days_in_month = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}&lt;br /&gt;
	local month_length&lt;br /&gt;
	local y, m, d&lt;br /&gt;
	local today = os.date (&amp;#039;*&amp;#039;)										-- fetch a table of current date parts&lt;br /&gt;
&lt;br /&gt;
	if not year or year == &amp;#039;&amp;#039; or not month or month == &amp;#039;&amp;#039; or not day or day == &amp;#039;&amp;#039; then&lt;br /&gt;
		return false												-- something missing&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	y = tonumber (year)&lt;br /&gt;
	m = tonumber (month)&lt;br /&gt;
	d = tonumber (day)&lt;br /&gt;
&lt;br /&gt;
	if 1900 &amp;gt; y or 2100 &amp;lt; y or 1 &amp;gt; m or 12 &amp;lt; m then					-- year and month are within bounds&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if (2==m) then													-- if February&lt;br /&gt;
		month_length = 28											-- then 28 days unless&lt;br /&gt;
		if (0==(y%4) and (0~=(y%100) or 0==(y%400))) then			-- is a leap year?&lt;br /&gt;
			month_length = 29										-- if leap year then 29 days in February&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		month_length=days_in_month[m];&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if 1 &amp;gt; d or month_length &amp;lt; d then								-- day is within bounds&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; makeDate &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
	Given a zero-padded 4-digit year, 2-digit month and 2-digit day, return a full date in df format&lt;br /&gt;
	df = mdy, dmy, iso, ymd&lt;br /&gt;
&lt;br /&gt;
 ]]&lt;br /&gt;
&lt;br /&gt;
local function makeDate(year, month, day, df, format)&lt;br /&gt;
	local formatFull = {&lt;br /&gt;
		[&amp;#039;dmy&amp;#039;] = &amp;#039;j F Y&amp;#039;,&lt;br /&gt;
		[&amp;#039;mdy&amp;#039;] = &amp;#039;F j, Y&amp;#039;,&lt;br /&gt;
		[&amp;#039;ymd&amp;#039;] = &amp;#039;Y F j&amp;#039;,&lt;br /&gt;
		[&amp;#039;iso&amp;#039;] = &amp;#039;Y-m-d&amp;#039;&lt;br /&gt;
	}&lt;br /&gt;
	local formatInfobox = {&lt;br /&gt;
		[&amp;#039;dmy&amp;#039;] = &amp;#039;j F&amp;#039;,&lt;br /&gt;
		[&amp;#039;mdy&amp;#039;] = &amp;#039;F j&amp;#039;,&lt;br /&gt;
		[&amp;#039;ymd&amp;#039;] = &amp;#039;F j&amp;#039;,&lt;br /&gt;
		[&amp;#039;iso&amp;#039;] = &amp;#039;Y-m-d&amp;#039;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if not year or year == &amp;quot;&amp;quot; or not month or month == &amp;quot;&amp;quot; or not day or day == &amp;quot;&amp;quot; and format[df] then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local date = table.concat ({year, month, day})               -- assemble iso format date&lt;br /&gt;
	if format ~= &amp;quot;infobox&amp;quot; then&lt;br /&gt;
		return mw.getContentLanguage():formatDate (formatFull[df], date)&lt;br /&gt;
	else&lt;br /&gt;
		return mw.getContentLanguage():formatDate (formatInfobox[df], date)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; dateOffset &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
	Given a &amp;#039;origdate&amp;#039; in ISO format, return the date offset by number of days in &amp;#039;offset&amp;#039; &lt;br /&gt;
		eg. given &amp;quot;2018-02-01&amp;quot; and &amp;quot;-1&amp;quot; it will return &amp;quot;2018-01-30&amp;quot;&lt;br /&gt;
	On error, return origdate&lt;br /&gt;
&lt;br /&gt;
  ]]&lt;br /&gt;
&lt;br /&gt;
local function dateOffset(origdate, offset)&lt;br /&gt;
&lt;br /&gt;
	local year, month, day = origdate:match (&amp;#039;(%d%d%d%d)-(%d%d)-(%d%d)&amp;#039;)&lt;br /&gt;
	local now = os.time{year = year, month = month, day = day}&lt;br /&gt;
	local newdate = os.date(&amp;quot;%Y-%m-%d&amp;quot;, now + (tonumber(offset) * 24 * 3600))&lt;br /&gt;
	return newdate and newdate or origdate&lt;br /&gt;
&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; renderHoli &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
	Render the data&lt;br /&gt;
&lt;br /&gt;
  ]]&lt;br /&gt;
  &lt;br /&gt;
local function renderHoli(cfg,eventdata,calcdate,date,df,format,tname,cite)&lt;br /&gt;
&lt;br /&gt;
	local hits = 0&lt;br /&gt;
	local matchdate = &amp;quot;^&amp;quot; .. date&lt;br /&gt;
	local startdate,enddate,outoffset,endoutoffset = nil&lt;br /&gt;
	local starttitle,endtitle = &amp;quot;&amp;quot;  &lt;br /&gt;
&lt;br /&gt;
	-- user-supplied date calculator &lt;br /&gt;
	if cfg.datatype == &amp;quot;calculator&amp;quot; then&lt;br /&gt;
		if cfg.datasource then&lt;br /&gt;
			startdate = calcdate&lt;br /&gt;
			enddate = dateOffset(startdate, cfg.days - 1)&lt;br /&gt;
		else&lt;br /&gt;
			return inlineError(&amp;quot;holiday&amp;quot;, &amp;#039;invalid calculator result&amp;#039;, tname )&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	-- read dates from localfile -- it assumes dates are in chrono order, need a more flexible method&lt;br /&gt;
	elseif cfg.datatype == &amp;quot;localfile&amp;quot; then                                              &lt;br /&gt;
		local numRecords = tableLength(eventdata) -- Get first and last date of holiday&lt;br /&gt;
		for i = 1, numRecords do&lt;br /&gt;
			if mw.ustring.find( eventdata[i].date, matchdate ) then&lt;br /&gt;
				if hits == 0 then&lt;br /&gt;
					startdate = eventdata[i].date&lt;br /&gt;
					hits = 1&lt;br /&gt;
				end&lt;br /&gt;
				if hits &amp;gt;= tonumber(cfg.days) then&lt;br /&gt;
					enddate = eventdata[i].date&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
				hits = hits + 1&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
     &lt;br /&gt;
	-- Verify data and special conditions&lt;br /&gt;
	if startdate == nil or enddate == nil then &lt;br /&gt;
		if cfg.name == &amp;quot;Hanukkah&amp;quot; and startdate and not enddate then  -- Hanukkah bug, template doesn&amp;#039;t support cross-year boundary&lt;br /&gt;
			enddate = dateOffset(startdate, 8)&lt;br /&gt;
		elseif cfg.datatype == &amp;quot;localfile&amp;quot; and cfg.days &amp;gt; &amp;quot;1&amp;quot; and startdate then&lt;br /&gt;
			enddate = dateOffset(startdate, cfg.days - 1)&lt;br /&gt;
		elseif startdate and not enddate then&lt;br /&gt;
			return inlineError(&amp;quot;year&amp;quot;, &amp;#039;cannot find enddate&amp;#039;, tname) .. createTracking()&lt;br /&gt;
		else&lt;br /&gt;
			return inlineError(&amp;quot;holiday&amp;quot;, &amp;#039;cannot find startdate and enddate&amp;#039;, tname) .. createTracking()&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
     &lt;br /&gt;
	-- Generate start-date offset (ie. holiday starts the evening before the given date)&lt;br /&gt;
	if cfg.startoffset then&lt;br /&gt;
		startdate = dateOffset(startdate, cfg.startoffset)&lt;br /&gt;
		if startdate ~= enddate then&lt;br /&gt;
			enddate = dateOffset(enddate, cfg.startoffset)&lt;br /&gt;
		else&lt;br /&gt;
			cfg.days = (cfg.days == &amp;quot;1&amp;quot;) and &amp;quot;2&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
 &lt;br /&gt;
	-- Generate end-date outside-Irael offset (ie. outside Israel the holiday ends +1 day later)&lt;br /&gt;
	endoutoffset = cfg.endoutoffset and dateOffset(enddate, cfg.endoutoffset)&lt;br /&gt;
&lt;br /&gt;
	-- Format dates into df format &lt;br /&gt;
	local year, month, day = startdate:match (&amp;#039;(%d%d%d%d)-(%d%d)-(%d%d)&amp;#039;)&lt;br /&gt;
	startdate = makeDate(year, month, day, df, format)&lt;br /&gt;
	year, month, day = enddate:match (&amp;#039;(%d%d%d%d)-(%d%d)-(%d%d)&amp;#039;)&lt;br /&gt;
	enddate = makeDate(year, month, day, df, format)&lt;br /&gt;
	if startdate == nil or enddate == nil then return nil end&lt;br /&gt;
&lt;br /&gt;
	-- Add &amp;quot;outside of Israel&amp;quot; notices&lt;br /&gt;
	if endoutoffset then&lt;br /&gt;
		year, month, day = endoutoffset:match (&amp;#039;(%d%d%d%d)-(%d%d)-(%d%d)&amp;#039;)&lt;br /&gt;
		local leader = ((format == &amp;quot;infobox&amp;quot;) and &amp;quot;&amp;lt;br&amp;gt;&amp;quot;) or &amp;quot; &amp;quot;&lt;br /&gt;
		endoutoffset = leader .. &amp;quot;(&amp;quot; .. makeDate(year, month, day, df, &amp;quot;infobox&amp;quot;) .. &amp;quot; outside of Israel)&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if not endoutoffset then&lt;br /&gt;
		endoutoffset = &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--- Determine format string&lt;br /&gt;
	format = ((format == &amp;quot;infobox&amp;quot;) and &amp;quot; –&amp;lt;br&amp;gt;&amp;quot;) or &amp;quot; – &amp;quot;&lt;br /&gt;
&lt;br /&gt;
	--- Determine pre-pended text string eg. &amp;quot;sunset, &amp;lt;date&amp;gt;&amp;quot;&lt;br /&gt;
	local prepend1 = (cfg.prepend1 and (cfg.prepend1 .. &amp;quot;, &amp;quot;)) or &amp;quot;&amp;quot;&lt;br /&gt;
	local prepend2 = (cfg.prepend2 and (cfg.prepend2 .. &amp;quot;, &amp;quot;)) or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
	-- return output&lt;br /&gt;
	if startdate == enddate or cfg.days == &amp;quot;1&amp;quot; then            -- single date&lt;br /&gt;
		return prepend1 .. startdate .. endoutoffset .. cite&lt;br /&gt;
	else&lt;br /&gt;
		return prepend1 .. startdate .. format .. prepend2 .. enddate .. endoutoffset .. cite&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; calendardate &amp;gt;-----------------------&lt;br /&gt;
&lt;br /&gt;
     Main function&lt;br /&gt;
&lt;br /&gt;
  ]]&lt;br /&gt;
&lt;br /&gt;
function p.calendardate(frame)&lt;br /&gt;
&lt;br /&gt;
	local pframe = frame:getParent()&lt;br /&gt;
	local args = pframe.args&lt;br /&gt;
&lt;br /&gt;
	local tname = &amp;quot;Calendar date&amp;quot;					-- name of calling template. Change if template rename.&lt;br /&gt;
	local holiday = nil								-- name of holiday&lt;br /&gt;
	local date = nil								-- date of holiday (year) &lt;br /&gt;
	local df = nil									-- date format (mdy, dmy, iso - default: iso)&lt;br /&gt;
	local format = nil								-- template display format options&lt;br /&gt;
	local cite = nil								-- leave a citation at end &lt;br /&gt;
	local calcdate = &amp;quot;&amp;quot;             &lt;br /&gt;
&lt;br /&gt;
	--- Determine holiday&lt;br /&gt;
	holiday = trimArg(args.holiday)					-- required&lt;br /&gt;
	if not holiday then&lt;br /&gt;
		holiday = trimArg(args.event)				-- event alias&lt;br /&gt;
		if not holiday then&lt;br /&gt;
			return inlineError(&amp;quot;holiday&amp;quot;, &amp;#039;missing holiday argument&amp;#039;, tname) .. createTracking()&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--- Determine date&lt;br /&gt;
	date = trimArg(args.year)						-- required&lt;br /&gt;
	if not date then&lt;br /&gt;
		return inlineError(&amp;quot;year&amp;quot;, &amp;#039;missing year argument&amp;#039;, tname) .. createTracking()&lt;br /&gt;
	elseif not isValidDate(date, &amp;quot;01&amp;quot;, &amp;quot;01&amp;quot;) then&lt;br /&gt;
		return inlineError(&amp;quot;year&amp;quot;, &amp;#039;invalid year&amp;#039;, tname) .. createTracking()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--- Determine format type&lt;br /&gt;
	format = trimArg(args.format)&lt;br /&gt;
	if not format then&lt;br /&gt;
		format = &amp;quot;none&amp;quot;&lt;br /&gt;
	elseif format ~= &amp;quot;infobox&amp;quot; then&lt;br /&gt;
		format = &amp;quot;none&amp;quot;&lt;br /&gt;
	end &lt;br /&gt;
&lt;br /&gt;
	-- Load configuration file&lt;br /&gt;
	local eventsfile = mw.loadData (&amp;#039;Module:Calendar date/events&amp;#039;)&lt;br /&gt;
	if eventsfile.hebrew_calendar[mw.ustring.upper(holiday)] then&lt;br /&gt;
		cfg = eventsfile.hebrew_calendar[mw.ustring.upper(holiday)]&lt;br /&gt;
	elseif eventsfile.christian_events[mw.ustring.upper(holiday)] then&lt;br /&gt;
		cfg = eventsfile.christian_events[mw.ustring.upper(holiday)]&lt;br /&gt;
	elseif eventsfile.carnivals[mw.ustring.upper(holiday)] then&lt;br /&gt;
		cfg = eventsfile.carnivals[mw.ustring.upper(holiday)]&lt;br /&gt;
	elseif eventsfile.chinese_events[mw.ustring.upper(holiday)] then&lt;br /&gt;
		cfg = eventsfile.chinese_events[mw.ustring.upper(holiday)]&lt;br /&gt;
	elseif eventsfile.misc_events[mw.ustring.upper(holiday)] then&lt;br /&gt;
		cfg = eventsfile.misc_events[mw.ustring.upper(holiday)]&lt;br /&gt;
	else&lt;br /&gt;
		return inlineError(&amp;quot;holiday&amp;quot;, &amp;#039;unknown holiday &amp;#039; .. holiday, tname) .. createTracking()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- If datatype = localfile &lt;br /&gt;
	if cfg.datatype == &amp;quot;localfile&amp;quot; then&lt;br /&gt;
		local eventfile = nil&lt;br /&gt;
		eventfile = mw.loadData(cfg.datasource)&lt;br /&gt;
		if eventfile.event then&lt;br /&gt;
			eventdata = eventfile.event&lt;br /&gt;
		else&lt;br /&gt;
			return inlineError(&amp;quot;holiday&amp;quot;, &amp;#039;unknown holiday file &amp;#039; .. cfg.datasource .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;, tname) .. createTracking()&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	-- If datatype = calculator&lt;br /&gt;
	elseif cfg.datatype == &amp;quot;calculator&amp;quot; then&lt;br /&gt;
		calcdate = frame:preprocess(cfg.datasource:gsub(&amp;quot;YYYY&amp;quot;, date))&lt;br /&gt;
		local year, month, day = calcdate:match (&amp;#039;(%d%d%d%d)-(%d%d)-(%d%d)&amp;#039;)&lt;br /&gt;
		if not isValidDate(year, month, day) then&lt;br /&gt;
			return inlineError(&amp;quot;holiday&amp;quot;, &amp;#039;invalid calculated date &amp;#039; .. calcdate, tname) .. createTracking()&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return inlineError(&amp;quot;holiday&amp;quot;, &amp;#039;unknown &amp;quot;datatype&amp;quot; in configuration&amp;#039;, tname) .. createTracking()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--- Determine df - priority to |df in template, otherwise df in datafile, otherwise default to dmy&lt;br /&gt;
	df = trimArg(args.df)&lt;br /&gt;
	if not df then&lt;br /&gt;
		df = (cfg.df and cfg.df) or &amp;quot;dmy&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if df ~= &amp;quot;mdy&amp;quot; and df ~= &amp;quot;dmy&amp;quot; and df ~= &amp;quot;iso&amp;quot; then&lt;br /&gt;
		df = &amp;quot;dmy&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Determine citation&lt;br /&gt;
	cite = trimArg2(args.cite)&lt;br /&gt;
	if cite then&lt;br /&gt;
		if (cite ~= &amp;quot;no&amp;quot;) then&lt;br /&gt;
			cite = &amp;quot;&amp;quot;&lt;br /&gt;
			if cfg.citeurl and cfg.accessdate and cfg.source and cfg.name then&lt;br /&gt;
				local citetitle = cfg.citetitle&lt;br /&gt;
				if citetitle == nil then&lt;br /&gt;
					citetitle = &amp;#039;Dates for &amp;#039; .. cfg.name&lt;br /&gt;
				end&lt;br /&gt;
				cite = frame:preprocess(&amp;#039;&amp;lt;ref name=&amp;quot;&amp;#039; .. holiday .. &amp;#039; dates&amp;quot;&amp;gt;{{cite web |url=&amp;#039; .. cfg.citeurl .. &amp;#039; |title=&amp;#039; .. citetitle .. &amp;#039; |publisher=&amp;#039; .. cfg.source .. &amp;#039;|accessdate=&amp;#039; .. cfg.accessdate .. &amp;#039;}}&amp;lt;/ref&amp;gt;&amp;#039;)&lt;br /&gt;
			elseif cfg.source then&lt;br /&gt;
				cite = frame:preprocess(&amp;#039;&amp;lt;ref name=&amp;quot;&amp;#039; .. holiday .. &amp;#039; dates&amp;quot;&amp;gt;&amp;#039; .. cfg.source:gsub(&amp;quot;YYYY&amp;quot;, date) .. &amp;#039;&amp;lt;/ref&amp;gt;&amp;#039;)&lt;br /&gt;
			else&lt;br /&gt;
				cite = &amp;quot;&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			cite = &amp;quot;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		cite = &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Render &lt;br /&gt;
	local rend = renderHoli( cfg,eventdata,calcdate,date,df,format,tname,cite)&lt;br /&gt;
	if not rend then&lt;br /&gt;
		rend = &amp;#039;&amp;lt;span style=&amp;quot;font-size:100%&amp;quot; class=&amp;quot;error citation-comment&amp;quot;&amp;gt;Error in [[:Template:&amp;#039; .. tname .. &amp;#039;]]: Unknown problem. Please report on template talk page.&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
		track[&amp;quot;Category:Webarchive template errors&amp;quot;] = 1 &lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return rend .. createTracking()&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Wikipedia&gt;Coffeeandcrumbs</name></author>
	</entry>
</feed>