<?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%2FDates</id>
	<title>Module:Sandbox/N3rsti/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%2FN3rsti%2FDates"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/N3rsti/Dates&amp;action=history"/>
	<updated>2026-05-28T20:11:20Z</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/Dates&amp;diff=145857&amp;oldid=prev</id>
		<title>imported&gt;N3rsti at 19:35, 17 January 2020</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/N3rsti/Dates&amp;diff=145857&amp;oldid=prev"/>
		<updated>2020-01-17T19:35:43Z</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;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;
-- Detect day, month, year and format&lt;br /&gt;
function detect_date(date_text)&lt;br /&gt;
	-- Variables setup&lt;br /&gt;
	local date_sign = &amp;quot;[^%s]+&amp;quot;&lt;br /&gt;
	local sign = &amp;quot;&amp;quot;&lt;br /&gt;
	local date_table = {}&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;
	local index={}&lt;br /&gt;
	for k,v in pairs(date_table) do&lt;br /&gt;
	   index[v]=k&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Date detection&lt;br /&gt;
	if date_sign == &amp;quot;[^%/]+&amp;quot; then&lt;br /&gt;
		sign = &amp;quot;/&amp;quot;&lt;br /&gt;
	elseif date_sign == &amp;quot;[^%-]+&amp;quot; then&lt;br /&gt;
		sign = &amp;quot;-&amp;quot;	&lt;br /&gt;
	end&lt;br /&gt;
	if date_sign == &amp;quot;[^%/]+&amp;quot; or date_sign == &amp;quot;[^%-]+&amp;quot; then&lt;br /&gt;
		day, month, year = string.match(date_text, &amp;quot;(%d+)&amp;quot;.. sign .. &amp;quot;(%d+)&amp;quot; .. sign .. &amp;quot;(%d+)&amp;quot;)&lt;br /&gt;
		if #day &amp;gt; 2 then&lt;br /&gt;
			return {day=year, month=month, year=day, sign=sign}&lt;br /&gt;
		end&lt;br /&gt;
		return {day=day, month=month, year=year, sign=sign}&lt;br /&gt;
&lt;br /&gt;
		else&lt;br /&gt;
		for _, ending in pairs(date_words.number_endings) do&lt;br /&gt;
			day, month, year = string.match(date_text, &amp;quot;(%d+)&amp;quot; .. ending .. &amp;quot; (%w+) (%d+)&amp;quot;)&lt;br /&gt;
			if day then&lt;br /&gt;
				return {day=day, month=month, year=year}&lt;br /&gt;
			end&lt;br /&gt;
			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}&lt;br /&gt;
			end&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for month=1, #date_words.months do&lt;br /&gt;
		if string.match(string.lower(date_text), date_words.months[month]) or string.match(string.lower(date_text), date_words.short_months[month]) then&lt;br /&gt;
			local selected_month = date_words.months[month]&lt;br /&gt;
			local month_index = index[selected_month] -- Gets index of month name&lt;br /&gt;
			if string.match(date_text, &amp;quot;,&amp;quot;) then&lt;br /&gt;
				month, day, year = string.match(date_text, &amp;quot;(%w+) (%d+), (%d+)&amp;quot;)&lt;br /&gt;
			else&lt;br /&gt;
				&lt;br /&gt;
				day, month, year = string.match(date_text, &amp;quot;(%d+) (%w+) (%d+)&amp;quot;)&lt;br /&gt;
				-- Month is nil when pattern didn&amp;#039;t work so there are 2 options in this case: dmy or my&lt;br /&gt;
				if not month then&lt;br /&gt;
					for _, ending in pairs(date_words.number_endings) do&lt;br /&gt;
							day, month, year = string.match(date_text, &amp;quot;(%d+)&amp;quot; .. ending .. &amp;quot;(%w+) (%d+)&amp;quot;)&lt;br /&gt;
							if day then&lt;br /&gt;
								return {day=day, month=month, year=year}&lt;br /&gt;
							end&lt;br /&gt;
							break&lt;br /&gt;
					end&lt;br /&gt;
					month, year = string.match(date_text, &amp;quot;(%w+) (%d+)&amp;quot;)&lt;br /&gt;
					if not month then&lt;br /&gt;
						day, month = string.match(date_text, &amp;quot;(%d+) (%w+)&amp;quot;)&lt;br /&gt;
						month = month:gsub(&amp;quot;^%l&amp;quot;, string.upper)&lt;br /&gt;
						return {day=day, month=month}&lt;br /&gt;
					end&lt;br /&gt;
					month = month:gsub(&amp;quot;^%l&amp;quot;, string.upper)&lt;br /&gt;
					return {month=month, year=year}&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			month = month:gsub(&amp;quot;^%l&amp;quot;, string.upper)&lt;br /&gt;
			return {day=day, month=month, year=year}&lt;br /&gt;
			&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	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}	&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Formatting date function&lt;br /&gt;
