<?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%2FAjuanca%2FDates</id>
	<title>Module:Sandbox/Ajuanca/Dates - 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%2FAjuanca%2FDates"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Ajuanca/Dates&amp;action=history"/>
	<updated>2026-05-28T16:20: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/Ajuanca/Dates&amp;diff=145090&amp;oldid=prev</id>
		<title>imported&gt;Ajuanca: Testing</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Ajuanca/Dates&amp;diff=145090&amp;oldid=prev"/>
		<updated>2020-01-23T17:43:35Z</updated>

		<summary type="html">&lt;p&gt;Testing&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Task 9 of GCI 2019&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Main function&lt;br /&gt;
function p.formatDates(frame)&lt;br /&gt;
	local inputDate = tostring(frame.args.name)&lt;br /&gt;
	local inputFormat=tostring(frame.args.format)&lt;br /&gt;
	local inputTable = p.divideString(inputDate)&lt;br /&gt;
	local str=&amp;quot;&amp;quot;&lt;br /&gt;
	local myDate = p.getDate(inputTable)&lt;br /&gt;
	local dateResults = p.checkDate(myDate)&lt;br /&gt;
	if(not(dateResults.isDateCorrect))then&lt;br /&gt;
		return dateResults.errorMessage&lt;br /&gt;
	else&lt;br /&gt;
		local outputFormat=p.chooseFormat(myDate, inputFormat)&lt;br /&gt;
		local completeMonths={&amp;quot;January&amp;quot;, &amp;quot;February&amp;quot;, &amp;quot;March&amp;quot;, &amp;quot;April&amp;quot;, &amp;quot;May&amp;quot;, &amp;quot;June&amp;quot;, &amp;quot;July&amp;quot;, &amp;quot;August&amp;quot;,&lt;br /&gt;
			&amp;quot;September&amp;quot;, &amp;quot;October&amp;quot;, &amp;quot;November&amp;quot;, &amp;quot;December&amp;quot;}&lt;br /&gt;
		if(myDate.isAprox)then&lt;br /&gt;
			str=&amp;quot;circa &amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		if(outputFormat==&amp;quot;dmy&amp;quot;)then&lt;br /&gt;
			str = str .. myDate.day .. &amp;quot; &amp;quot; .. completeMonths[myDate.month] .. &amp;quot; &amp;quot; .. myDate.year&lt;br /&gt;
		elseif(outputFormat==&amp;quot;mdy&amp;quot;)then&lt;br /&gt;
			str = str .. completeMonths[myDate.month] .. &amp;quot; &amp;quot; .. myDate.day .. &amp;quot;, &amp;quot; .. myDate.year&lt;br /&gt;
		elseif(outputFormat==&amp;quot;iso&amp;quot;)then&lt;br /&gt;
			str = str .. myDate.year .. &amp;quot;-&amp;quot; .. myDate.month .. &amp;quot;-&amp;quot; .. myDate.day&lt;br /&gt;
		elseif(outputFormat==&amp;quot;y&amp;quot;)then&lt;br /&gt;
			str=str..myDate.year&lt;br /&gt;
		elseif(outputFormat==&amp;quot;my&amp;quot;)then&lt;br /&gt;
			str=str.. completeMonths[myDate.month] .. &amp;quot; &amp;quot; .. myDate.year&lt;br /&gt;
		end&lt;br /&gt;
		if(myDate.specifiedEra~= nil)then&lt;br /&gt;
			str = str ..&amp;quot; &amp;quot;..myDate.specifiedEra&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Selects correct output format.&lt;br /&gt;
-- Returns a String&lt;br /&gt;
function p.chooseFormat(dateObject, prefference)&lt;br /&gt;
	local correctFormat=&amp;quot;&amp;quot;&lt;br /&gt;
	if(dateObject.dateFormat~= nil)then&lt;br /&gt;
		correctFormat=dateObject.dateFormat&lt;br /&gt;
	else&lt;br /&gt;
		correctFormat=&amp;quot;#error&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	local compatibleFormats = {&amp;quot;dmy&amp;quot;, &amp;quot;mdy&amp;quot;, &amp;quot;iso&amp;quot;, &amp;quot;y&amp;quot;, &amp;quot;my&amp;quot;}&lt;br /&gt;
	for n, actualFormat in ipairs(compatibleFormats) do&lt;br /&gt;
		if (prefference:lower() == actualFormat) then&lt;br /&gt;
			correctFormat=prefference:lower()&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return correctFormat&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Truncates the input by spaces.&lt;br /&gt;
