<?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%2Ftrappist_the_monk%2Fdualdate</id>
	<title>Module:Sandbox/trappist the monk/dualdate - 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%2Ftrappist_the_monk%2Fdualdate"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/trappist_the_monk/dualdate&amp;action=history"/>
	<updated>2026-07-28T16:45:21Z</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/trappist_the_monk/dualdate&amp;diff=146611&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/trappist_the_monk/dualdate&amp;diff=146611&amp;oldid=prev"/>
		<updated>2022-10-23T21:12:19Z</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;
local getArgs = require (&amp;#039;Module:Arguments&amp;#039;).getArgs;							-- get parameters from frame&lt;br /&gt;
&lt;br /&gt;
local months = {&lt;br /&gt;
	[&amp;#039;1&amp;#039;] = &amp;#039;January&amp;#039;, [&amp;#039;2&amp;#039;] = &amp;#039;February&amp;#039;, [&amp;#039;3&amp;#039;] = &amp;#039;March&amp;#039;, [&amp;#039;4&amp;#039;] = &amp;#039;April&amp;#039;, [&amp;#039;5&amp;#039;] = &amp;#039;May&amp;#039;, [&amp;#039;6&amp;#039;] = &amp;#039;June&amp;#039;,&lt;br /&gt;
	[&amp;#039;7&amp;#039;] = &amp;#039;July&amp;#039;, [&amp;#039;8&amp;#039;] = &amp;#039;August&amp;#039;, [&amp;#039;9&amp;#039;] = &amp;#039;September&amp;#039;, [&amp;#039;10&amp;#039;] = &amp;#039;October&amp;#039;, [&amp;#039;11&amp;#039;] = &amp;#039;November&amp;#039;, [&amp;#039;12&amp;#039;] = &amp;#039;December&amp;#039;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
local islamic_months = {&lt;br /&gt;
	[&amp;#039;1&amp;#039;] = &amp;#039;Muḥarram&amp;#039;, [&amp;#039;2&amp;#039;] = &amp;#039;Ṣafar&amp;#039;, [&amp;#039;3&amp;#039;] = &amp;#039;Rabīʿ al-Awwal&amp;#039;, [&amp;#039;4&amp;#039;] = &amp;#039;Rabīʿ ath-Thānī&amp;#039;, [&amp;#039;5&amp;#039;] = &amp;#039;Jumādá al-Ūlá&amp;#039;, [&amp;#039;6&amp;#039;] = &amp;#039;Jumādá al-Ākhirah&amp;#039;,&lt;br /&gt;
	[&amp;#039;7&amp;#039;] = &amp;#039;Rajab&amp;#039;, [&amp;#039;8&amp;#039;] = &amp;#039;Sha‘bān&amp;#039;, [&amp;#039;9&amp;#039;] = &amp;#039;Ramaḍān&amp;#039;, [&amp;#039;10&amp;#039;] = &amp;#039;Shawwāl&amp;#039;, [&amp;#039;11&amp;#039;] = &amp;#039;Dhū al-Qa‘dah&amp;#039;, [&amp;#039;12&amp;#039;] = &amp;#039;Dhū al-Ḥijjah&amp;#039;&lt;br /&gt;
	};&lt;br /&gt;
&lt;br /&gt;
local formats = {																-- years different&lt;br /&gt;
	[&amp;#039;dmyspdmyp&amp;#039;] = &amp;#039;%s %s %s%s %s%s %s %s%s&amp;#039;,									-- day month year suffix prefix day month year postfix&lt;br /&gt;
	[&amp;#039;mdyspmdyp&amp;#039;] = &amp;#039;%s %s, %s%s %s%s %s, %s%s&amp;#039;,								-- month day, year suffix prefix month day, year postfix&lt;br /&gt;
&lt;br /&gt;
																				-- months different&lt;br /&gt;
	[&amp;#039;dmpdmpy&amp;#039;] = &amp;#039;%s %s %s%s %s%s %s&amp;#039;,											-- day month prefix day month postfix year &lt;br /&gt;
	[&amp;#039;mdpmdpy&amp;#039;] = &amp;#039;%s %s %s%s %s%s, %s&amp;#039;,										-- month day prefix month day postfix, year&lt;br /&gt;
&lt;br /&gt;
																				-- days different&lt;br /&gt;
	[&amp;#039;dpdpmy&amp;#039;] = &amp;#039;%s %s%s%s %s %s&amp;#039;,												-- day prefix day month postfix year&lt;br /&gt;
	[&amp;#039;mdpdpy&amp;#039;] = &amp;#039;%s %s %s%s%s, %s&amp;#039;,											-- month day prefix day postfix, year&lt;br /&gt;
	&lt;br /&gt;
																				-- month and year dates&lt;br /&gt;
	[&amp;#039;mypmyp&amp;#039;] = &amp;#039;%s %s %s%s %s%s&amp;#039;,												-- month year prefix month year postfix&lt;br /&gt;
	[&amp;#039;mpmpy&amp;#039;] = &amp;#039;%s %s%s%s %s&amp;#039;,													-- month prefix month postfix year&lt;br /&gt;
	&lt;br /&gt;
																				-- year dates&lt;br /&gt;
	[&amp;#039;ypyp&amp;#039;] = &amp;#039;%s %s%s%s&amp;#039;,														-- year prefix year postfix&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; G E T _ D A T E S &amp;gt;------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
make sure that appropriate date parts of both dates are present.  If ok, fills the dates table.&lt;br /&gt;
&lt;br /&gt;
Returns error message on failure, nil else&lt;br /&gt;
&lt;br /&gt;
TODO: validate dates? make sure that date1 is earlier or later than date2 as appropriate? support dates in natural&lt;br /&gt;
language format? ISO format as input?&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function get_dates (args, dates, m1, m2)&lt;br /&gt;
	if not (args[1] and args[4]) then											-- must have year1 and year2&lt;br /&gt;
		return &amp;#039;&amp;lt;span style=\&amp;quot;font-size:100%; font-style:normal;\&amp;quot; class=\&amp;quot;error\&amp;quot;&amp;gt;error: both years are required&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
	elseif args[2] and args[5] then												-- both months ...&lt;br /&gt;
		if (args[3] and not args[6]) or											-- ... and first day but not second day&lt;br /&gt;
			(not args[3] and args[6]) then										-- ... and second day but not first day&lt;br /&gt;
				return &amp;#039;&amp;lt;span style=\&amp;quot;font-size:100%; font-style:normal;\&amp;quot; class=\&amp;quot;error\&amp;quot;&amp;gt;error: both days are required&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
		end&lt;br /&gt;
		if not (&amp;#039;0&amp;#039; &amp;lt; args[2] and &amp;#039;13&amp;#039; &amp;gt; args[2]) and (&amp;#039;0&amp;#039; &amp;lt; args[5] and &amp;#039;13&amp;#039; &amp;gt; args[5]) then&lt;br /&gt;
			return &amp;#039;&amp;lt;span style=\&amp;quot;font-size:100%; font-style:normal;\&amp;quot; class=\&amp;quot;error\&amp;quot;&amp;gt;error: invalid month&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
		end&lt;br /&gt;
	elseif (args[2] and not args[5]) or											-- first month but not second month&lt;br /&gt;
		(not args[2] and args[5]) then											-- second month but not first month&lt;br /&gt;
			return &amp;#039;&amp;lt;span style=\&amp;quot;font-size:100%; font-style:normal;\&amp;quot; class=\&amp;quot;error\&amp;quot;&amp;gt;error: both months are required&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	dates = {&lt;br /&gt;
		year1 = args[1],														-- first date parts&lt;br /&gt;
		month1 = args[2] and m1[args[2]],&lt;br /&gt;
		day1 = args[3],&lt;br /&gt;
		&lt;br /&gt;
		year2 = args[4],														-- second date parts&lt;br /&gt;
		month2 = args[5] and m2[args[5]],&lt;br /&gt;
		day2 = args[6],&lt;br /&gt;
		&lt;br /&gt;
		dmy = not args.df or (&amp;#039;dmy&amp;#039; == args.df)									-- make boolean; default to dmy format&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	return nil, dates;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; _ R E N D E R _ D A T E S &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
renders both dates according to which date parts are present and which are not equal&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function _render_dates (dates, prefix, suffix)&lt;br /&gt;
	local prefix = &amp;#039;&amp;lt;small&amp;gt;(&amp;#039; .. prefix .. &amp;#039;: &amp;#039;;&lt;br /&gt;
	local postfix = &amp;#039;)&amp;lt;/small&amp;gt;&amp;#039;;&lt;br /&gt;
	if not suffix then&lt;br /&gt;
		suffix = &amp;#039;&amp;#039;;															-- for concatenation&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if dates.year1 and dates.month1 and dates.day1 then							-- year, month, and day dates&lt;br /&gt;
		if dates.year1 ~= dates.year2 then										-- annotation wraps second date&lt;br /&gt;
			if dates.dmy then&lt;br /&gt;
				return string.format (formats[&amp;#039;dmyspdmyp&amp;#039;], dates.day1, dates.month1, dates.year1, suffix, prefix, dates.day2, dates.month2, dates.year2, postfix);&lt;br /&gt;
			else&lt;br /&gt;
				return string.format (formats[&amp;#039;mdyspmdyp&amp;#039;], dates.month1, dates.day1, dates.year1, suffix, prefix, dates.month2, dates.day2, dates.year2, postfix);&lt;br /&gt;
			end&lt;br /&gt;
		elseif dates.month1 ~= dates.month2 then								-- annotation wraps second month and day&lt;br /&gt;
			if dates.dmy then&lt;br /&gt;
				return string.format (formats[&amp;#039;dmpdmpy&amp;#039;], dates.day1, dates.month1, prefix, dates.day2, dates.month2, postfix, dates.year2);&lt;br /&gt;
			else&lt;br /&gt;
				return string.format (formats[&amp;#039;mdpmdpy&amp;#039;], dates.month1, dates.day1, prefix, dates.month2, dates.day2, postfix, dates.year2);&lt;br /&gt;
			end&lt;br /&gt;
		elseif dates.day1 ~= dates.day2 then									-- annotation wraps second day&lt;br /&gt;
			if dates.dmy then&lt;br /&gt;
				return string.format (formats[&amp;#039;dpdpmy&amp;#039;], dates.day1, prefix, dates.day2, postfix, dates.month2, dates.year2);&lt;br /&gt;
			else&lt;br /&gt;
				return string.format (formats[&amp;#039;mdpdpy&amp;#039;], dates.month1, dates.day1, prefix, dates.day2, postfix, dates.year2);&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			return &amp;#039;&amp;lt;span style=\&amp;quot;font-size:100%; font-style:normal;\&amp;quot; class=\&amp;quot;error\&amp;quot;&amp;gt;error: identical YMD dates&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
		end&lt;br /&gt;
	elseif dates.year1 and dates.month1 then									-- year and month dates&lt;br /&gt;
		if dates.year1 ~= dates.year2 then										-- annotation wraps second month year&lt;br /&gt;
			return string.format (formats[&amp;#039;mypmyp&amp;#039;], dates.month1, dates.year1, prefix, dates.month2, dates.year2, postfix);&lt;br /&gt;
		elseif dates.month1 ~= dates.month2 then								-- annotation wraps second month&lt;br /&gt;
			return string.format (formats[&amp;#039;mpmpy&amp;#039;], dates.month1, prefix, dates.month2, postfix, dates.year2);&lt;br /&gt;
		else&lt;br /&gt;
			return &amp;#039;&amp;lt;span style=\&amp;quot;font-size:100%; font-style:normal;\&amp;quot; class=\&amp;quot;error\&amp;quot;&amp;gt;error: identical YM dates&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
		end&lt;br /&gt;
	else																		-- year dates&lt;br /&gt;
		if dates.year1 ~= dates.year2 then										-- annotation wraps second year&lt;br /&gt;
			return string.format (formats[&amp;#039;ypyp&amp;#039;], dates.year1, prefix, dates.year2, postfix);&lt;br /&gt;
		else&lt;br /&gt;
			return &amp;#039;&amp;lt;span style=\&amp;quot;font-size:100%; font-style:normal;\&amp;quot; class=\&amp;quot;error\&amp;quot;&amp;gt;error: identical Y dates&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; N S O S _ D A T E &amp;gt;------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
module entry point&lt;br /&gt;
&lt;br /&gt;
{{#invoke:Sandbox/trappist the monk/dualdate|nsos_date|&amp;lt;ns year&amp;gt;|&amp;lt;ns month&amp;gt;|&amp;lt;ns day&amp;gt;|&amp;lt;os year&amp;gt;|&amp;lt;os month&amp;gt;|&amp;lt;os day&amp;gt;|df=[dmy|mdy]|alt=&amp;lt;alternate annotation&amp;gt;|link=no}}&lt;br /&gt;
&lt;br /&gt;
ns date listed first followed by os date; os date has os annotation&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function nsos_date (frame)&lt;br /&gt;
	local args = getArgs(frame);												-- get {{#invoke:}} parameters&lt;br /&gt;
	local dates = {};&lt;br /&gt;
	local msg;&lt;br /&gt;
&lt;br /&gt;
	msg, dates = get_dates (args, dates, months, months);&lt;br /&gt;
	if msg then&lt;br /&gt;
		return message;															-- date check failed show a message&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local prefix = (args.alt and args.alt) or (&amp;#039;no&amp;#039; == args.link and &amp;#039;O.S.&amp;#039; or &amp;#039;[[Old Style and New Style dates|O.S.]]&amp;#039;);&lt;br /&gt;
	return _render_dates (dates, prefix)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; O S N S _ D A T E &amp;gt;------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
module entry point&lt;br /&gt;
&lt;br /&gt;
{{#invoke:Sandbox/trappist the monk/dualdate|osns_date|&amp;lt;os year&amp;gt;|&amp;lt;os month&amp;gt;|&amp;lt;os day&amp;gt;|&amp;lt;ns year&amp;gt;|&amp;lt;ns month&amp;gt;|&amp;lt;ns day&amp;gt;|df=[dmy|mdy]|alt=&amp;lt;alternate annotation&amp;gt;|link=no}}&lt;br /&gt;
&lt;br /&gt;
os date listed first followed by ns date; ns date has ns annotation&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function osns_date (frame)&lt;br /&gt;
	local args = getArgs(frame);												-- get {{#invoke:}} parameters&lt;br /&gt;
	local dates = {};&lt;br /&gt;
	local msg;&lt;br /&gt;
&lt;br /&gt;
	msg, dates = get_dates (args, dates, months, months);&lt;br /&gt;
	if msg then&lt;br /&gt;
		return message;															-- date check failed show a message&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local prefix = (args.alt and args.alt) or (&amp;#039;no&amp;#039; == args.link and &amp;#039;N.S.&amp;#039; or &amp;#039;[[Old Style and New Style dates|N.S.]]&amp;#039;);&lt;br /&gt;
	return _render_dates (dates, prefix)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; C E A H _ D A T E &amp;gt;------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
module entry point&lt;br /&gt;
&lt;br /&gt;
{{#invoke:Sandbox/trappist the monk/dualdate|ceah_date|&amp;lt;ce year&amp;gt;|&amp;lt;ce month&amp;gt;|&amp;lt;ce day&amp;gt;|&amp;lt;ah year&amp;gt;|&amp;lt;ah month&amp;gt;|&amp;lt;ah day&amp;gt;|link=no}}&lt;br /&gt;
&lt;br /&gt;
ce date listed first followed by ah date; ah date has ah annotation&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function ceah_date (frame)&lt;br /&gt;
	local args = getArgs(frame);												-- get {{#invoke:}} parameters&lt;br /&gt;
	local dates = {};&lt;br /&gt;
	local msg;&lt;br /&gt;
&lt;br /&gt;
	msg, dates = get_dates (args, dates, months, islamic_months);&lt;br /&gt;
	if msg then&lt;br /&gt;
		return message;															-- date check failed show a message&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local prefix = &amp;#039;no&amp;#039; == args.link and &amp;#039;A.H.&amp;#039; or &amp;#039;[[Hijri year|A.H.]]&amp;#039;;&lt;br /&gt;
	return _render_dates (dates, prefix)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; A H C E _ D A T E &amp;gt;------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
module entry point&lt;br /&gt;
&lt;br /&gt;
{{#invoke:Sandbox/trappist the monk/dualdate|ahce_date|&amp;lt;ah year&amp;gt;|&amp;lt;ah month&amp;gt;|&amp;lt;ah day&amp;gt;|&amp;lt;ce year&amp;gt;|&amp;lt;ce month&amp;gt;|&amp;lt;ce day&amp;gt;|link=no}}&lt;br /&gt;
&lt;br /&gt;
ah date listed first followed by ce date; ce date has ce annotation&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function ahce_date (frame)&lt;br /&gt;
	local args = getArgs(frame);												-- get {{#invoke:}} parameters&lt;br /&gt;
	local dates = {};&lt;br /&gt;
	local msg;&lt;br /&gt;
	local prefix, suffix;&lt;br /&gt;
&lt;br /&gt;
	msg, dates = get_dates (args, dates, islamic_months, months);&lt;br /&gt;
	if msg then&lt;br /&gt;
		return message;															-- date check failed show a message&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	prefix = &amp;#039;no&amp;#039; == args.link and &amp;#039;CE&amp;#039; or &amp;#039;[[Common Era|CE]]&amp;#039;;&lt;br /&gt;
	suffix = &amp;#039; &amp;#039; .. (&amp;#039;no&amp;#039; == args.link and &amp;#039;A.H.&amp;#039; or &amp;#039;[[Hijri year|A.H.]]&amp;#039;);	-- leading space required&lt;br /&gt;
	return _render_dates (dates, prefix, suffix);&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;
	ahce_date = ahce_date,&lt;br /&gt;
	ceah_date = ceah_date,&lt;br /&gt;
	nsos_date = nsos_date,&lt;br /&gt;
	osns_date = osns_date&lt;br /&gt;
	}&lt;/div&gt;</summary>
		<author><name>imported&gt;Legoktm</name></author>
	</entry>
</feed>