- The ::operator_match (and by extension operator_nomatch) now obey the rc.regex
  setting.
This commit is contained in:
Paul Beckingham 2014-09-28 13:39:50 -04:00
parent 9e0ea1cb4a
commit dcc5dbf16a
3 changed files with 45 additions and 13 deletions

View file

@ -126,6 +126,7 @@ int Context::initialize (int argc, const char** argv)
Lexer::dateFormat = config.get ("dateformat");
Variant::dateFormat = config.get ("dateformat");
Variant::searchCaseSensitive = config.getBoolean ("search.case.sensitive");
Variant::searchUsingRegex = config.getBoolean ("regex");
parser.initialize (argc, argv); // task arg0 arg1 ...
@ -148,6 +149,14 @@ int Context::initialize (int argc, const char** argv)
// Create missing config file and data directory, if necessary.
parser.applyOverrides ();
// These may have changed.
// TODO Uh oh.
Lexer::dateFormat = config.get ("dateformat");
Variant::dateFormat = config.get ("dateformat");
Variant::searchCaseSensitive = config.getBoolean ("search.case.sensitive");
Variant::searchUsingRegex = config.getBoolean ("regex");
createDefaultConfig ();
// Initialize the color rules, if necessary.

View file

@ -39,6 +39,7 @@
std::string Variant::dateFormat = "";
bool Variant::searchCaseSensitive = true;
bool Variant::searchUsingRegex = true;
////////////////////////////////////////////////////////////////////////////////
Variant::Variant ()
@ -913,6 +914,8 @@ bool Variant::operator_match (const Variant& other, const Task& task) const
left.cast (type_string);
right.cast (type_string);
if (searchUsingRegex)
{
RX r (right._string, searchCaseSensitive);
if (r.match (left._string))
return true;
@ -929,6 +932,25 @@ bool Variant::operator_match (const Variant& other, const Task& task) const
if (r.match (a->second))
return true;
}
}
else
{
if (find (left._string, right._string, searchCaseSensitive) != std::string::npos)
return true;
// If the above did not match, and the left source is "description", then
// in the annotations.
if (left.source () == "description")
{
std::map <std::string, std::string> annotations;
task.getAnnotations (annotations);
std::map <std::string, std::string>::iterator a;
for (a = annotations.begin (); a != annotations.end (); ++a)
if (find (a->second, right._string, searchCaseSensitive) != std::string::npos)
return true;
}
}
return false;
}

View file

@ -36,6 +36,7 @@ class Variant
public:
static std::string dateFormat;
static bool searchCaseSensitive;
static bool searchUsingRegex;
enum type {type_unknown, type_boolean, type_integer, type_real, type_string,
type_date, type_duration};