يمكن إنشاء صفحة توثيق الوحدة في وحدة:Citation/CS1/dates/شرح

local p = {}
match_tab_n = {
	["^%a+ %d%d%, %d%d%d%d$"] ="(%a+) (%d%d)%, (%d%d%d%d)",
	}
match_tab = {
	--["^[1-9]%d? +%a+ +[1-9]%d%d%d%a?$"] ="(%d%d*)%s*(%a+)%s*((%d%d%d%d)%a?)",
	["^%d %a+ %d%d%d%d$"] ="(%d) (%a+) (%d%d%d%d)",
	["^%d%d %a+ %d%d%d%d$"] ="(%d%d) (%a+) (%d%d%d%d)",
	['^%d %d %d%d%d%d$']= '(%d) (%d) (%d%d%d%d)',
	['^%d %d%d %d%d%d%d$']= '(%d) (%d%d) (%d%d%d%d)',
	['^%d%d %d %d%d%d%d$']= '(%d%d) (%d) (%d%d%d%d)',
	['^%d%d %d%d %d%d%d%d$']= '(%d%d) (%d%d) (%d%d%d%d)',
	['^%d%-%d%-%d%d%d%d$']= '(%d)%-(%d)%-(%d%d%d%d)',
	['^%d%-%d%d%-%d%d%d%d$']= '(%d)%-(%d%d)%-(%d%d%d%d)',
	['^%d%d%-%d%-%d%d%d%d$']= '(%d%d)%-(%d)%-(%d%d%d%d)',
	['^%d%d%-%d%d%-%d%d%d%d$']= '(%d%d)%-(%d%d)%-(%d%d%d%d)',
	}
	
match_tab_en = {
	['^%d%d%d%d %d %d$']= '(%d%d%d%d) (%d) (%d)$',
	['^%d%d%d%d %d %d%d$']= '(%d%d%d%d) (%d) (%d%d)$',
	['^%d%d%d%d %d%d %d$']= '(%d%d%d%d) (%d%d) (%d)$',
	['^%d%d%d%d %d%d %d%d$']= '(%d%d%d%d) (%d%d) (%d%d)$',
	['^%d%d%d%d%-%d%-%d$']= '(%d%d%d%d)%-(%d)%-(%d)$',
	['^%d%d%d%d%-%d%-%d%d$']= '(%d%d%d%d)%-(%d)%-(%d%d)$',
	['^%d%d%d%d%-%d%d%-%d$']= '(%d%d%d%d)%-(%d%d)%-(%d)$',
	['^%d%d%d%d%-%d%d%-%d%d$']= '(%d%d%d%d)%-(%d%d)%-(%d%d)$',
	}
--[[
tato = {"%d" , "%d%d"}
spaces =  {" " , "%-"}
for _p, space in pairs(spaces) do
	for o, k1 in ipairs(tato) do
		for _, k2 in ipairs(tato) do
			s_k = "^" .. k1 .. space .. k2 .. space .. "%d%d%d%d$"
			s_v = "(" .. k1 .. ")".. space .. "(" .. k2 .. ")".. space .. "(" .. "%d%d%d%d)"
			match_tab[s_k] = s_v
			--mw.log("['" .. s_k .. "']= '" .. s_v .. "'")
			s_k1 = "^%d%d%d%d" .. space .. k1 .. space .. k2 .. "$"
			s_v1 = "(%d%d%d%d)" .. space .. "(" .. k1 .. ")".. space .. "(" .. k2 .. ")$"
			match_tab_en[s_k1] = s_v1
			--mw.log("['" .. s_k1 .. "']= '" .. s_v1 .. "'")
			
		end
	end
end
]]
local function get_month_number(month)
	month2 = month:lower()
	local long_months = {['january']=1, ['february']=2, ['march']=3, ['april']=4, ['may']=5, ['june']=6, ['july']=7, ['august']=8, ['september']=9, ['october']=10, ['november']=11, ['december']=12,
		['يناير']=1, ['فبراير']=2, ['مارس']=3, ['أبريل']=4, ['مايو']=5, ['يونيو']=6, ['يوليو']=7, ['أغسطس']=8, ['سبتمبر']=9, ['أكتوبر']=10, ['نوفمبر']=11, ['ديسمبر']=12 }; 
	local short_months = {['jan']=1, ['feb']=2, ['mar']=3, ['apr']=4, ['may']=5, ['jun']=6, ['jul']=7, ['aug']=8, ['sep']=9, ['oct']=10, ['nov']=11, ['dec']=12};
	return long_months[month2] or												-- if month is the long-form name
		short_months[month2] or													-- if month is the short-form name
		0;																		-- misspelled, improper case, or not a month name
end

function p.check_date (date_string)
	local year;
	local month=0;
	local day=0;
	local faild = true;
	local date_string2 = date_string
	local day , month , year
	--match_tab_en
	if string.find(date_string,"[ا|أ|ب|ت|ث|ج|ح|خ|د|ذ|ر|ز|س|ش|ص|ض|ط|ظ|ع|غ|ف|ق|ك|ل|م|ن|ه|و|ي]")
		--then date_string2 = date_string 
		then return date_string
	else
		for key, v in pairs(match_tab_n) do
			if date_string:match( key ) and faild then
				faild = false
				month, day, year = string.match(date_string, v );
			end
		end
		for key, v in pairs(match_tab) do
			if date_string:match( key ) and faild then
				faild = false
				day, month, year = string.match(date_string, v );
			end
		end
		for key, v in pairs(match_tab_en) do
			if date_string:match( key ) and faild then
				faild = false
				year, month, day = string.match(date_string, v );
			end
		end
	end
	fa = date_string2
	--if faild then
		--mw.log(date_string .. " faild")
	if not faild then
		if month:match("%a+") then
			month = get_month_number(month)
		end
		date_string2 = day .. "-" .. month .. "-" .. year
		--mw.log("day" .. day .. ", month" .. month .. ", year" .. year)
		if 12 < tonumber(month) or 31 < tonumber(month) or 1 > tonumber(month) or 1582 > tonumber(year) or 0 == tonumber(day) 
		then 
			--mw.log(date_string .. " false")
			return date_string
		end
		--fa =  '{{#time:d F Y|' .. date_string .. '}}'
		fa = mw.getCurrentFrame():callParserFunction( '#time:d F Y', '' .. date_string2 .. '' )
	end
	--cp = "* " .. date_string .. " : \n**" .. fa
	return fa
end

function p.check (frame)
	return p.check_date(frame.args[1])
end

return p