TW-1515: abbreviation.minimum does not apply to date recognition

- Thanks to Lars Beckers.
This commit is contained in:
Paul Beckingham 2015-07-19 19:08:38 -04:00
parent a007d6c174
commit f36c14e6b4
3 changed files with 39 additions and 30 deletions

View file

@ -31,6 +31,7 @@
#include <Dates.h>
#include <Date.h>
#include <Lexer.h>
#include <CLI2.h>
#include <i18n.h>
////////////////////////////////////////////////////////////////////////////////
@ -134,20 +135,22 @@ bool namedDates (const std::string& name, Variant& value)
struct tm* t = localtime (&now);
int i;
int minimum = CLI2::minimumMatchLength;
// Dynamics.
if (name == "now")
if (closeEnough ("now", name, minimum))
{
value = Variant (now, Variant::type_date);
}
else if (name == "today")
else if (closeEnough ("today", name, minimum))
{
t->tm_hour = t->tm_min = t->tm_sec = 0;
t->tm_isdst = -1;
value = Variant (mktime (t), Variant::type_date);
}
else if (name == "sod")
else if (closeEnough ("sod", name, minimum))
{
t->tm_mday++;
t->tm_hour = t->tm_min = t->tm_sec = 0;
@ -155,7 +158,7 @@ bool namedDates (const std::string& name, Variant& value)
value = Variant (mktime (t), Variant::type_date);
}
else if (name == "eod")
else if (closeEnough ("eod", name, minimum))
{
t->tm_mday++;
t->tm_hour = t->tm_min = 0;
@ -164,7 +167,7 @@ bool namedDates (const std::string& name, Variant& value)
value = Variant (mktime (t), Variant::type_date);
}
else if (name == "tomorrow")
else if (closeEnough ("tomorrow", name, minimum))
{
t->tm_mday++;
t->tm_hour = t->tm_min = t->tm_sec = 0;
@ -172,7 +175,7 @@ bool namedDates (const std::string& name, Variant& value)
value = Variant (mktime (t), Variant::type_date);
}
else if (name == "yesterday")
else if (closeEnough ("yesterday", name, minimum))
{
t->tm_hour = t->tm_min = t->tm_sec = 0;
t->tm_isdst = -1;
@ -203,7 +206,8 @@ bool namedDates (const std::string& name, Variant& value)
value = Variant (mktime (t), Variant::type_date);
}
else if (name == "later" || name == "someday")
else if (closeEnough ("later", name, minimum) ||
closeEnough ("someday", name, minimum))
{
t->tm_hour = t->tm_min = t->tm_sec = 0;
t->tm_year = 138;
@ -213,7 +217,7 @@ bool namedDates (const std::string& name, Variant& value)
value = Variant (mktime (t), Variant::type_date);
}
else if (name == "eoy")
else if (closeEnough ("eoy", name, minimum))
{
t->tm_hour = t->tm_min = 0;
t->tm_sec = -1;
@ -224,7 +228,7 @@ bool namedDates (const std::string& name, Variant& value)
value = Variant (mktime (t), Variant::type_date);
}
else if (name == "soy")
else if (closeEnough ("soy", name, minimum))
{
t->tm_hour = t->tm_min = t->tm_sec = 0;
t->tm_mon = 0;
@ -234,7 +238,7 @@ bool namedDates (const std::string& name, Variant& value)
value = Variant (mktime (t), Variant::type_date);
}
else if (name == "eoq")
else if (closeEnough ("eoq", name, minimum))
{
t->tm_hour = t->tm_min = 0;
t->tm_sec = -1;
@ -250,7 +254,7 @@ bool namedDates (const std::string& name, Variant& value)
value = Variant (mktime (t), Variant::type_date);
}
else if (name == "soq")
else if (closeEnough ("soq", name, minimum))
{
t->tm_hour = t->tm_min = t->tm_sec = 0;
t->tm_mon += 3 - (t->tm_mon % 3);
@ -265,7 +269,7 @@ bool namedDates (const std::string& name, Variant& value)
value = Variant (mktime (t), Variant::type_date);
}
else if (name == "socm")
else if (closeEnough ("socm", name, minimum))
{
t->tm_hour = t->tm_min = t->tm_sec = 0;
t->tm_mday = 1;
@ -273,7 +277,7 @@ bool namedDates (const std::string& name, Variant& value)
value = Variant (mktime (t), Variant::type_date);
}
else if (name == "som")
else if (closeEnough ("som", name, minimum))
{
t->tm_hour = t->tm_min = t->tm_sec = 0;
@ -289,7 +293,8 @@ bool namedDates (const std::string& name, Variant& value)
value = Variant (mktime (t), Variant::type_date);
}
else if (name == "eom" || name == "eocm")
else if (closeEnough ("eom", name, minimum) ||
closeEnough ("eocm", name, minimum))
{
t->tm_hour = 24;
t->tm_min = 0;
@ -299,7 +304,7 @@ bool namedDates (const std::string& name, Variant& value)
value = Variant (mktime (t), Variant::type_date);
}
else if (name == "socw")
else if (closeEnough ("socw", name, minimum))
{
t->tm_hour = t->tm_min = t->tm_sec = 0;
int extra = t->tm_wday * 86400;
@ -307,7 +312,8 @@ bool namedDates (const std::string& name, Variant& value)
value = Variant (mktime (t) - extra, Variant::type_date);
}
else if (name == "eow" || name == "eocw")
else if (closeEnough ("eow", name, minimum) ||
closeEnough ("eocw", name, minimum))
{
t->tm_hour = t->tm_min = 0;
t->tm_sec = -1;
@ -316,7 +322,7 @@ bool namedDates (const std::string& name, Variant& value)
value = Variant (mktime (t) + extra, Variant::type_date);
}
else if (name == "sow")
else if (closeEnough ("sow", name, minimum))
{
t->tm_hour = t->tm_min = t->tm_sec = 0;
int extra = (7 - t->tm_wday) * 86400;
@ -324,7 +330,7 @@ bool namedDates (const std::string& name, Variant& value)
value = Variant (mktime (t) + extra, Variant::type_date);
}
else if (name == "soww")
else if (closeEnough ("soww", name, minimum))
{
t->tm_hour = t->tm_min = t->tm_sec = 0;
int extra = (t->tm_wday - 1) * 86400;
@ -335,7 +341,7 @@ bool namedDates (const std::string& name, Variant& value)
value = Variant (mktime (t) - extra, Variant::type_date);
}
else if (name == "eoww")
else if (closeEnough ("eoww", name, minimum))
{
t->tm_hour = 24;
t->tm_min = 0;
@ -439,11 +445,11 @@ bool namedDates (const std::string& name, Variant& value)
throw std::string (STRING_DATES_MONTH_31);
}
else if (name == "easter" ||
name == "eastermonday" ||
name == "ascension" ||
name == "pentecost" ||
name == "goodfriday")
else if (closeEnough ("easter", name, minimum) ||
closeEnough ("eastermonday", name, minimum) ||
closeEnough ("ascension", name, minimum) ||
closeEnough ("pentecost", name, minimum) ||
closeEnough ("goodfriday", name, minimum))
{
Variant valueNow = Variant (mktime (t), Variant::type_date);
easter (t);
@ -457,15 +463,15 @@ bool namedDates (const std::string& name, Variant& value)
easter (t);
}
if (name == "goodfriday") t->tm_mday -= 2;
else if (name == "eastermonday") t->tm_mday += 1;
else if (name == "ascension") t->tm_mday += 39;
else if (name == "pentecost") t->tm_mday += 49;
if (closeEnough ("goodfriday", name, minimum)) t->tm_mday -= 2;
else if (closeEnough ("eastermonday", name, minimum)) t->tm_mday += 1;
else if (closeEnough ("ascension", name, minimum)) t->tm_mday += 39;
else if (closeEnough ("pentecost", name, minimum)) t->tm_mday += 49;
value = Variant (mktime (t), Variant::type_date);
}
else if (name == "midsommar")
else if (closeEnough ("midsommar", name, minimum))
{
Variant valueNow = Variant (mktime (t), Variant::type_date);
midsommar (t);
@ -482,7 +488,7 @@ bool namedDates (const std::string& name, Variant& value)
value = Variant (mktime (t), Variant::type_date);
}
else if (name == "midsommarafton")
else if (closeEnough ("midsommarafton", name, minimum))
{
Variant valueNow = Variant (mktime (t), Variant::type_date);
midsommarafton (t);