- Implemented attmod expansion.
This commit is contained in:
Paul Beckingham 2014-04-27 13:15:29 -07:00
parent 9ee3e03922
commit 1e796bb276

View file

@ -563,132 +563,100 @@ const std::string A3t::getFilterExpression ()
} }
else if ((*i)->hasTag ("ATTMOD")) else if ((*i)->hasTag ("ATTMOD"))
{ {
// TODO name.mod:value --> name <op> value // name.mod:value --> name <op> value
if (filter != "") if (filter != "")
filter += ' '; filter += ' ';
filter += "<attmod>"; std::string name = (*i)->attribute ("name");
/* std::string mod = (*i)->attribute ("modifier");
std::string name; std::string value = (*i)->attribute ("value");
std::string mod; std::string sense = (*i)->attribute ("sense"); // TODO Not used. Why?
std::string value;
std::string sense;
extract_attmod (arg->_raw, name, mod, value, sense);
// name.before:value --> name < value // name.before:value --> name < value
if (mod == "before" || mod == "under" || mod == "below") if (mod == "before" || mod == "under" || mod == "below")
{ {
expanded.push_back (Arg (name, Arg::type_string, Arg::cat_dom)); filter += name + " < " + value;
expanded.push_back (Arg ("<", Arg::cat_op));
expanded.push_back (Arg (value, implied, Arg::cat_literal));
} }
// name.after:value --> name > value // name.after:value --> name > value
else if (mod == "after" || mod == "over" || mod == "above") else if (mod == "after" || mod == "over" || mod == "above")
{ {
expanded.push_back (Arg (name, Arg::type_string, Arg::cat_dom)); filter += name + " > " + value;
expanded.push_back (Arg (">", Arg::cat_op));
expanded.push_back (Arg (value, implied, Arg::cat_literal));
} }
// name.none: --> name == "" // name.none: --> name == ""
else if (mod == "none") else if (mod == "none")
{ {
expanded.push_back (Arg (name, Arg::type_string, Arg::cat_dom)); filter += name + " == ''";
expanded.push_back (Arg ("=", Arg::cat_op));
expanded.push_back (Arg ("", implied, Arg::cat_none));
} }
// name.any: --> name != "" // name.any: --> name != ""
else if (mod == "any") else if (mod == "any")
{ {
expanded.push_back (Arg (name, Arg::type_string, Arg::cat_dom)); filter += name + " != ''";
expanded.push_back (Arg ("!=", Arg::cat_op));
expanded.push_back (Arg ("", implied, Arg::cat_none));
} }
// name.is:value --> name = value // name.is:value --> name = value
else if (mod == "is" || mod == "equals") else if (mod == "is" || mod == "equals")
{ {
expanded.push_back (Arg (name, Arg::type_string, Arg::cat_dom)); filter += name + " == " + value;
expanded.push_back (Arg ("=", Arg::cat_op));
expanded.push_back (Arg (value, implied, Arg::cat_none));
} }
// name.isnt:value --> name != value // name.isnt:value --> name != value
else if (mod == "isnt" || mod == "not") else if (mod == "isnt" || mod == "not")
{ {
expanded.push_back (Arg (name, Arg::type_string, Arg::cat_dom)); filter += name + " != " + value;
expanded.push_back (Arg ("!=", Arg::cat_op));
expanded.push_back (Arg (value, implied, Arg::cat_none));
} }
// name.has:value --> name ~ value // name.has:value --> name ~ value
else if (mod == "has" || mod == "contains") else if (mod == "has" || mod == "contains")
{ {
expanded.push_back (Arg (name, Arg::type_string, Arg::cat_dom)); filter += name + " ~ " + value;
expanded.push_back (Arg ("~", Arg::cat_op));
expanded.push_back (Arg (value, Arg::type_string, Arg::cat_rx));
} }
// name.hasnt:value --> name !~ value // name.hasnt:value --> name !~ value
else if (mod == "hasnt") else if (mod == "hasnt")
{ {
expanded.push_back (Arg (name, Arg::type_string, Arg::cat_dom)); filter += name + " !~ " + value;
expanded.push_back (Arg ("!~", Arg::cat_op));
expanded.push_back (Arg (value, Arg::type_string, Arg::cat_rx));
} }
// name.startswith:value --> name ~ ^value // name.startswith:value --> name ~ ^value
else if (mod == "startswith" || mod == "left") else if (mod == "startswith" || mod == "left")
{ {
expanded.push_back (Arg (name, Arg::type_string, Arg::cat_dom)); filter += name + " ~ '^" + value + "'";
expanded.push_back (Arg ("~", Arg::cat_op));
expanded.push_back (Arg ("^" + value, Arg::type_string, Arg::cat_rx));
} }
// name.endswith:value --> name ~ value$ // name.endswith:value --> name ~ value$
else if (mod == "endswith" || mod == "right") else if (mod == "endswith" || mod == "right")
{ {
expanded.push_back (Arg (name, Arg::type_string, Arg::cat_dom)); filter += name + " ~ '" + value + "$'";
expanded.push_back (Arg ("~", Arg::cat_op));
expanded.push_back (Arg (value + "$", Arg::type_string, Arg::cat_rx));
} }
// name.word:value --> name ~ \bvalue\b // name.word:value --> name ~ \bvalue\b
else if (mod == "word") else if (mod == "word")
{ {
expanded.push_back (Arg (name, Arg::type_string, Arg::cat_dom)); #if defined (DARWIN)
expanded.push_back (Arg ("~", Arg::cat_op)); filter += name + " ~ " + value;
#ifdef DARWIN #elif defined (SOLARIS)
expanded.push_back (Arg (value, Arg::type_string, Arg::cat_literal)); filter += name + " ~ '\\<" + value + "\\>'";
#else #else
#ifdef SOLARIS filter += name + " ~ '\\b" + value + "\\b'";
expanded.push_back (Arg ("\\<" + value + "\\>", Arg::type_string, Arg::cat_rx));
#else
expanded.push_back (Arg ("\\b" + value + "\\b", Arg::type_string, Arg::cat_rx));
#endif
#endif #endif
} }
// name.noword:value --> name !~ \bvalue\n // name.noword:value --> name !~ \bvalue\n
else if (mod == "noword") else if (mod == "noword")
{ {
expanded.push_back (Arg (name, Arg::type_string, Arg::cat_dom)); #if defined (DARWIN)
expanded.push_back (Arg ("!~", Arg::cat_op)); filter += name + " !~ " + value;
#ifdef DARWIN #elif defined (SOLARIS)
expanded.push_back (Arg (value, Arg::type_string, Arg::cat_literal)); filter += name + " !~ '\\<" + value + "\\>'";
#else #else
#ifdef SOLARIS filter += name + " !~ '\\b" + value + "\\b'";
expanded.push_back (Arg ("\\<" + value + "\\>", Arg::type_string, Arg::cat_rx));
#else
expanded.push_back (Arg ("\\b" + value + "\\b", Arg::type_string, Arg::cat_rx));
#endif
#endif #endif
} }
else else
throw format (STRING_A3_UNKNOWN_ATTMOD, mod); throw format (STRING_A3_UNKNOWN_ATTMOD, mod);
*/
} }
else if ((*i)->hasTag ("ATTRIBUTE")) else if ((*i)->hasTag ("ATTRIBUTE"))
{ {