Expressions

- Eliminated the . prefix for DOM references to the current task - it is
  unnatural to state ".due < today".
- Prioritized parsing dates ahead of integers, which were masking all
  dates.
This commit is contained in:
Paul Beckingham 2011-07-19 00:25:26 -04:00
parent e564827be7
commit 09d94a0712
7 changed files with 27 additions and 25 deletions

View file

@ -1551,7 +1551,7 @@ Arguments Arguments::extract_write_filter ()
}
////////////////////////////////////////////////////////////////////////////////
Arguments Arguments::extract_modifications ()
Arguments Arguments::extract_modifications (bool include_seq/* = false*/)
{
Arguments modifications;
@ -1566,9 +1566,11 @@ Arguments Arguments::extract_modifications ()
}
// Sequence excluded regardless of location.
else if (arg->_third == "id" ||
else if (arg->_third == "id" ||
arg->_third == "uuid")
{
if (include_seq)
modifications.push_back (Triple (arg->_first, arg->_second, "word"));
}
else if (seen_command)

View file

@ -131,7 +131,7 @@ public:
Arguments extract_read_only_filter ();
Arguments extract_write_filter ();
Arguments extract_modifications ();
Arguments extract_modifications (bool include_seq = false);
Arguments extract_simple_words ();
static bool valid_modifier (const std::string&);

View file

@ -255,9 +255,9 @@ const std::string DOM::get (const std::string& name, const Task& task)
}
}
// [<task>] .<name>
if (name == ".id") return format (task.id);
else if (name == ".urgency") return format (task.urgency_c (), 4, 3);
// [<task>.]<name>
if (name == "id") return format (task.id);
else if (name == "urgency") return format (task.urgency_c (), 4, 3);
else if (task.has (name.substr (1))) return task.get (name.substr (1));
// Delegate to the context-free version of DOM::get.

View file

@ -638,15 +638,15 @@ void Expression::tokenize (
else if (n.getNumber (d))
tokens.push_back (Triple (format (d), "number", category));
else if (n.getInt (i))
tokens.push_back (Triple (format (i), "int", category));
else if (n.getDateISO (t))
tokens.push_back (Triple (Date (t).toISO (), "date", category));
else if (n.getDate (date_format, t))
tokens.push_back (Triple (Date (t).toString (date_format), "date", category));
else if (n.getInt (i))
tokens.push_back (Triple (format (i), "int", category));
else if (n.getWord (s))
tokens.push_back (Triple (s, "rvalue", category));

View file

@ -933,18 +933,6 @@ bool Nibbler::getDOM (std::string& result)
std::string right;
int number;
if (skip ('.') &&
getWord (right))
{
while (skip ('.') &&
getWord (right))
;
result = mInput.substr (i, mCursor - i);
return true;
}
restore ();
if (getWord (left) &&
skip ('.') &&
getWord (right))
@ -982,6 +970,18 @@ bool Nibbler::getDOM (std::string& result)
result = mInput.substr (i, mCursor - i);
return true;
}
restore ();
if (getWord (right))
{
while (skip ('.') &&
getWord (right))
;
result = mInput.substr (i, mCursor - i);
return true;
}
}
return false;

View file

@ -56,7 +56,7 @@ int CmdAdd::execute (std::string& output)
task.set ("uuid", uuid ());
// Apply the command line modifications to the new task.
Arguments modifications = context.args.extract_modifications ();
Arguments modifications = context.args.extract_modifications (true);
modify_task_description_replace (task, modifications);
apply_defaults (task);

View file

@ -414,9 +414,9 @@ int main (int argc, char** argv)
t.diag ("Nibbler::getDOM");
// positive.
n = Nibbler (".due ");
t.ok (n.getDOM (s), "'.due' getDOM -> ok");
t.is (s, ".due", "'.due' getDOM -> '.due'");
n = Nibbler ("due ");
t.ok (n.getDOM (s), "'due' getDOM -> ok");
t.is (s, "due", "'due' getDOM -> 'due'");
n = Nibbler ("123.due ");
t.ok (n.getDOM (s), "'123.due' getDOM -> ok");