<?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%2FN3rsti%2FDates2</id>
	<title>Module:Sandbox/N3rsti/Dates2 - 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%2FN3rsti%2FDates2"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/N3rsti/Dates2&amp;action=history"/>
	<updated>2026-05-28T20:11:22Z</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/N3rsti/Dates2&amp;diff=145858&amp;oldid=prev</id>
		<title>imported&gt;N3rsti: Add comments</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/N3rsti/Dates2&amp;diff=145858&amp;oldid=prev"/>
		<updated>2020-01-18T14:41:51Z</updated>

		<summary type="html">&lt;p&gt;Add comments&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local date_words = {&lt;br /&gt;
	months={&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;
	short_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;jun&amp;quot;, &amp;quot;jul&amp;quot;, &amp;quot;aug&amp;quot;, &amp;quot;sep&amp;quot;, &amp;quot;oct&amp;quot;, &amp;quot;nov&amp;quot;, &amp;quot;dec&amp;quot;},&lt;br /&gt;
	accepted_endings = {&amp;quot;AD&amp;quot;, &amp;quot;BCE&amp;quot;, &amp;quot;BC&amp;quot;, &amp;quot;CE&amp;quot;},&lt;br /&gt;
	months_days = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},&lt;br /&gt;
	number_endings = {&amp;quot;st&amp;quot;, &amp;quot;nd&amp;quot;, &amp;quot;rd&amp;quot;, &amp;quot;th&amp;quot;},&lt;br /&gt;
	circa_words = {&amp;#039;circa&amp;#039;, &amp;#039;sometime&amp;#039;, &amp;#039;around&amp;#039;, &amp;#039;uncertain&amp;#039;},&lt;br /&gt;
	accepted_words = {&amp;#039;year&amp;#039;, &amp;#039;month&amp;#039;, &amp;#039;day&amp;#039;}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Search for keywords&lt;br /&gt;
function check_valid(date_text, date_table)&lt;br /&gt;
	local date_sign = &amp;quot;[^%s]+&amp;quot;&lt;br /&gt;
	if string.match(date_text, &amp;quot;%-&amp;quot;) then&lt;br /&gt;
		date_sign = &amp;quot;[^%-]+&amp;quot;&lt;br /&gt;
	elseif string.match(date_text, &amp;quot;%/&amp;quot;) then&lt;br /&gt;
		date_sign = &amp;quot;[^%/]+&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	for word in string.gmatch(date_text, date_sign) do&lt;br /&gt;
			table.insert(date_table, word)&lt;br /&gt;
	end&lt;br /&gt;
	for counter, month in pairs(date_words.months) do&lt;br /&gt;
		for _, word in pairs(date_table) do&lt;br /&gt;
			if string.lower(word) == month or string.lower(word) == date_words.short_months[counter] then&lt;br /&gt;
				return {is_valid=true}	&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for _, ending in pairs(date_words.accepted_endings) do&lt;br /&gt;
		for _, word in pairs(date_table) do&lt;br /&gt;
			if word == ending then&lt;br /&gt;
				return {is_valid=true}	&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for _, ending in pairs(date_words.circa_words) do&lt;br /&gt;
		if string.match(date_text, ending) then&lt;br /&gt;
			return {is_valid=true}	&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for _, word in pairs(date_words.accepted_words) do&lt;br /&gt;
		if string.match(date_text, word) then&lt;br /&gt;
			return {is_valid=true}	&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Define format from submitted date&lt;br /&gt;
function detect_date(date_text)&lt;br /&gt;
	local date_sign = &amp;quot;[^%s]+&amp;quot;&lt;br /&gt;
	local sign, date_ending = &amp;quot;&amp;quot;&lt;br /&gt;
	local circa_ending = &amp;quot;&amp;quot;&lt;br /&gt;
	if string.match(date_text, &amp;quot;%-&amp;quot;) then&lt;br /&gt;
		date_sign = &amp;quot;[^%-]+&amp;quot;&lt;br /&gt;
	elseif string.match(date_text, &amp;quot;%/&amp;quot;) then&lt;br /&gt;
		date_sign = &amp;quot;[^%/]+&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	local date_table = {}&lt;br /&gt;
	for word in string.gmatch(date_text, date_sign) do&lt;br /&gt;
		table.insert(date_table, word)&lt;br /&gt;
	end&lt;br /&gt;
	for _, ending in pairs(date_words.accepted_endings) do&lt;br /&gt;
		for _, word in pairs(date_table) do&lt;br /&gt;
			if word == ending then&lt;br /&gt;
				date_ending = ending&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for _, num_end in pairs(date_words.number_endings) do&lt;br /&gt;
		for _, word in pairs(date_table) do&lt;br /&gt;
			if string.sub(word, -#num_end) == num_end then&lt;br /&gt;
				num_ending = num_end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for _, ending in pairs(date_words.circa_words) do&lt;br /&gt;
		if string.match(date_text, ending) then&lt;br /&gt;
			circa_ending = &amp;quot;circa&amp;quot;	&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	date_ending = date_ending or &amp;quot;&amp;quot;&lt;br /&gt;
	num_ending = num_ending or &amp;quot;&amp;quot;&lt;br /&gt;
	if #date_table == 1 and tonumber(date_text) then&lt;br /&gt;
			return {day=date_text}	&lt;br /&gt;
	end&lt;br /&gt;
	if string.match(date_text, &amp;quot;%-&amp;quot;) then&lt;br /&gt;
		date_sign = &amp;quot;[^%-]+&amp;quot;&lt;br /&gt;
		year, month, day = string.match(date_text, &amp;quot;(%d+)-(%d+)-(%d+)&amp;quot;)&lt;br /&gt;
		if year then&lt;br /&gt;
			return {day=day, month=month, year=year, date_ending=date_ending, circa_ending=circa_ending}	&lt;br /&gt;
		end&lt;br /&gt;
	elseif string.match(date_text, &amp;quot;%/&amp;quot;) then&lt;br /&gt;
		date_sign = &amp;quot;[^%/]+&amp;quot;&lt;br /&gt;
		day, month, year = string.match(date_text, &amp;quot;(%d+)/(%d+)/(%d+)&amp;quot;)&lt;br /&gt;
		if day then&lt;br /&gt;
			return {day=day, month=month, year=year, date_ending=date_ending, circa_ending=circa_ending}	&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if #date_table == 2 and tonumber(date_table[1]) and tonumber(date_table[2]) then&lt;br /&gt;
		local day, year = string.match(date_text, &amp;quot;(%d+) (%d+)&amp;quot;)&lt;br /&gt;
		if day then&lt;br /&gt;
			return {year=year, date_ending=date_ending, circa_ending=circa_ending}	&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if check_valid(date_text, date_table) then&lt;br /&gt;
		local day, month, year = string.match(date_text, &amp;quot;(%d+)&amp;quot; .. num_ending .. &amp;quot; (%w+) (%d+)&amp;quot;)&lt;br /&gt;
		if day then&lt;br /&gt;
			return {day=day, month=month, year=year, date_ending=date_ending, circa_ending=circa_ending}	&lt;br /&gt;
		else&lt;br /&gt;
			local day, month, year = string.match(date_text, &amp;quot;(%d+) (%w+) (%d+)&amp;quot;)&lt;br /&gt;
			if day then&lt;br /&gt;
				return {day=day, month=month, year=year, date_ending=date_ending, circa_ending=circa_ending}&lt;br /&gt;
			end&lt;br /&gt;
			month, day, year = string.match(date_text, &amp;quot;(%w+) (%d+), (%d+)&amp;quot;) -- December 21, 2019&lt;br /&gt;
			if day then&lt;br /&gt;
				return 	{day=day, month=month, year=year, date_ending=date_ending, circa_ending=circa_ending}	&lt;br /&gt;
			end&lt;br /&gt;
			for word in string.gmatch(date_text, date_sign) do&lt;br /&gt;
				table.insert(date_table, word)&lt;br /&gt;
			end&lt;br /&gt;
			day=string.match(date_text, &amp;quot;(%d+)&amp;quot; .. num_ending)&lt;br /&gt;
			_, year = string.match(date_text, &amp;quot;(.+) (%d+)&amp;quot;)&lt;br /&gt;
			if day and year then&lt;br /&gt;
				for _, arr_month in pairs(date_words.months) do&lt;br /&gt;
					month = arr_month&lt;br /&gt;
				end&lt;br /&gt;
				if month then&lt;br /&gt;
					return {day=day, month=month, year=year, date_ending=date_ending, circa_ending=circa_ending}	&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			day, month = string.match(date_text, &amp;quot;(%d+) (%d+)&amp;quot;)&lt;br /&gt;
			if day then&lt;br /&gt;
				return 	{day=day, year=year, date_ending=date_ending, circa_ending=circa_ending}&lt;br /&gt;
			end&lt;br /&gt;
			day, month = string.match(date_text, &amp;quot;(%d+) (%w+)&amp;quot;)&lt;br /&gt;
			if day then&lt;br /&gt;
				return {day=day, month=month, date_ending=date_ending, circa_ending=circa_ending}	&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
		&lt;br /&gt;
	end&lt;br /&gt;
	if check_valid(date_text, date_table) then&lt;br /&gt;
		year = string.match(date_text, &amp;quot;(%d+) (.+)&amp;quot;)&lt;br /&gt;
		if year then&lt;br /&gt;
			return {year=year, circa_ending=circa_ending, date_ending=date_ending}	&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	day, month = string.match(date_text, &amp;quot;(%d+) (%d+)&amp;quot;)&lt;br /&gt;
	if day then&lt;br /&gt;
		return {day=day, month=month, year=year, date_ending=date_ending, circa_ending=circa_ending}	&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Format date to expected format&lt;br /&gt;
function p.format_date(frame)&lt;br /&gt;
	local date_text = frame.args.date or &amp;quot;&amp;quot;&lt;br /&gt;
	local date_format = frame.args.format or &amp;quot;&amp;quot;&lt;br /&gt;
	local date_ending = &amp;quot;&amp;quot;&lt;br /&gt;
	local day = &amp;quot;&amp;quot;&lt;br /&gt;
	local month = &amp;quot;&amp;quot;&lt;br /&gt;
	local year = &amp;quot;&amp;quot;&lt;br /&gt;
	local circa_ending = &amp;quot;&amp;quot;&lt;br /&gt;
	local date_ending = &amp;quot;&amp;quot;&lt;br /&gt;
	if (string.match(date_text, &amp;quot;/&amp;quot;) and date_format == &amp;quot;&amp;quot;) or (string.match(date_text, &amp;quot;-&amp;quot;) and date_format == &amp;quot;&amp;quot;) then&lt;br /&gt;
		date_format = &amp;quot;iso&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if detect_date(date_text) and detect_date(date_text).day then&lt;br /&gt;
		day = detect_date(date_text).day or &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if detect_date(date_text) and detect_date(date_text).month then&lt;br /&gt;
		month = detect_date(date_text).month or &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if detect_date(date_text) and detect_date(date_text).year then&lt;br /&gt;
		year = detect_date(date_text).year or &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if detect_date(date_text) and detect_date(date_text).date_ending then&lt;br /&gt;
		date_ending = detect_date(date_text).date_ending or &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if detect_date(date_text) and detect_date(date_text).circa_ending then&lt;br /&gt;
		circa_ending = detect_date(date_text).circa_ending or &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	for month_num=1, #date_words.months do&lt;br /&gt;
		if string.match(string.lower(date_text), date_words.months[month_num]) or string.match(string.lower(date_text), date_words.short_months[month_num]) then&lt;br /&gt;
			month = date_words.months[month_num]&lt;br /&gt;
			if tonumber(year) and tonumber(year) % 4 == 0 then&lt;br /&gt;
				date_words.months_days[month_num] = date_words.months_days[month_num] + 1	&lt;br /&gt;
			end&lt;br /&gt;
			if tonumber(day) &amp;gt; date_words.months_days[month_num] then&lt;br /&gt;
				return &amp;quot;Invalid entry&amp;quot;	&lt;br /&gt;
			end&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local index={}&lt;br /&gt;
	for k,v in pairs(date_words.months) do&lt;br /&gt;
	   index[v]=k&lt;br /&gt;
	end&lt;br /&gt;
	month = month:gsub(&amp;quot;^%l&amp;quot;, string.upper)&lt;br /&gt;
	if date_format == &amp;quot;iso&amp;quot; then&lt;br /&gt;
		if not tonumber(month) then&lt;br /&gt;
			month = tostring(index[string.lower(month)])&lt;br /&gt;
			if #month == 1 then&lt;br /&gt;
				month = &amp;quot;0&amp;quot; .. month	&lt;br /&gt;
			end&lt;br /&gt;
			if #day == 1 then&lt;br /&gt;
				day = &amp;quot;0&amp;quot; .. day&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return circa_ending .. &amp;quot; &amp;quot; .. year .. &amp;quot;-&amp;quot; .. month .. &amp;quot;-&amp;quot; .. day .. &amp;quot; &amp;quot; .. date_ending&lt;br /&gt;
	elseif date_format == &amp;quot;mdy&amp;quot; then&lt;br /&gt;
		if tonumber(month) then&lt;br /&gt;
			month = date_words.months[tonumber(month)] or &amp;quot;&amp;quot;&lt;br /&gt;
			month = month:gsub(&amp;quot;^%l&amp;quot;, string.upper) or &amp;quot;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		return circa_ending .. &amp;quot; &amp;quot; .. month .. &amp;quot; &amp;quot; ..  day .. &amp;quot;, &amp;quot; .. year .. &amp;quot; &amp;quot; .. date_ending&lt;br /&gt;
	elseif date_format == &amp;quot;year&amp;quot; then&lt;br /&gt;
		return circa_ending .. &amp;quot; &amp;quot; .. year .. &amp;quot; &amp;quot; .. date_ending&lt;br /&gt;
	end&lt;br /&gt;
	if day == &amp;quot;&amp;quot; and month == &amp;quot;&amp;quot; and year == &amp;quot;&amp;quot; then&lt;br /&gt;
		return &amp;quot;Invalid entry&amp;quot;	&lt;br /&gt;
	end&lt;br /&gt;
	if tonumber(month) then&lt;br /&gt;
		month = date_words.months[tonumber(month)] or &amp;quot;&amp;quot;&lt;br /&gt;
		month = month:gsub(&amp;quot;^%l&amp;quot;, string.upper) or &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if month == date_ending then&lt;br /&gt;
		month = &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	if year == date_ending then&lt;br /&gt;
		year = &amp;quot;&amp;quot;	&lt;br /&gt;
	end&lt;br /&gt;
	return circa_ending .. &amp;quot; &amp;quot; .. day .. &amp;quot; &amp;quot; .. month  .. &amp;quot; &amp;quot; .. year .. &amp;quot; &amp;quot;  .. date_ending&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;N3rsti</name></author>
	</entry>
</feed>