ソースを参照

[Fix #12] search whole word or exact string

isundil 9 年 前
コミット
5b69e965f5
3 ファイル変更26 行追加6 行削除
  1. 3 0
      include/searchPattern.hh
  2. 22 5
      src/searchPattern.cpp
  3. 1 1
      test/longline.json

+ 3 - 0
include/searchPattern.hh

@@ -26,6 +26,9 @@ class SearchPattern
         short typeFlag;
 
         static const short FLAG_CASE;
+        static const short FLAG_WHOLEWORD;
+        static const short FLAG_WHOLESTR;
+
         static const short TYPE_BOOL;
         static const short TYPE_NUMBER;
         static const short TYPE_STRING;

+ 22 - 5
src/searchPattern.cpp

@@ -55,6 +55,10 @@ void SearchPattern::evalFlags(const char *s)
             typeFlag = SearchPattern::TYPE_STRING;
         else if (*s == 'o')
             typeFlag = SearchPattern::TYPE_OBJKEY;
+        else if (*s == 'w')
+            flags |= SearchPattern::FLAG_WHOLEWORD;
+        else if (*s == 'f')
+            flags |= SearchPattern::FLAG_WHOLESTR;
         s++;
     }
 }
@@ -64,6 +68,8 @@ bool SearchPattern::isEmpty() const
 
 bool SearchPattern::operator()(char a, char b)
 {
+    if (a == '\t')
+        a = ' ';
     if (flags & SearchPattern::FLAG_CASE)
         return std::tolower(a) == b;
     return a == b;
@@ -85,12 +91,23 @@ bool SearchPattern::match(const std::string &str, const JSonElement *type) const
                 !(dynamic_cast<const JSonPrimitive<long long> *>(type)))
             return false;
     }
+    if ((flags & FLAG_WHOLESTR && str.length() != pattern.length())
+            || pattern.length() > str.length())
+        return false;
+    if (flags & FLAG_WHOLEWORD && str.length() > pattern.length())
+    {
+        std::string pattern = ' ' +this->pattern +' ';
+            return std::search(str.begin(), str.end(), pattern.begin(), pattern.end(), *this) != str.end();
+    }
     return std::search(str.begin(), str.end(), pattern.begin(), pattern.end(), *this) != str.end();
 }
 
-const short SearchPattern::FLAG_CASE    = 1;
-const short SearchPattern::TYPE_BOOL    = 1;
-const short SearchPattern::TYPE_NUMBER  = 2;
-const short SearchPattern::TYPE_STRING  = 3;
-const short SearchPattern::TYPE_OBJKEY  = 4;
+const short SearchPattern::FLAG_CASE        = 1;
+const short SearchPattern::FLAG_WHOLEWORD   = 2;
+const short SearchPattern::FLAG_WHOLESTR    = 4;
+
+const short SearchPattern::TYPE_BOOL        = 1;
+const short SearchPattern::TYPE_NUMBER      = 2;
+const short SearchPattern::TYPE_STRING      = 3;
+const short SearchPattern::TYPE_OBJKEY      = 4;
 

+ 1 - 1
test/longline.json

@@ -1 +1 @@
-[" Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a tortor sed lectus rhoncus porttitor. Duis condimentum enim ac consequat vulputate. Sed feugiat sapien id hendrerit congue. Nunc in nulla nec mauris sollicitudin porta. Quisque sapien velit, interdum nec sodales vitae, tristique quis tortor. Nam quam libero, placerat sed erat quis, ultrices semper augue. Aenean vitae leo eu massa porta fringilla sed et arcu.  Etiam ex tellus, laoreet at ante non, auctor tempus nisi. Vestibulum blandit ipsum ligula, in ultrices neque malesuada id. Donec non convallis sem. Nunc ac orci eu dui finibus pharetra. Mauris quis purus turpis. In porta felis lectus, in bibendum nisl molestie vitae. Donec luctus quam nec tristique luctus. Donec ultrices ante id cursus scelerisque. Vestibulum tempus massa et finibus sollicitudin. ", "EOF"]
+["Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a tortor sed lectus rhoncus porttitor. Duis condimentum enim ac consequat vulputate. Sed feugiat sapien id hendrerit congue. Nunc in nulla nec mauris sollicitudin porta. Quisque sapien velit, interdum nec sodales vitae, tristique quis tortor. Nam quam libero, placerat sed erat quis, ultrices semper augue. Aenean vitae leo eu massa porta fringilla sed et arcu.  Etiam ex tellus, laoreet at ante non, auctor tempus nisi. Vestibulum blandit ipsum ligula, in ultrices neque malesuada id. Donec non convallis sem. Nunc ac orci eu dui finibus pharetra. Mauris quis purus turpis. In porta felis lectus, in bibendum nisl molestie vitae. Donec luctus quam nec tristique luctus. Donec ultrices ante id cursus scelerisque. Vestibulum tempus massa et finibus sollicitudin.", "EOF"]