<?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%2Fdxa-kly%2FDates</id>
	<title>Module:Sandbox/dxa-kly/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%2Fdxa-kly%2FDates"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/dxa-kly/Dates&amp;action=history"/>
	<updated>2026-05-28T23:40:57Z</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/dxa-kly/Dates&amp;diff=146501&amp;oldid=prev</id>
		<title>imported&gt;Dxa-kly at 06:46, 11 November 2018</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/dxa-kly/Dates&amp;diff=146501&amp;oldid=prev"/>
		<updated>2018-11-11T06:46:22Z</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 indef = {&amp;quot;about&amp;quot;, &amp;quot;approaching&amp;quot;, &amp;quot;approximate&amp;quot;, &amp;quot;around&amp;quot;, &amp;quot;%f[%a]c%.%f[%A]&amp;quot;, &amp;quot;%f[%a]ca%f[%A]&amp;quot;, &amp;quot;circa&amp;quot;, &amp;quot;close to&amp;quot;, &amp;quot;doubt&amp;quot;, &amp;quot;dubious&amp;quot;, &amp;quot;estimate&amp;quot;, &amp;quot;in the area of&amp;quot;, &amp;quot;in the neighborhood of&amp;quot;, &amp;quot;in the neighbourhood of&amp;quot;, &amp;quot;in the neighborhood of&amp;quot;, &amp;quot;in the region of&amp;quot;, &amp;quot;more or less&amp;quot;, &amp;quot;near&amp;quot;, &amp;quot;or so&amp;quot;, &amp;quot;order of&amp;quot;, &amp;quot;roughly&amp;quot;, &amp;quot;something like&amp;quot;, &amp;quot;speculative&amp;quot;, &amp;quot;tentative&amp;quot;, &amp;quot;uncertain&amp;quot;, &amp;quot;unclear&amp;quot;, &amp;quot;unreliable&amp;quot;, &amp;quot;unsettled&amp;quot;, &amp;quot;unsure&amp;quot;}&lt;br /&gt;