-- Returns a table&lt;br /&gt;
function p.divideString(stringSentence)&lt;br /&gt;
	local nameTable = {}&lt;br /&gt;
	stringSentence = string.gsub(stringSentence, &amp;quot;-&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
	stringSentence = string.gsub(stringSentence, &amp;quot;/&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
	for m in string.gmatch(stringSentence, (&amp;quot;%S+&amp;quot;)) do &lt;br /&gt;
		table.insert(nameTable, m)&lt;br /&gt;
	end&lt;br /&gt;
	return nameTable&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Detects input date.&lt;br /&gt;
-- Returns a Object&lt;br /&gt;
function p.getDate(stringTable)&lt;br /&gt;
	local comparison = &amp;quot;&amp;quot;&lt;br /&gt;
	local finalDate = {&lt;br /&gt;
		day = 0,&lt;br /&gt;
		month = 0,&lt;br /&gt;
		year = 0,&lt;br /&gt;
		isAprox=false,&lt;br /&gt;
		specifiedEra=nil,&lt;br /&gt;
		dateFormat=nil&lt;br /&gt;
	}&lt;br /&gt;
	local dateIsStored = false&lt;br /&gt;
	-- Matchs string month with correspoding number.&lt;br /&gt;
	-- Returns number&lt;br /&gt;
	function getMonth(strInput)&lt;br /&gt;
		local months = {&amp;quot;jan&amp;quot;, &amp;quot;feb&amp;quot;, &amp;quot;mar&amp;quot;, &amp;quot;apr&amp;quot;, &amp;quot;may&amp;quot;, &amp;quot;june&amp;quot;, &amp;quot;july&amp;quot;, &amp;quot;aug&amp;quot;, &amp;quot;sept&amp;quot;, &lt;br /&gt;
			&amp;quot;oct&amp;quot;, &amp;quot;nov&amp;quot;, &amp;quot;dec&amp;quot;}&lt;br /&gt;
		if(strInput:find(&amp;quot;(%a+)&amp;quot;))then&lt;br /&gt;
			for w, month in ipairs(months)do&lt;br /&gt;
				if(strInput:lower():find(month)~= nil)then&lt;br /&gt;
					return tonumber(w)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return 0&lt;br /&gt;
	end&lt;br /&gt;
	-- Match given ordinal number to its cardinal value.&lt;br /&gt;
	-- Returns a number&lt;br /&gt;
	function getCardinal(inputStr)&lt;br /&gt;
		if(inputStr:find(&amp;quot;(%d+)(%a+)&amp;quot;))then&lt;br /&gt;
			local number, termination=inputStr:lower():match(&amp;quot;(%d+)(%a+)&amp;quot;)&lt;br /&gt;
			suffixes = {&amp;quot;st&amp;quot;, &amp;quot;nd&amp;quot;, &amp;quot;rd&amp;quot;, &amp;quot;th&amp;quot;}&lt;br /&gt;
			for g, suffix in ipairs(suffixes)do&lt;br /&gt;
				if(termination:find(suffix))then&lt;br /&gt;
					return tonumber(number)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return 0&lt;br /&gt;
	end&lt;br /&gt;
	-- Start comparison&lt;br /&gt;
	for z, number in ipairs(stringTable) do&lt;br /&gt;
		-- Creates a string of three followed items.&lt;br /&gt;
		if(z&amp;lt;=#stringTable-2)then&lt;br /&gt;
			local comparison = stringTable[z] .. &amp;quot; &amp;quot; .. stringTable[z+1] .. &amp;quot; &amp;quot; .. stringTable[z+2]&lt;br /&gt;
			-- Search for the format &amp;#039;typedMonth Day, Year&amp;#039;.&lt;br /&gt;
			if(comparison:lower():find(&amp;quot;(%a+) (%d+), (%d+)&amp;quot;))then&lt;br /&gt;
				local m, d, y = comparison:lower():match(&amp;quot;(%a+) (%d+), (%d+)&amp;quot;)&lt;br /&gt;
				finalDate.month=tonumber(getMonth(m))&lt;br /&gt;
				finalDate.year=tonumber(y)&lt;br /&gt;
				finalDate.day=tonumber(d)&lt;br /&gt;
				finalDate.dateFormat=&amp;quot;mdy&amp;quot;&lt;br /&gt;
				dateIsStored=true&lt;br /&gt;
			end&lt;br /&gt;
			-- Search for the format &amp;#039;Day typedMonth Year&amp;#039;&lt;br /&gt;
			if(comparison:lower():find(&amp;quot;(%d+) (%a+) (%d+)&amp;quot;) and not(dateIsStored))then&lt;br /&gt;
				local d, m, y = comparison:lower():match(&amp;quot;(%d+) (%a+) (%d+)&amp;quot;)&lt;br /&gt;
				finalDate.month=getMonth(m:lower())&lt;br /&gt;
				finalDate.year=tonumber(y)&lt;br /&gt;
				finalDate.day=tonumber(d)&lt;br /&gt;
				finalDate.dateFormat=&amp;quot;dmy&amp;quot;&lt;br /&gt;
				if(finalDate.month==0)then&lt;br /&gt;
					dateIsStored=false&lt;br /&gt;
				else&lt;br /&gt;
					dateIsStored=true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			-- Search for the format &amp;#039;Day Month Year&amp;#039; or &amp;#039;Year Month Day&amp;#039;&lt;br /&gt;
			if(comparison:lower():find(&amp;quot;(%d+) (%d+) (%d+)&amp;quot;) and not(dateIsStored))then&lt;br /&gt;
				local d, m, y= comparison:lower():match(&amp;quot;(%d+) (%d+) (%d+)&amp;quot;)&lt;br /&gt;
				-- If day and year are both less than 31, it&amp;#039;ll be considered d-m-y&lt;br /&gt;
				if(tonumber(d)&amp;gt;31)then&lt;br /&gt;
					local temporalDay=y&lt;br /&gt;
					y=d&lt;br /&gt;
					d=temporalDay&lt;br /&gt;
				end&lt;br /&gt;
				finalDate.month=tonumber(m)&lt;br /&gt;
				finalDate.year=tonumber(y)&lt;br /&gt;
				finalDate.day=tonumber(d)&lt;br /&gt;
				-- This format isn&amp;#039;t allowed. The most similar is ISO.&lt;br /&gt;
				finalDate.dateFormat=&amp;quot;iso&amp;quot;&lt;br /&gt;
				if(finalDate.month==0)then&lt;br /&gt;
					dateIsStored=false&lt;br /&gt;
				else &lt;br /&gt;
					dateIsStored=true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			-- Search for format &amp;#039;ordinalDay typedMonth Year&amp;#039;&lt;br /&gt;
			if(comparison:lower():find(&amp;quot;(%w+) (%a+) (%d+)&amp;quot;) and not(dateIsStored))then&lt;br /&gt;
				local d, m, y=comparison:lower():match(&amp;quot;(%w+) (%a+) (%d+)&amp;quot;)&lt;br /&gt;
				finalDate.day=getCardinal(d)&lt;br /&gt;
				finalDate.month=getMonth(m)&lt;br /&gt;
				finalDate.year=y&lt;br /&gt;
				-- This format isn&amp;#039;t allowed. The most similar is ISO.&lt;br /&gt;
				finalDate.dateFormat=&amp;quot;iso&amp;quot;&lt;br /&gt;
				if(finalDate.month==0)then&lt;br /&gt;
					dateIsStored=false&lt;br /&gt;
				else&lt;br /&gt;
					dateIsStored=true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- Searchs for aproximations indicators&lt;br /&gt;
		local aproxIndicators = {&amp;quot;circa&amp;quot;, &amp;quot;approx&amp;quot;, &amp;quot;around&amp;quot;, &amp;quot;uncertain&amp;quot;}&lt;br /&gt;
		for z, indicator in ipairs(aproxIndicators)do&lt;br /&gt;
			if(number:lower():match(indicator))then&lt;br /&gt;
				finalDate.isAprox=true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- Searchs for era indicators. Note that, althought it isn&amp;#039;t used,&lt;br /&gt;
		-- the value g gives us the calendar used.&lt;br /&gt;
		local eraIndicators={{&amp;quot;bce&amp;quot;, &amp;quot;bc&amp;quot;}, {&amp;quot;ce&amp;quot;, &amp;quot;ad&amp;quot;}}&lt;br /&gt;
		for d, era in ipairs(eraIndicators)do&lt;br /&gt;
			for g, specific in ipairs(era)do&lt;br /&gt;
				if(specific==number:lower())then&lt;br /&gt;
					finalDate.specifiedEra=specific:upper()&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if(not(dateIsStored))then&lt;br /&gt;
		for k, number in ipairs(stringTable) do&lt;br /&gt;
			-- Creates a string of two followed elements.&lt;br /&gt;
			if(k&amp;lt;=#stringTable-1)then&lt;br /&gt;
				local comparison = stringTable[k] .. &amp;quot; &amp;quot; .. stringTable[k+1]&lt;br /&gt;
				-- Search for a date in format &amp;#039;Day typedMonth&amp;#039;&lt;br /&gt;
				if(comparison:lower():find(&amp;quot;(%d+) (%a+)&amp;quot;))then&lt;br /&gt;
					local d, m=comparison:lower():match(&amp;quot;(%d+) (%a+)&amp;quot;)&lt;br /&gt;
					finalDate.day=tonumber(d)&lt;br /&gt;
					finalDate.month=tonumber(getMonth(m))&lt;br /&gt;
					-- This format isn&amp;#039;t allowed. The most similar is ISO.&lt;br /&gt;
					finalDate.dateFormat=&amp;quot;iso&amp;quot;&lt;br /&gt;
					if(finalDate.month==0)then&lt;br /&gt;
						dateIsStored=false&lt;br /&gt;
					else&lt;br /&gt;
						dateIsStored=true&lt;br /&gt;
					end&lt;br /&gt;
				-- Search for a date in format &amp;#039;ordinalDay typedMonth&amp;#039;&lt;br /&gt;
				elseif(comparison:lower():find(&amp;quot;(%w+) (%a+)&amp;quot;))then&lt;br /&gt;
					local d, m=comparison:lower():match(&amp;quot;(%w+) (%a+)&amp;quot;)&lt;br /&gt;
					finalDate.day=getCardinal(d)&lt;br /&gt;
					finalDate.month=getMonth(m)&lt;br /&gt;
					-- This format isn&amp;#039;t allowed. The most similar is ISO.&lt;br /&gt;
					finalDate.dateFormat=&amp;quot;iso&amp;quot;&lt;br /&gt;
					if(finalDate.day==0)then&lt;br /&gt;
						dateIsStored=false&lt;br /&gt;
					else&lt;br /&gt;
						dateIsStored=true&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				-- Search for a date in format &amp;#039;typedMonth Year&amp;#039;&lt;br /&gt;
				if(comparison:lower():find(&amp;quot;(%a+) (%d+)&amp;quot;))then&lt;br /&gt;
					local m, y=comparison:lower():match(&amp;quot;(%a+) (%d+)&amp;quot;)&lt;br /&gt;
					finalDate.month=getMonth(m)&lt;br /&gt;
					finalDate.year=tonumber(y)&lt;br /&gt;
					finalDate.dateFormat=&amp;quot;my&amp;quot;&lt;br /&gt;
					if(finalDate.month==0)then&lt;br /&gt;
						dateIsStored=false&lt;br /&gt;
					else&lt;br /&gt;
						dateIsStored=true&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- Search for a result if nothing is still found.&lt;br /&gt;
	if(not(dateIsStored))then&lt;br /&gt;
		local numbersFound = {}&lt;br /&gt;
		for n, number in ipairs(stringTable)do&lt;br /&gt;
			-- Search for possible given values in an non-regulated order. &lt;br /&gt;
			if(number:find(&amp;quot;(%a+)&amp;quot;)~=nil)then&lt;br /&gt;
				if(finalDate.day==0 and number:find(&amp;quot;(%d+)&amp;quot;))then&lt;br /&gt;
					-- Search for ordinal day&lt;br /&gt;
					finalDate.day=getCardinal(number)&lt;br /&gt;
					if(not(finalDate.day==0))then&lt;br /&gt;
						finalDate.dateFormat=&amp;quot;dmy&amp;quot;&lt;br /&gt;
					end&lt;br /&gt;
				elseif(finalDate.month==0)then&lt;br /&gt;
					-- Search for months&lt;br /&gt;
					finalDate.month=tonumber(getMonth(number))&lt;br /&gt;
					if(not(finalDate.month==0))then&lt;br /&gt;
						finalDate.dateFormat=&amp;quot;my&amp;quot;&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				table.insert(numbersFound, tonumber(number))&lt;br /&gt;
			end&lt;br /&gt;
			if(#numbersFound==1 and #stringTable==n)then&lt;br /&gt;
				finalDate.year=numbersFound[1]&lt;br /&gt;
				if((finalDate.month~=0) and (finalDate.day~=0))then&lt;br /&gt;
					finalDate.dateFormat=&amp;quot;dmy&amp;quot;&lt;br /&gt;
				elseif(finalDate.month~=0)then&lt;br /&gt;
					finalDate.dateFormat=&amp;quot;my&amp;quot;&lt;br /&gt;
				else&lt;br /&gt;
					finalDate.dateFormat=&amp;quot;y&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
			elseif(#numbersFound==2 and #stringTable==n)then&lt;br /&gt;
				if(numbersFound[1]&amp;lt;=31) then&lt;br /&gt;
					finalDate.day=numbersFound[1]&lt;br /&gt;
					finalDate.year=numbersFound[2]&lt;br /&gt;
				else&lt;br /&gt;
					finalDate.year=numberFound[1]&lt;br /&gt;
					finalDate.day=numberFound[2]&lt;br /&gt;
				end&lt;br /&gt;
				finalDate.dateFormat=&amp;quot;y&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return finalDate&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Checks that given date&lt;br /&gt;
-- Returns a object&lt;br /&gt;
function p.checkDate(givenDate)&lt;br /&gt;
	-- Detects is the given year is leap.&lt;br /&gt;
	-- Returns a boolean&lt;br /&gt;
	function isLeap(yearInput)&lt;br /&gt;
		local yearIsLeap = (tonumber(yearInput)%4)==0&lt;br /&gt;
		if((tonumber(yearInput)%100)==0 )then&lt;br /&gt;
			yearIsLeap = (tonumber(yearInput)%400)==0&lt;br /&gt;
		end&lt;br /&gt;
		return yearIsLeap&lt;br /&gt;
	end&lt;br /&gt;
	local finalObject = {&lt;br /&gt;
		isDateCorrect=true,&lt;br /&gt;
		errorMessage=&amp;quot;&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	-- Check if day is correct&lt;br /&gt;
	if(not(givenDate.day==nil))then&lt;br /&gt;
		if(givenDate.day&amp;gt;31)then&lt;br /&gt;
			finalObject.isDateCorrect=false&lt;br /&gt;
			finalObject.errorMessage=&amp;quot;That day doesn&amp;#039;t exists!&amp;quot;&lt;br /&gt;
			return finalObject&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if(not(givenDate.month==nil))then&lt;br /&gt;
		if(givenDate.month==2)then&lt;br /&gt;
			if(isLeap(givenDate.year))then&lt;br /&gt;
				if(givenDate.day&amp;gt;29)then&lt;br /&gt;
					finalObject.isDateCorrect=false&lt;br /&gt;
					finalObject.errorMessage=&amp;quot;That day doesn&amp;#039;t exists!&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
			else &lt;br /&gt;
				if(givenDate.day&amp;gt;=29)then&lt;br /&gt;
					finalObject.isDateCorrect=false&lt;br /&gt;
					finalObject.errorMessage=&amp;quot;That day doesn&amp;#039;t exists!&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- Check if month is correct&lt;br /&gt;
	if(not(givenDate.month==nil))then&lt;br /&gt;
		if(givenDate.month&amp;gt;12)then&lt;br /&gt;
			finalObject.isDateCorrect=false&lt;br /&gt;
			finalObject.errorMessage=&amp;quot;That month doesn&amp;#039;t exist!&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- Check if date is nil&lt;br /&gt;
	if(givenDate.year==0 and givenDate.day==0 and givenDate.month==0)then&lt;br /&gt;
		finalObject.isDateCorrect=false&lt;br /&gt;
		finalObject.errorMessage=&amp;quot;No date was detected.&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	return finalObject&lt;br /&gt;
end&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Ajuanca</name></author>
	</entry>
</feed>