function p.format_date(frame)&lt;br /&gt;
	local date_format = frame.args.format or &amp;quot;&amp;quot;&lt;br /&gt;
	local date_text = frame.args.date or &amp;quot;&amp;quot;&lt;br /&gt;
	local circa_message, out, date_ending = &amp;quot;&amp;quot;&lt;br /&gt;
	local is_valid = false&lt;br /&gt;
	if date_text == &amp;quot;&amp;quot; then&lt;br /&gt;
		return &amp;quot;No parameter supplied&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	local date_sign = &amp;quot;[^%s]+&amp;quot;&lt;br /&gt;
	local sign = &amp;quot;&amp;quot;&lt;br /&gt;
	local date_table = {}&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 _, ending in pairs(date_words.accepted_endings) do&lt;br /&gt;
		if string.match(date_text, ending) then&lt;br /&gt;
			is_valid = true&lt;br /&gt;
			date_ending = ending&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	date_ending = date_ending or &amp;quot;&amp;quot;&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;
				is_valid = true&lt;br /&gt;
				month = date_words.months[month_num]&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
	end&lt;br /&gt;
	for _, ending in pairs(date_words.number_endings) do&lt;br /&gt;
		if string.sub(string.lower(date_text), #ending) == ending then&lt;br /&gt;
			is_valid = true&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for _, message in pairs(date_words.circa_words) do&lt;br /&gt;
		if string.match(string.lower(date_text), message) then&lt;br /&gt;
			circa_message = &amp;quot;circa &amp;quot;&lt;br /&gt;
			is_valid = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	for _, word in pairs(date_words.accepted_words) do&lt;br /&gt;
		if string.match(string.lower(date_text), word) then&lt;br /&gt;
			is_valid = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	if detect_date(date_text) and (detect_date(date_text).sign == &amp;quot;/&amp;quot; or detect_date(date_text).sign == &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 date_format == &amp;quot;iso&amp;quot; then&lt;br /&gt;
		local month = detect_date(date_text).month&lt;br /&gt;
		if not tonumber(month) then&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 = index[string.lower(month)]&lt;br /&gt;
			local months_days = date_words.months_days[month]&lt;br /&gt;
		end&lt;br /&gt;
		local months_days = date_words.months_days[month]&lt;br /&gt;
		local day = detect_date(date_text).day or &amp;quot;&amp;quot;&lt;br /&gt;
		return circa_message .. (detect_date(date_text).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;
		local month = detect_date(date_text).month&lt;br /&gt;
		local month_num = month&lt;br /&gt;
		if not tonumber(month) then&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_num = index[string.lower(month)]&lt;br /&gt;
			&lt;br /&gt;
		else&lt;br /&gt;
			month = date_words.months[tonumber(month_num)]&lt;br /&gt;
		end&lt;br /&gt;
		months_days = date_words.months_days[tonumber(month_num)]&lt;br /&gt;
		if tonumber(detect_date(date_text).year) % 4 == 0 then&lt;br /&gt;
			months_days = months_days + 1&lt;br /&gt;
		end&lt;br /&gt;
		if months_days &amp;lt; tonumber(detect_date(date_text).day) then&lt;br /&gt;
			return &amp;quot;Invalid entry&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		month = month:gsub(&amp;quot;^%l&amp;quot;, string.upper)&lt;br /&gt;
		return circa_message .. (month .. &amp;quot; &amp;quot; .. detect_date(date_text).day ..&amp;quot;, &amp;quot; .. detect_date(date_text).year) .. &amp;quot; &amp;quot; .. date_ending&lt;br /&gt;
	elseif date_format == &amp;quot;year&amp;quot; then&lt;br /&gt;
		return circa_message .. detect_date(date_text).year .. &amp;quot; &amp;quot; .. date_ending&lt;br /&gt;
	end&lt;br /&gt;
	local is_number = true&lt;br /&gt;
	if not is_valid then&lt;br /&gt;
		for _, date_word in pairs(date_table) do&lt;br /&gt;
			if not tonumber(date_word) then&lt;br /&gt;
				is_number = false&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if not is_valid and tonumber(date_text) then&lt;br /&gt;
		return date_text&lt;br /&gt;
	elseif is_number then&lt;br /&gt;
		local day, month, year, ending = string.match(date_text, &amp;quot;(%d+) (%w+) (%d+)&amp;quot;)&lt;br /&gt;
		if month then&lt;br /&gt;
			for counter, short_month in pairs(date_words.short_months) do&lt;br /&gt;
				for _, word in pairs(date_table) do&lt;br /&gt;
					if string.lower(word) == short_month then&lt;br /&gt;
						selected_month = date_words.months[counter]&lt;br /&gt;
						break&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			if selected_month then&lt;br /&gt;
				month_capitalize = selected_month:gsub(&amp;quot;^%l&amp;quot;, string.upper)&lt;br /&gt;
				date_text = string.gsub(date_text, month, month_capitalize)&lt;br /&gt;
			else&lt;br /&gt;
				month_capitalize = month:gsub(&amp;quot;^%l&amp;quot;, string.upper)&lt;br /&gt;
				date_text = string.gsub(date_text, month, month_capitalize)&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			return circa_message .. date_text&lt;br /&gt;
			&lt;br /&gt;
		end&lt;br /&gt;
		for _, word in pairs(date_table) do&lt;br /&gt;
			for _, num_ending in pairs(date_words.number_endings) do&lt;br /&gt;
				if string.match(word, &amp;quot;(%d+)&amp;quot; .. num_ending) then&lt;br /&gt;
					day = string.gsub(word, num_ending, &amp;quot;&amp;quot;)&lt;br /&gt;
					break&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&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;
				is_valid = true&lt;br /&gt;
				month = date_words.months[month_num]&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		month = month or &amp;quot;&amp;quot;&lt;br /&gt;
		month = month:gsub(&amp;quot;^%l&amp;quot;, string.upper)&lt;br /&gt;
		_, year = string.match(date_text, &amp;quot;(.+) (%d+)&amp;quot;)&lt;br /&gt;
		year = year or &amp;quot;&amp;quot;&lt;br /&gt;
		day = day or date_text&lt;br /&gt;
		if year == month then&lt;br /&gt;
			month = &amp;quot;&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		day_table = {}&lt;br /&gt;
		for word in string.gmatch(day, date_sign) do&lt;br /&gt;
			table.insert(day_table, word)&lt;br /&gt;
		end&lt;br /&gt;
		day_table[1] = day_table[1] or &amp;quot;&amp;quot;&lt;br /&gt;
		return circa_message .. day_table[1] .. &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;
	if not is_valid then&lt;br /&gt;
		return &amp;quot;Invalid entry&amp;quot;&lt;br /&gt;
	end&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>