<?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%2FTakidelfin%2FDates</id>
	<title>Module:Sandbox/Takidelfin/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%2FTakidelfin%2FDates"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Takidelfin/Dates&amp;action=history"/>
	<updated>2026-08-02T07:51:43Z</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/Takidelfin/Dates&amp;diff=146272&amp;oldid=prev</id>
		<title>imported&gt;Takidelfin at 12:08, 24 November 2018</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Takidelfin/Dates&amp;diff=146272&amp;oldid=prev"/>
		<updated>2018-11-24T12:08:05Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- Task 7 for Google Code-in | Date formatting)&lt;br /&gt;
testList = {&lt;br /&gt;
	&amp;quot;31 august 2013&amp;quot;,&lt;br /&gt;
	&amp;quot;31 August 2013&amp;quot;,&lt;br /&gt;
	&amp;quot;31 August 2013 (uncertain)&amp;quot;,&lt;br /&gt;
	&amp;quot;August 27, 2013&amp;quot;,&lt;br /&gt;
	&amp;quot;29 February 2004 (uncertain)&amp;quot;,&lt;br /&gt;
	&amp;quot;29 February 2005 (uncertain)&amp;quot;,&lt;br /&gt;
	&amp;quot;27/08/2013&amp;quot;,&lt;br /&gt;
	&amp;quot;04/27/2013&amp;quot;,&lt;br /&gt;
	&amp;quot;2013-08-27&amp;quot;,&lt;br /&gt;
	&amp;quot;2013 (uncertain)&amp;quot;,&lt;br /&gt;
	&amp;quot;27&amp;quot;,&lt;br /&gt;
	&amp;quot;27 December&amp;quot;,&lt;br /&gt;
	&amp;quot;27 2017&amp;quot;,&lt;br /&gt;
	&amp;quot;sometime around 27th August 2013&amp;quot;,&lt;br /&gt;
	&amp;quot;on the 16th of December in the year of our Lord 1770&amp;quot;,&lt;br /&gt;
	&amp;quot;on the 16th of December in the year skjdgfgjksdgjkheg hgj32g gh 11 of our Lord 1770&amp;quot;,&lt;br /&gt;
	&amp;quot;99 red balloons&amp;quot;,&lt;br /&gt;
	&amp;quot;sometime around 3rd August 2013&amp;quot;,&lt;br /&gt;
	&amp;quot;31 August 103 AD&amp;quot;,&lt;br /&gt;
	&amp;quot;31 August 2013 BC&amp;quot;,&lt;br /&gt;
	&amp;quot;31 August 2013 BCE&amp;quot;,&lt;br /&gt;
	&amp;quot;31 August 103 CE&amp;quot;,&lt;br /&gt;
	&amp;quot;31 August 13 BC&amp;quot;,&lt;br /&gt;
	&amp;quot;31 August 13&amp;quot;,&lt;br /&gt;
	&amp;quot;31 August 213&amp;quot;,&lt;br /&gt;
	&amp;quot;213&amp;quot;,&lt;br /&gt;
	&amp;quot;30 BCE&amp;quot;,&lt;br /&gt;
	&amp;quot;3 may 2017&amp;quot;,&lt;br /&gt;
	&amp;quot;3 Jan 2017&amp;quot;,&lt;br /&gt;
	&amp;quot;31 February 2013&amp;quot;,&lt;br /&gt;
	&amp;quot;the quick brown fox&amp;quot;,&lt;br /&gt;
	&amp;quot;4 and 20 blackbirds ...&amp;quot;,&lt;br /&gt;
	&amp;quot;3 jan 9 AD&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
possiblePatterns = {&lt;br /&gt;
	{ pattern = &amp;quot;(%d+) (%w+) (%d+)&amp;quot;, format = &amp;quot;dmy&amp;quot; },&lt;br /&gt;
	{ pattern = &amp;quot;(%d+)st (%w+), (%d+)&amp;quot;, format = &amp;quot;dmy&amp;quot; },&lt;br /&gt;
	{ pattern = &amp;quot;(%d+)nd (%w+), (%d+)&amp;quot;, format = &amp;quot;dmy&amp;quot; },&lt;br /&gt;
	{ pattern = &amp;quot;(%d+)rd (%w+), (%d+)&amp;quot;, format = &amp;quot;dmy&amp;quot; },&lt;br /&gt;
	{ pattern = &amp;quot;(%d+)th (%w+), (%d+)&amp;quot;, format = &amp;quot;dmy&amp;quot; },&lt;br /&gt;
	{ pattern = &amp;quot;(%d+)st (%w+) (%d+)&amp;quot;, format = &amp;quot;dmy&amp;quot; },&lt;br /&gt;
	{ pattern = &amp;quot;(%d+)nd (%w+) (%d+)&amp;quot;, format = &amp;quot;dmy&amp;quot; },&lt;br /&gt;
	{ pattern = &amp;quot;(%d+)rd (%w+) (%d+)&amp;quot;, format = &amp;quot;dmy&amp;quot; },&lt;br /&gt;
	{ pattern = &amp;quot;(%d+)th (%w+) (%d+)&amp;quot;, format = &amp;quot;dmy&amp;quot; },&lt;br /&gt;
	{ pattern = &amp;quot;(%d+)th of (%w+) .+ (%d+)&amp;quot;, format = &amp;quot;dmy&amp;quot; },&lt;br /&gt;
	{ pattern = &amp;quot;(%w+) (%d+)th (%d+)&amp;quot;, format = &amp;quot;mdy&amp;quot; },&lt;br /&gt;
  { pattern = &amp;quot;(%w+) (%d+), (%d+)&amp;quot;,  format = &amp;quot;mdy&amp;quot; },&lt;br /&gt;
	{ pattern = &amp;quot;(%d+)/(%d+)/(%d+)&amp;quot;,  format = &amp;quot;dmy&amp;quot; },&lt;br /&gt;
	{ pattern = &amp;quot;(%d+)/(%d+)/(%d+)&amp;quot;,  format = &amp;quot;mdy&amp;quot; },&lt;br /&gt;
	{ pattern = &amp;quot;(%d+)/(%d+)&amp;quot;, format = &amp;quot;my&amp;quot; },&lt;br /&gt;
	{ pattern = &amp;quot;(%d+)-(%d+)-(%d+)&amp;quot;, format = &amp;quot;ymd&amp;quot; },&lt;br /&gt;
	{ pattern = &amp;quot;(%d+) (%w+)&amp;quot;, format = &amp;quot;ym&amp;quot; },&lt;br /&gt;
	{ pattern = &amp;quot;(%d%d%d%d%d)&amp;quot;, format = &amp;quot;y&amp;quot; },&lt;br /&gt;
	{ pattern = &amp;quot;(%d%d%d%d)&amp;quot;, format = &amp;quot;y&amp;quot; },&lt;br /&gt;
	{ pattern = &amp;quot;(%d%d%d)&amp;quot;, format = &amp;quot;y&amp;quot; },&lt;br /&gt;
	{ pattern = &amp;quot;year (%d+)&amp;quot;, format = &amp;quot;y&amp;quot; },&lt;br /&gt;
	{ pattern = &amp;quot;(%d+)&amp;quot;, format = &amp;quot;y&amp;quot; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local allowedFormats = {&lt;br /&gt;
	[&amp;quot;dmy&amp;quot;] = &amp;quot;$D$ $M$ $y$ $E$&amp;quot;,&lt;br /&gt;
	[&amp;quot;mdy&amp;quot;] = &amp;quot;$M$ $D$ $y$ $E$&amp;quot;,&lt;br /&gt;
	[&amp;quot;iso&amp;quot;] = &amp;quot;$Y$-$m$-$d$&amp;quot;,&lt;br /&gt;
	[&amp;quot;year&amp;quot;] = &amp;quot;$y$ $E$&amp;quot;,&lt;br /&gt;
	[&amp;quot;y&amp;quot;] = &amp;quot;$y$ $E$&amp;quot;,&lt;br /&gt;
	[&amp;quot;my&amp;quot;] = &amp;quot;$M$ $y$ $E$&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- First object in the array is prefix, second is a suffx&lt;br /&gt;
local circa = {&lt;br /&gt;
	{ &amp;quot;sometime around&amp;quot;, &amp;quot;around&amp;quot; },&lt;br /&gt;
	{ &amp;quot;%(uncertain%)&amp;quot; }&lt;br /&gt;
}&lt;br /&gt;
local eraSuffix = {&lt;br /&gt;
	{ &amp;quot;AD&amp;quot;, &amp;quot;CE&amp;quot; }, --&lt;br /&gt;
	{ &amp;quot;BC&amp;quot;, &amp;quot;BCE&amp;quot; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local monthsDays = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }&lt;br /&gt;
local monthsNames = { &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;, &amp;quot;September&amp;quot;, &amp;quot;October&amp;quot;, &amp;quot;November&amp;quot;, &amp;quot;December&amp;quot; }&lt;br /&gt;
-- local months = { [&amp;quot;January&amp;quot;] = 31, [&amp;quot;February&amp;quot;] = 28, [&amp;quot;March&amp;quot;] = 31, [&amp;quot;April&amp;quot;] = 30, [&amp;quot;May&amp;quot;] = 31, [&amp;quot;June&amp;quot;] = 30, [&amp;quot;July&amp;quot;] = 31, [&amp;quot;August&amp;quot;] = 31, [&amp;quot;September&amp;quot;]= 30, [&amp;quot;October&amp;quot;]= 31, [&amp;quot;November&amp;quot;] = 30, [&amp;quot;December&amp;quot;] = 31 }&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
isLeapYear = function ( yearRaw )&lt;br /&gt;
	year = tonumber(yearRaw)&lt;br /&gt;
	return (((year % 4 == 0) and (year % 100 ~= 0)) or (year % 400 == 0))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
extractData = function ( dateRaw )&lt;br /&gt;
	msg = &amp;quot;&amp;quot;&lt;br /&gt;
	matched = false&lt;br /&gt;
	-- print (&amp;#039;-- &amp;#039; .. dateRaw .. &amp;#039; --&amp;#039;)&lt;br /&gt;
	for key, value in pairs(possiblePatterns) do&lt;br /&gt;
		if matched ~= true then&lt;br /&gt;
			local date = {}&lt;br /&gt;
			date.circa = false&lt;br /&gt;
			--[[&lt;br /&gt;
				Expected date look:&lt;br /&gt;
					date.y = Integer&lt;br /&gt;
					date.m = Object, {&lt;br /&gt;
						length = Integer, &amp;lt;= 31&lt;br /&gt;
						id = Integer, &amp;lt;= 12&lt;br /&gt;
						name = String, vaild month name starting with capital letter&lt;br /&gt;
					}&lt;br /&gt;
					date.d = Integer, &amp;lt;= date.m.length&lt;br /&gt;
					date.era = String, vaild era shorthand&lt;br /&gt;
					date.circa = boolean&lt;br /&gt;
			]]&lt;br /&gt;
&lt;br /&gt;
			local match = {}&lt;br /&gt;
			match.match1, match.match2, match.match3 = dateRaw:match( value.pattern )&lt;br /&gt;
&lt;br /&gt;
			for ci, ciValue in pairs(circa) do&lt;br /&gt;
				for cmi,cmiValue in pairs(ciValue) do&lt;br /&gt;
					if ci == 1 then&lt;br /&gt;
						local patternDropped = value.pattern:gsub( &amp;quot;%)&amp;quot;, &amp;quot;&amp;quot; ):gsub( &amp;quot;%(&amp;quot;, &amp;quot;&amp;quot; )&lt;br /&gt;
						local patternFinal = &amp;quot;(&amp;quot; .. cmiValue .. &amp;quot;) &amp;quot; .. patternDropped&lt;br /&gt;
						local circaPossibleMatch = dateRaw:match( patternFinal )&lt;br /&gt;
						-- print(patternFinal)&lt;br /&gt;
						if circaPossibleMatch ~= nil then&lt;br /&gt;
							if string.lower( circaPossibleMatch ) == string.lower( cmiValue ) then&lt;br /&gt;
								date.circa = true&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					else&lt;br /&gt;
						local patternDropped = value.pattern:gsub( &amp;quot;%)&amp;quot;, &amp;quot;&amp;quot; ):gsub( &amp;quot;%(&amp;quot;, &amp;quot;&amp;quot; )&lt;br /&gt;
						local patternFinal = patternDropped .. &amp;quot; (&amp;quot; .. cmiValue .. &amp;quot;)&amp;quot;&lt;br /&gt;
						local circaPossibleMatch = dateRaw:match( patternFinal )&lt;br /&gt;
						if circaPossibleMatch ~= nil then&lt;br /&gt;
							if string.lower( circaPossibleMatch ) == string.lower( cmiValue:gsub(&amp;quot;%%%(&amp;quot;, &amp;quot;(&amp;quot;):gsub(&amp;quot;%%%)&amp;quot;, &amp;quot;)&amp;quot;) ) then&lt;br /&gt;
								date.circa = true&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				-- match.circa = dateRaw:match( &amp;quot;%d+ (AB)&amp;quot; )&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			for ei=1,2 do&lt;br /&gt;
				-- suffix or preffix&lt;br /&gt;
				local era = eraSuffix[ei]&lt;br /&gt;
				for emi, emiPattern in pairs(eraSuffix[ei]) do&lt;br /&gt;
					local patternDropped = value.pattern:gsub( &amp;quot;%)&amp;quot;, &amp;quot;&amp;quot; ):gsub( &amp;quot;%(&amp;quot;, &amp;quot;&amp;quot; )&lt;br /&gt;
					local patternFinal = patternDropped .. &amp;quot; (&amp;quot; .. emiPattern .. &amp;quot;)&amp;quot;&lt;br /&gt;
					local circaPossibleMatch = dateRaw:match( patternFinal )&lt;br /&gt;
					if circaPossibleMatch ~= nil then&lt;br /&gt;
						if string.lower( circaPossibleMatch ) == string.lower( emiPattern ) then&lt;br /&gt;
							date.era = emiPattern&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			-- Each value.pattern (pattern) has got an value.format (date format) associated with it&lt;br /&gt;
			-- this loops iterates thorough them and assings variables to proper value.formats&lt;br /&gt;
&lt;br /&gt;
			for i=1,string.len( value.format ) + 1 do&lt;br /&gt;
				date[string.sub( value.format, i, i)] = match[&amp;quot;match&amp;quot; .. i]&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			if tonumber(date.y) ~= nil then&lt;br /&gt;
				date.y = tonumber(date.y)&lt;br /&gt;
				matched = true&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			if date.m ~= nil and date.m ~= &amp;quot;&amp;quot; then&lt;br /&gt;
				matched = false&lt;br /&gt;
				local month = {}&lt;br /&gt;
				if tonumber(date.m) ~= nil then&lt;br /&gt;
					if (tonumber( date.m ) or 13) &amp;lt;= 12 then&lt;br /&gt;
						month.name = monthsNames[tonumber( date.m )]&lt;br /&gt;
						month.length = monthsDays[tonumber( date.m )]&lt;br /&gt;
						month.id = tonumber( date.m )&lt;br /&gt;
						matched = true&lt;br /&gt;
					else&lt;br /&gt;
						if value.format == &amp;#039;mdy&amp;#039; then&lt;br /&gt;
							-- print(&amp;#039;INVALID ENTRY\n\n&amp;#039;)&lt;br /&gt;
							return &amp;quot;Invalid entry&amp;quot;&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				elseif #date.m &amp;gt; 1 then&lt;br /&gt;
					for mi=1,#monthsNames do&lt;br /&gt;
						local monthPrefixPossible = string.upper( string.sub( monthsNames[mi], 1, 3 ) )&lt;br /&gt;
						local monthPrefix = string.upper( string.sub( date.m, 1, 3 ) )&lt;br /&gt;
						if monthPrefix == monthPrefixPossible then&lt;br /&gt;
							-- print(monthPrefix, monthPrefixPossible)&lt;br /&gt;
							month.name = monthsNames[mi]&lt;br /&gt;
							month.length = monthsDays[mi]&lt;br /&gt;
							month.id = mi&lt;br /&gt;
							matched = true&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				else&lt;br /&gt;
					date.m = nil&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				if month.name ~= nil and month.length ~= nil then&lt;br /&gt;
					matched = true&lt;br /&gt;
					date.m = month&lt;br /&gt;
					if date.d ~= nil and date.d ~= &amp;quot;&amp;quot; then&lt;br /&gt;
						matched = false&lt;br /&gt;
						date.d = tonumber( date.d )&lt;br /&gt;
						if date.m.length == 29 and date.y ~= nil then&lt;br /&gt;
							if isLeapYear(date.y) == true and date.d &amp;lt;= 29 then&lt;br /&gt;
								matched = true&lt;br /&gt;
							else&lt;br /&gt;
								-- print(&amp;#039;INVALID ENTRY\n\n&amp;#039;)&lt;br /&gt;
								matched = true&lt;br /&gt;
								return &amp;quot;Invalid entry&amp;quot;&lt;br /&gt;
							end&lt;br /&gt;
						elseif not (date.d &amp;lt;= month.length) then&lt;br /&gt;
							date.d = nil&lt;br /&gt;
						else&lt;br /&gt;
							matched = true&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if matched == true then&lt;br /&gt;
				-- local dateMsg = &amp;quot;&amp;quot;&lt;br /&gt;
				-- if date.y then&lt;br /&gt;
					-- dateMsg = dateMsg .. date.y&lt;br /&gt;
				-- end&lt;br /&gt;
				-- if date.m then&lt;br /&gt;
				-- 	dateMsg = dateMsg .. &amp;quot; &amp;quot; ..  date.m.name&lt;br /&gt;
				-- end&lt;br /&gt;
				-- if date.d then&lt;br /&gt;
				-- 	dateMsg = dateMsg .. &amp;quot; &amp;quot; ..  date.d&lt;br /&gt;
				-- end&lt;br /&gt;
				-- if date.circa then&lt;br /&gt;
				-- 	dateMsg = &amp;quot;circa &amp;quot; .. dateMsg&lt;br /&gt;
				-- end&lt;br /&gt;
				-- if date.era then&lt;br /&gt;
				-- 	dateMsg = dateMsg .. &amp;quot; &amp;quot; .. date.era&lt;br /&gt;
				-- end&lt;br /&gt;
				-- print( &amp;#039;FORMAT: &amp;#039; .. value.format )&lt;br /&gt;
				-- print( &amp;#039;PATTERN: &amp;#039; .. value.pattern )&lt;br /&gt;
				-- print( &amp;#039;CIRCA: &amp;#039; .. tostring(date.circa) )&lt;br /&gt;
				-- print( &amp;#039;ERA: &amp;#039; .. tostring(date.era) )&lt;br /&gt;
				-- print( &amp;#039;--- Result ---&amp;#039; )&lt;br /&gt;
				-- print(dateMsg)&lt;br /&gt;
				-- print(&amp;#039;\n\n&amp;#039;)&lt;br /&gt;
				return date&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
formatDate = function ( date, formatRaw )&lt;br /&gt;
	if (date == nil) or (date == &amp;#039;Invalid entry&amp;#039;) then&lt;br /&gt;
		return &amp;#039;Invalid entry&amp;#039;&lt;br /&gt;
	elseif formatRaw ~= nil then&lt;br /&gt;
		local format = allowedFormats[formatRaw] or &amp;#039;invalidFormat&amp;#039;&lt;br /&gt;
		if format == &amp;#039;invalidFormat&amp;#039; then&lt;br /&gt;
			local returnValue = &amp;quot;&amp;quot;&lt;br /&gt;
			if date.d then&lt;br /&gt;
				returnValue = returnValue .. date.d .. &amp;quot; &amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			if date.m then&lt;br /&gt;
				returnValue = returnValue .. date.m.name .. &amp;quot; &amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			if date.y then&lt;br /&gt;
				returnValue = returnValue .. date.y .. &amp;quot; &amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			if date.circa then&lt;br /&gt;
				returnValue = &amp;quot;circa &amp;quot; .. returnValue&lt;br /&gt;
			end&lt;br /&gt;
			if date.era then&lt;br /&gt;
				returnValue = returnValue .. date.era .. &amp;quot; &amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			return returnValue&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local finalFormat = format&lt;br /&gt;
		local formatIterator = format:gsub(&amp;quot;%$&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
		for l=1,#formatIterator do&lt;br /&gt;
			local char = formatIterator:sub(l,l)&lt;br /&gt;
			-- Day&lt;br /&gt;
			if char == &amp;quot;d&amp;quot; then&lt;br /&gt;
				if date.d == nil then&lt;br /&gt;
					if formatRaw == &amp;quot;iso&amp;quot; then return &amp;quot;Invalid entry&amp;quot; end&lt;br /&gt;
					finalFormat = finalFormat:gsub(&amp;quot;%$d%$&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
				elseif #tostring(date.d) &amp;lt; 2 then&lt;br /&gt;
					finalFormat = finalFormat:gsub(&amp;quot;%$d%$&amp;quot;, 0 .. date.d)&lt;br /&gt;
				else&lt;br /&gt;
					finalFormat = finalFormat:gsub(&amp;quot;%$d%$&amp;quot;, date.d)&lt;br /&gt;
				end&lt;br /&gt;
			elseif char == &amp;quot;D&amp;quot; then&lt;br /&gt;
				if date.d == nil then&lt;br /&gt;
					if formatRaw == &amp;quot;iso&amp;quot; then return &amp;quot;Invalid entry&amp;quot; end&lt;br /&gt;
					finalFormat = finalFormat:gsub(&amp;quot;%$D%$&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
				else&lt;br /&gt;
					finalFormat = finalFormat:gsub(&amp;quot;%$D%$&amp;quot;, date.d)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			-- Year&lt;br /&gt;
			if char == &amp;quot;y&amp;quot; then&lt;br /&gt;
				if date.y == nil then&lt;br /&gt;
					finalFormat = finalFormat:gsub(&amp;quot;%$y%$&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
				else&lt;br /&gt;
					finalFormat = finalFormat:gsub(&amp;quot;%$y%$&amp;quot;, date.y)&lt;br /&gt;
				end&lt;br /&gt;
			elseif char == &amp;quot;Y&amp;quot; then&lt;br /&gt;
				if date.y == nil then&lt;br /&gt;
					if formatRaw == &amp;quot;iso&amp;quot; then return &amp;quot;Invalid entry&amp;quot; end&lt;br /&gt;
					finalFormat = finalFormat:gsub(&amp;quot;%$Y%$&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
				elseif 0 &amp;lt;= date.y and date.y &amp;lt;= 9999 then&lt;br /&gt;
					local zero = &amp;quot;0&amp;quot;&lt;br /&gt;
					finalFormat = finalFormat:gsub(&amp;quot;%$Y%$&amp;quot;, zero:rep(4 - #tostring(date.y)) .. date.y)&lt;br /&gt;
				else&lt;br /&gt;
					return &amp;quot;Invalid entry&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			-- Era&lt;br /&gt;
			if char == &amp;quot;E&amp;quot; then&lt;br /&gt;
				if date.era == nil then&lt;br /&gt;
					if formatRaw == &amp;quot;iso&amp;quot; then&lt;br /&gt;
						return &amp;quot;Invalid entry&amp;quot;&lt;br /&gt;
					end&lt;br /&gt;
					finalFormat = finalFormat:gsub(&amp;quot;%$E%$&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
				else&lt;br /&gt;
					finalFormat = finalFormat:gsub(&amp;quot;%$E%$&amp;quot;, date.era)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			-- Month&lt;br /&gt;
			if char == &amp;quot;m&amp;quot; then&lt;br /&gt;
				if date.m == nil then&lt;br /&gt;
					if formatRaw == &amp;quot;iso&amp;quot; then return &amp;quot;Invalid entry&amp;quot; end&lt;br /&gt;
					finalFormat = finalFormat:gsub(&amp;quot;%$m%$&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
				else&lt;br /&gt;
					local zero = &amp;quot;0&amp;quot;&lt;br /&gt;
					finalFormat = finalFormat:gsub(&amp;quot;%$m%$&amp;quot;, zero:rep(2 - #tostring(date.m.id)) .. date.m.id)&lt;br /&gt;
				end&lt;br /&gt;
			elseif char == &amp;quot;M&amp;quot; then&lt;br /&gt;
				if date.m == nil then&lt;br /&gt;
					if formatRaw == &amp;quot;iso&amp;quot; then return &amp;quot;Invalid entry&amp;quot; end&lt;br /&gt;
					finalFormat = finalFormat:gsub(&amp;quot;%$M%$&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
				else&lt;br /&gt;
					finalFormat = finalFormat:gsub(&amp;quot;%$M%$&amp;quot;, date.m.name)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		-- Circa&lt;br /&gt;
		if date.circa then&lt;br /&gt;
			if formatRaw == &amp;quot;iso&amp;quot; then&lt;br /&gt;
				return &amp;quot;ISO format does not allow uncertain dates&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			finalFormat = &amp;quot;circa &amp;quot; .. finalFormat&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if date.era and formatRaw == &amp;quot;iso&amp;quot; then&lt;br /&gt;
			return &amp;quot;ISO format does not allow embedding era into date&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		finalFormat = finalFormat:gsub(&amp;quot;^%s*(.-)%s*$&amp;quot;, &amp;quot;%1&amp;quot;)&lt;br /&gt;
		finalFormat = finalFormat:gsub(&amp;quot;%s+&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
		return finalFormat&lt;br /&gt;
	else&lt;br /&gt;
		local returnValue = &amp;quot;&amp;quot;&lt;br /&gt;
		if date.d then&lt;br /&gt;
			returnValue = returnValue .. date.d .. &amp;quot; &amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		if date.m then&lt;br /&gt;
			returnValue = returnValue .. date.m.name .. &amp;quot; &amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		if date.y then&lt;br /&gt;
			returnValue = returnValue .. date.y .. &amp;quot; &amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		if date.circa then&lt;br /&gt;
			returnValue = &amp;quot;circa &amp;quot; .. returnValue&lt;br /&gt;
		end&lt;br /&gt;
		if date.era then&lt;br /&gt;
			returnValue = returnValue .. date.era .. &amp;quot; &amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		return returnValue&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.convertTest = function ( frame )&lt;br /&gt;
  local msg = &amp;quot;&amp;quot;&lt;br /&gt;
  for i=1, #testList do&lt;br /&gt;
		local testDate = testList[i]&lt;br /&gt;
		msg = msg .. &amp;quot;&amp;lt;br/&amp;gt; &amp;lt;ul&amp;gt;Raw date: &amp;quot; .. testDate&lt;br /&gt;
		for key,value in pairs(allowedFormats) do&lt;br /&gt;
			msg = msg .. &amp;quot;&amp;lt;li&amp;gt; &amp;lt;b&amp;gt;Format:&amp;lt;/b&amp;gt; &amp;quot; ..  key .. &amp;quot; | &amp;lt;b&amp;gt;Result:&amp;lt;/b&amp;gt; &amp;quot; .. formatDate( extractData( testDate ), key ) .. &amp;quot;&amp;lt;/li&amp;gt;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		msg = msg .. &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot;&lt;br /&gt;
  end&lt;br /&gt;
	return msg&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.convertDate = function ( frame )&lt;br /&gt;
  local date = frame.args.date&lt;br /&gt;
	local format = frame.args.format&lt;br /&gt;
	if date == nil or date == &amp;quot;&amp;quot; then return &amp;quot;Invalid entry&amp;quot; end&lt;br /&gt;
	return formatDate( extractData( date ), format )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Takidelfin</name></author>
	</entry>
</feed>