From 1e796bb27681c79d6350b8304e18e66e35761288 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Sun, 27 Apr 2014 13:15:29 -0700 Subject: [PATCH] A3t - Implemented attmod expansion. --- src/A3t.cpp | 82 ++++++++++++++++------------------------------------- 1 file changed, 25 insertions(+), 57 deletions(-) diff --git a/src/A3t.cpp b/src/A3t.cpp index bbee7972e..baf639780 100644 --- a/src/A3t.cpp +++ b/src/A3t.cpp @@ -563,132 +563,100 @@ const std::string A3t::getFilterExpression () } else if ((*i)->hasTag ("ATTMOD")) { - // TODO name.mod:value --> name value + // name.mod:value --> name value if (filter != "") filter += ' '; - filter += ""; -/* - std::string name; - std::string mod; - std::string value; - std::string sense; - extract_attmod (arg->_raw, name, mod, value, sense); + std::string name = (*i)->attribute ("name"); + std::string mod = (*i)->attribute ("modifier"); + std::string value = (*i)->attribute ("value"); + std::string sense = (*i)->attribute ("sense"); // TODO Not used. Why? // name.before:value --> name < value if (mod == "before" || mod == "under" || mod == "below") { - expanded.push_back (Arg (name, Arg::type_string, Arg::cat_dom)); - expanded.push_back (Arg ("<", Arg::cat_op)); - expanded.push_back (Arg (value, implied, Arg::cat_literal)); + filter += name + " < " + value; } // name.after:value --> name > value else if (mod == "after" || mod == "over" || mod == "above") { - expanded.push_back (Arg (name, Arg::type_string, Arg::cat_dom)); - expanded.push_back (Arg (">", Arg::cat_op)); - expanded.push_back (Arg (value, implied, Arg::cat_literal)); + filter += name + " > " + value; } // name.none: --> name == "" else if (mod == "none") { - expanded.push_back (Arg (name, Arg::type_string, Arg::cat_dom)); - expanded.push_back (Arg ("=", Arg::cat_op)); - expanded.push_back (Arg ("", implied, Arg::cat_none)); + filter += name + " == ''"; } // name.any: --> name != "" else if (mod == "any") { - expanded.push_back (Arg (name, Arg::type_string, Arg::cat_dom)); - expanded.push_back (Arg ("!=", Arg::cat_op)); - expanded.push_back (Arg ("", implied, Arg::cat_none)); + filter += name + " != ''"; } // name.is:value --> name = value else if (mod == "is" || mod == "equals") { - expanded.push_back (Arg (name, Arg::type_string, Arg::cat_dom)); - expanded.push_back (Arg ("=", Arg::cat_op)); - expanded.push_back (Arg (value, implied, Arg::cat_none)); + filter += name + " == " + value; } // name.isnt:value --> name != value else if (mod == "isnt" || mod == "not") { - expanded.push_back (Arg (name, Arg::type_string, Arg::cat_dom)); - expanded.push_back (Arg ("!=", Arg::cat_op)); - expanded.push_back (Arg (value, implied, Arg::cat_none)); + filter += name + " != " + value; } // name.has:value --> name ~ value else if (mod == "has" || mod == "contains") { - expanded.push_back (Arg (name, Arg::type_string, Arg::cat_dom)); - expanded.push_back (Arg ("~", Arg::cat_op)); - expanded.push_back (Arg (value, Arg::type_string, Arg::cat_rx)); + filter += name + " ~ " + value; } // name.hasnt:value --> name !~ value else if (mod == "hasnt") { - expanded.push_back (Arg (name, Arg::type_string, Arg::cat_dom)); - expanded.push_back (Arg ("!~", Arg::cat_op)); - expanded.push_back (Arg (value, Arg::type_string, Arg::cat_rx)); + filter += name + " !~ " + value; } // name.startswith:value --> name ~ ^value else if (mod == "startswith" || mod == "left") { - expanded.push_back (Arg (name, Arg::type_string, Arg::cat_dom)); - expanded.push_back (Arg ("~", Arg::cat_op)); - expanded.push_back (Arg ("^" + value, Arg::type_string, Arg::cat_rx)); + filter += name + " ~ '^" + value + "'"; } // name.endswith:value --> name ~ value$ else if (mod == "endswith" || mod == "right") { - expanded.push_back (Arg (name, Arg::type_string, Arg::cat_dom)); - expanded.push_back (Arg ("~", Arg::cat_op)); - expanded.push_back (Arg (value + "$", Arg::type_string, Arg::cat_rx)); + filter += name + " ~ '" + value + "$'"; } // name.word:value --> name ~ \bvalue\b else if (mod == "word") { - expanded.push_back (Arg (name, Arg::type_string, Arg::cat_dom)); - expanded.push_back (Arg ("~", Arg::cat_op)); -#ifdef DARWIN - expanded.push_back (Arg (value, Arg::type_string, Arg::cat_literal)); +#if defined (DARWIN) + filter += name + " ~ " + value; +#elif defined (SOLARIS) + filter += name + " ~ '\\<" + value + "\\>'"; #else -#ifdef SOLARIS - 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 + filter += name + " ~ '\\b" + value + "\\b'"; #endif } // name.noword:value --> name !~ \bvalue\n else if (mod == "noword") { - expanded.push_back (Arg (name, Arg::type_string, Arg::cat_dom)); - expanded.push_back (Arg ("!~", Arg::cat_op)); -#ifdef DARWIN - expanded.push_back (Arg (value, Arg::type_string, Arg::cat_literal)); +#if defined (DARWIN) + filter += name + " !~ " + value; +#elif defined (SOLARIS) + filter += name + " !~ '\\<" + value + "\\>'"; #else -#ifdef SOLARIS - 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 + filter += name + " !~ '\\b" + value + "\\b'"; #endif } else throw format (STRING_A3_UNKNOWN_ATTMOD, mod); -*/ } else if ((*i)->hasTag ("ATTRIBUTE")) {