<?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%2FArtbarte%2FDates</id>
	<title>Module:Sandbox/Artbarte/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%2FArtbarte%2FDates"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Artbarte/Dates&amp;action=history"/>
	<updated>2026-04-17T18:46:26Z</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/Artbarte/Dates&amp;diff=145155&amp;oldid=prev</id>
		<title>imported&gt;Artbarte at 19:42, 9 November 2018</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Artbarte/Dates&amp;diff=145155&amp;oldid=prev"/>
		<updated>2018-11-09T19:42:17Z</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;-- Artbarte Google Code-in, Date formatting&lt;br /&gt;
-- WIP&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Checks if string is a format and returns format string&lt;br /&gt;
-- Takes string | returns format string to be applied to os.date() OR nil&lt;br /&gt;
function parseFormat(str)&lt;br /&gt;
	local formats = {mdy = &amp;quot;%B %d, %Y&amp;quot;,year = &amp;quot;%Y&amp;quot;,iso = &amp;quot;%Y-%m-%d&amp;quot;,dmy = &amp;quot;%d %B %Y&amp;quot;}&lt;br /&gt;
	formats[&amp;quot;month and year&amp;quot;] = &amp;quot;%B %Y&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	return formats[str]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Checks if string is a month or month abbreviation&lt;br /&gt;
-- Takes string | returns integer of month OR nil&lt;br /&gt;
function parseMonth(str)&lt;br /&gt;
	str = string.lower(str)&lt;br /&gt;
	local months = {{&amp;quot;January&amp;quot;,&amp;quot;jan&amp;quot;},&lt;br /&gt;
					{&amp;quot;February&amp;quot;,&amp;quot;feb&amp;quot;},&lt;br /&gt;
					{&amp;quot;March&amp;quot;,&amp;quot;mar&amp;quot;},&lt;br /&gt;
					{&amp;quot;April&amp;quot;,&amp;quot;apr&amp;quot;},&lt;br /&gt;
					{&amp;quot;May&amp;quot;,&amp;quot;may&amp;quot;},&lt;br /&gt;
					{&amp;quot;June&amp;quot;,&amp;quot;jun&amp;quot;},&lt;br /&gt;
					{&amp;quot;July&amp;quot;,&amp;quot;jul&amp;quot;},&lt;br /&gt;
					{&amp;quot;August&amp;quot;,&amp;quot;aug&amp;quot;},&lt;br /&gt;
					{&amp;quot;September&amp;quot;,&amp;quot;sep&amp;quot;},&lt;br /&gt;
					{&amp;quot;October&amp;quot;,&amp;quot;oct&amp;quot;},&lt;br /&gt;
					{&amp;quot;November&amp;quot;,&amp;quot;nov&amp;quot;},&lt;br /&gt;
					{&amp;quot;December&amp;quot;,&amp;quot;dec&amp;quot;},&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
	for i,v in ipairs(months) do&lt;br /&gt;
		if str == string.lower(v[1]) or str == v[2] then&lt;br /&gt;
			return i&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
-- Checks if the string includes on of the &amp;quot;circa words&amp;quot;&lt;br /&gt;
function checkIfCirca (str)&lt;br /&gt;
	local dateString = str&lt;br /&gt;
	local circa = false&lt;br /&gt;
	&lt;br /&gt;
	local circaStrings = {&amp;quot;%(uncertain%)&amp;quot;, &amp;quot;sometime &amp;quot;, &amp;quot;around &amp;quot;}&lt;br /&gt;
	for i,v in ipairs(circaStrings) do&lt;br /&gt;
		dateString, matches = string.gsub(dateString , v, &amp;quot;&amp;quot;)&lt;br /&gt;
		if  matches &amp;gt;= 1 then&lt;br /&gt;
			circa = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return circa, dateString&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
p.parseDate = function (frame)&lt;br /&gt;
	local date = frame.args.date or &amp;quot;&amp;quot;&lt;br /&gt;
	local format = frame.args.format or &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	-- &lt;br /&gt;
	local circa = false&lt;br /&gt;
	circa, date = checkIfCirca(date)&lt;br /&gt;
	&lt;br /&gt;
	-- Pattern searches for 3 words sperated by spaces, slashes or dashes and puts them into variables: first, second, third&lt;br /&gt;
	local first,second,third = string.match(date, &amp;quot;([%w%d]+)[ /-]([%w%d]+)[, /-] ?(%d+)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	-- If pattern didn&amp;#039;t find any proper date format display error message&lt;br /&gt;
	local fields = {}&lt;br /&gt;
	if first ~= nil then table.insert(fields,first) else return &amp;quot;Invalid input &amp;lt;br&amp;gt;&amp;quot; end&lt;br /&gt;
	if second ~= nil then table.insert(fields,second) end&lt;br /&gt;
	if third ~= nil then table.insert(fields,third) end&lt;br /&gt;
	&lt;br /&gt;
	-- Putting fields into proper value&lt;br /&gt;
	local day,month,year&lt;br /&gt;
	for i,v in ipairs(fields) do&lt;br /&gt;
		local parsedMonth = parseMonth(v)&lt;br /&gt;
		if parsedMonth ~= nil then&lt;br /&gt;
			month = parsedMonth&lt;br /&gt;
		elseif tonumber(v) &amp;gt; 31 then -- year only&lt;br /&gt;
			year = v&lt;br /&gt;
		elseif tonumber(v) &amp;gt; 12 then -- day only&lt;br /&gt;
			day = v&lt;br /&gt;
		elseif month == nil then&lt;br /&gt;
			month = v&lt;br /&gt;
		else&lt;br /&gt;
			day = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Preparing the return message&lt;br /&gt;
	local returnMsg = date&lt;br /&gt;
	&lt;br /&gt;
	-- If format is specified &lt;br /&gt;
	parsedFormat = parseFormat(format)&lt;br /&gt;
	if parsedFormat ~= nil then&lt;br /&gt;
		local time = os.time({month=month,day=day,year=year})&lt;br /&gt;
		returnMsg = os.date(parsedFormat, time)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if circa then &lt;br /&gt;
	 	returnMsg = &amp;quot;circa &amp;quot; .. returnMsg&lt;br /&gt;
	end&lt;br /&gt;
	-- Return the message&lt;br /&gt;
	return &amp;quot;Input: &amp;quot;.. date .. &amp;quot; Format: &amp;quot; .. format .. &amp;quot;&amp;lt;br&amp;gt;Output: &amp;#039;&amp;#039;&amp;#039;&amp;quot; .. returnMsg .. &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Artbarte</name></author>
	</entry>
</feed>