local 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;
local fullmonths = {&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 eras = {&amp;quot;ad&amp;quot;, &amp;quot;bce&amp;quot;, &amp;quot;bc&amp;quot;, &amp;quot;ce&amp;quot;}&lt;br /&gt;
local bad = &amp;quot;Invalid entry&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.day_try( d, m, y )&lt;br /&gt;
  if m == 1 or m == 3 or m == 5 or m == 7 or m == 8 or m == 10 or m == 12 then&lt;br /&gt;
    d_in_m = 31&lt;br /&gt;
  elseif m == 4 or m == 6 or m == 9 or m == 11 then&lt;br /&gt;
    d_in_m = 30&lt;br /&gt;
  elseif m == 2 then&lt;br /&gt;
    if y % 4 &amp;lt; 1 and y % 400 &amp;gt; 0 then&lt;br /&gt;
      d_in_m = 29&lt;br /&gt;
    else&lt;br /&gt;
      d_in_m = 28&lt;br /&gt;
    end&lt;br /&gt;
  else&lt;br /&gt;
    d_in_m = 0&lt;br /&gt;
  end&lt;br /&gt;
  if d &amp;gt; 0 and d &amp;lt;= d_in_m then return 1 end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.era_try( str, ptn, idx )&lt;br /&gt;
  for i = 1, #eras do&lt;br /&gt;
    values = {str:match(ptn .. &amp;quot; (&amp;quot; .. eras[i] .. &amp;quot;)&amp;quot;)}&lt;br /&gt;
    for j = 1, #values do&lt;br /&gt;
      if j == idx then&lt;br /&gt;
        if idx &amp;gt; 2 and idx &amp;lt; 5 then&lt;br /&gt;
          return values[idx]&lt;br /&gt;
        elseif idx == 2 then&lt;br /&gt;
          return values[1], values[2]&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.indef_try( str )&lt;br /&gt;
  for i = 1, #indef do&lt;br /&gt;
    if str:match(indef[i]) then return true end&lt;br /&gt;
  end&lt;br /&gt;
  return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.mth_str_to_int( m )&lt;br /&gt;
  for i = 1, #months do&lt;br /&gt;
    if months[i] == m then return i end&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.slash_try( str )&lt;br /&gt;
  sls_num1, sls_num2, sls_y = str:match(&amp;quot;(%d+)/(%d+)/(%d+)&amp;quot;)&lt;br /&gt;
  sls_num1 = tonumber(sls_num1)&lt;br /&gt;
  sls_num2 = tonumber(sls_num2)&lt;br /&gt;
  if sls_num1 then&lt;br /&gt;
    if sls_num2 &amp;gt; 12 then&lt;br /&gt;
      if not p.day_try(sls_num2, sls_num1, sls_y) then return bad end&lt;br /&gt;
      return &amp;quot;iso&amp;quot;, sls_y, sls_num1, sls_num2&lt;br /&gt;
    else&lt;br /&gt;
      if not p.day_try(sls_num1, sls_num2, sls_y) then return bad end&lt;br /&gt;
      return &amp;quot;iso&amp;quot;, sls_y, sls_num2, sls_num1&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.hyphenated_try( str )&lt;br /&gt;
  hyn_y, hyn_m, hyn_d = str:match(&amp;quot;(%d+)-(%d+)-(%d+)&amp;quot;)&lt;br /&gt;
  hyn_y = tonumber(hyn_y)&lt;br /&gt;
  hyn_m = tonumber(hyn_m)&lt;br /&gt;
  hyn_d = tonumber(hyn_d)&lt;br /&gt;
  if hyn_y then&lt;br /&gt;
    if not p.day_try(hyn_d, hyn_m, hyn_y) then return bad end&lt;br /&gt;
    return &amp;quot;iso&amp;quot;, hyn_y, hyn_m, hyn_d&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.named_month_try( str )&lt;br /&gt;
  for _, pattern in pairs( months ) do&lt;br /&gt;
    dmy_d, dmy_m, dmy_y = str:match( &amp;quot;(%d+).-(&amp;quot; .. pattern .. &amp;quot;).-(%d+)&amp;quot; )&lt;br /&gt;
    mdy_m, mdy_d, mdy_y = str:match( &amp;quot;(&amp;quot; .. pattern .. &amp;quot;).-(%d+)[^%d]+(%d+)&amp;quot;)&lt;br /&gt;
    if dmy_d then&lt;br /&gt;
      dmy_d = tonumber(dmy_d)&lt;br /&gt;
      dmy_m = p.mth_str_to_int(dmy_m)&lt;br /&gt;
      dmy_y = tonumber(dmy_y)&lt;br /&gt;
      if not p.day_try(tonumber(dmy_d), dmy_m, tonumber(dmy_y)) then return bad end&lt;br /&gt;
      era = p.era_try(str, &amp;quot;(%d+).-(&amp;quot; .. pattern .. &amp;quot;).-(%d+)&amp;quot;, 4)&lt;br /&gt;
      if era then&lt;br /&gt;
        return &amp;quot;dmy&amp;quot;, dmy_y, dmy_m, dmy_d, era&lt;br /&gt;
      else&lt;br /&gt;
        return &amp;quot;dmy&amp;quot;, dmy_y, dmy_m, dmy_d&lt;br /&gt;
      end&lt;br /&gt;
    elseif mdy_m then&lt;br /&gt;
      mdy_m = p.mth_str_to_int(mdy_m)&lt;br /&gt;
      mdy_d = tonumber(mdy_d)&lt;br /&gt;
      mdy_y = tonumber(mdy_y)&lt;br /&gt;
      if not p.day_try(tonumber(mdy_d), mdy_m, tonumber(mdy_y)) then return bad end&lt;br /&gt;
      era = p.era_try(str, &amp;quot;(&amp;quot; .. pattern .. &amp;quot;).-(%d+)[^%d]+(%d+)&amp;quot;, 4)&lt;br /&gt;
      if era then&lt;br /&gt;
        return &amp;quot;mdy&amp;quot;, mdy_y, mdy_m, mdy_d, era&lt;br /&gt;
      else&lt;br /&gt;
        return &amp;quot;mdy&amp;quot;, mdy_y, mdy_m, mdy_d&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  fail1_d, fail1_m, fail1_y = str:match( &amp;quot;(%d+).-(%a+).-(%d+)&amp;quot; )&lt;br /&gt;
  fail2_m, fail2_d, fail2_y = str:match( &amp;quot;(%a+).-(%d+)[^%d]+(%d+)&amp;quot;)&lt;br /&gt;
  if fail1_d or fail2_m then return bad end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.unclassified1_try( str, ptn )&lt;br /&gt;
  un1_d, un1_m = str:match( &amp;quot;(%d+).-(&amp;quot; .. ptn .. &amp;quot;)&amp;quot; )&lt;br /&gt;
  un1_d = tonumber(un1_d)&lt;br /&gt;
  un1_m = p.mth_str_to_int(un1_m)&lt;br /&gt;
  if un1_d and p.day_try(un1_d, un1_m, 1900) then return &amp;quot;dm&amp;quot;, un1_d, fullmonths[un1_m] end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.unclassified2_try( str, ptn )&lt;br /&gt;
  un2_m, un2_d = str:match( &amp;quot;(&amp;quot; .. ptn .. &amp;quot;).-(%d+)&amp;quot; )&lt;br /&gt;
  un2_d = tonumber(un2_d)&lt;br /&gt;
  un2_m = p.mth_str_to_int(un2_m)&lt;br /&gt;
  if un2_d then&lt;br /&gt;
    era = p.era_try(str, &amp;quot;(&amp;quot; .. ptn .. &amp;quot;).-(%d+)&amp;quot;, 3)&lt;br /&gt;
    if era then&lt;br /&gt;
      return &amp;quot;my&amp;quot;, fullmonths[un2_m], un2_d, era&lt;br /&gt;
    elseif p.day_try(un2_d, un2_m, 1900) then&lt;br /&gt;
      return &amp;quot;md&amp;quot;, fullmonths[un2_m], un2_d&lt;br /&gt;
    else&lt;br /&gt;
      return &amp;quot;my&amp;quot;, fullmonths[un2_m], un2_d&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.unclassified3_try( str )&lt;br /&gt;
  un3_y, era = p.era_try(str, &amp;quot;(%d+)&amp;quot;, 2)&lt;br /&gt;
  if era then return &amp;quot;ye&amp;quot;, un3_y, era end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.unclassified4_try( str )&lt;br /&gt;
  t = {}&lt;br /&gt;
  for a in str:gmatch(&amp;quot;%d+&amp;quot;) do table.insert(t, tonumber(a)) end&lt;br /&gt;
  table.sort(t)&lt;br /&gt;
  if not (t[#t] == nil) then return &amp;quot;num&amp;quot;, t[#t] end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.parsedate( inp )&lt;br /&gt;
  inp = inp or &amp;quot;&amp;quot;&lt;br /&gt;
  if not (type(inp) == &amp;quot;string&amp;quot;) then return bad end&lt;br /&gt;
  inp = inp:lower()&lt;br /&gt;
  has_indef = p.indef_try(inp)&lt;br /&gt;
  if p.slash_try(inp) then&lt;br /&gt;
    return has_indef, p.slash_try(inp)&lt;br /&gt;
  elseif p.hyphenated_try(inp) then&lt;br /&gt;
    return has_indef, p.hyphenated_try(inp)&lt;br /&gt;
  elseif p.named_month_try(inp) then&lt;br /&gt;
    return has_indef, p.named_month_try(inp)&lt;br /&gt;
  else&lt;br /&gt;
    for _, pattern in pairs( months ) do&lt;br /&gt;
      if p.unclassified1_try( inp, pattern ) then&lt;br /&gt;
        return has_indef, p.unclassified1_try(inp, pattern)&lt;br /&gt;
      elseif p.unclassified2_try( inp, pattern ) then&lt;br /&gt;
        return has_indef, p.unclassified2_try(inp, pattern)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
    if p.unclassified3_try(inp) then&lt;br /&gt;
      return has_indef, p.unclassified3_try(inp)&lt;br /&gt;
    elseif p.unclassified4_try(inp) then&lt;br /&gt;
      return has_indef, p.unclassified4_try(inp)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
  return bad&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.unpackdate( frame )&lt;br /&gt;
  s = {p.parsedate(frame.args.text)}&lt;br /&gt;
  format = frame.args.format&lt;br /&gt;
  uncertainty = &amp;quot;&amp;quot;&lt;br /&gt;
  era = &amp;quot;&amp;quot;&lt;br /&gt;
  if s[1] then uncertainty = &amp;quot;circa &amp;quot; end&lt;br /&gt;
  for i = 1, #s do&lt;br /&gt;
    if s[i] == &amp;quot;Invalid entry&amp;quot; then return s[i] end&lt;br /&gt;
  end&lt;br /&gt;
  if s[2] == &amp;quot;iso&amp;quot; or s[2] == &amp;quot;dmy&amp;quot; or s[2] == &amp;quot;mdy&amp;quot; then&lt;br /&gt;
    year = s[3]&lt;br /&gt;
    month = s[4]&lt;br /&gt;
    day = s[5]&lt;br /&gt;
    if s[6] then era = s[6]:upper() end&lt;br /&gt;
    if s[2] == &amp;quot;iso&amp;quot; then&lt;br /&gt;
      default = string.format(&amp;quot;%04d-%02d-%02d&amp;quot;, year, month, day)&lt;br /&gt;
    elseif s[2] == &amp;quot;dmy&amp;quot; then&lt;br /&gt;
      default = day .. &amp;quot; &amp;quot; .. fullmonths[month] .. &amp;quot; &amp;quot; .. year .. &amp;quot; &amp;quot; .. era&lt;br /&gt;
    else&lt;br /&gt;
      default = fullmonths[month] .. &amp;quot; &amp;quot; .. day .. &amp;quot;, &amp;quot; .. year .. &amp;quot; &amp;quot; .. era&lt;br /&gt;
    end&lt;br /&gt;
  elseif s[2] == &amp;quot;dm&amp;quot; or s[2] == &amp;quot;md&amp;quot; then&lt;br /&gt;
    default = s[3] .. &amp;quot; &amp;quot; .. s[4]&lt;br /&gt;
  elseif s[2] == &amp;quot;ye&amp;quot; then&lt;br /&gt;
    default = s[3] .. &amp;quot; &amp;quot; .. s[4]:upper()&lt;br /&gt;
  elseif s[2] == &amp;quot;my&amp;quot; then&lt;br /&gt;
    default = s[3] .. &amp;quot; &amp;quot; .. s[4]&lt;br /&gt;
    if s[5] then default = default .. &amp;quot; &amp;quot; .. s[5]:upper() end&lt;br /&gt;
  else&lt;br /&gt;
    default = s[3]&lt;br /&gt;
  end&lt;br /&gt;
  if format then&lt;br /&gt;
    if s[2] == &amp;quot;iso&amp;quot; or s[2] == &amp;quot;dmy&amp;quot; or s[2] == &amp;quot;mdy&amp;quot; then&lt;br /&gt;
      if format == s[2] then return uncertainty .. default end&lt;br /&gt;
      if format == &amp;quot;iso&amp;quot; then return uncertainty .. string.format(&amp;quot;%04d-%02d-%02d&amp;quot;, year, month, day) end&lt;br /&gt;
      if format == &amp;quot;dmy&amp;quot; then return uncertainty .. day .. &amp;quot; &amp;quot; .. fullmonths[month] .. &amp;quot; &amp;quot; .. year .. &amp;quot; &amp;quot; .. era end&lt;br /&gt;
      if format == &amp;quot;mdy&amp;quot; then return uncertainty .. fullmonths[month] .. &amp;quot; &amp;quot; .. day .. &amp;quot;, &amp;quot; .. year .. &amp;quot; &amp;quot; .. era end&lt;br /&gt;
      if format == &amp;quot;year&amp;quot; then return uncertainty .. year .. &amp;quot; &amp;quot; .. era end&lt;br /&gt;
    end&lt;br /&gt;
    return &amp;quot;Cannot apply format&amp;quot;&lt;br /&gt;
  else&lt;br /&gt;
    return uncertainty .. default&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Dxa-kly</name></author>
	</entry>
</feed>