Added strip accent search for bookmarks
authorBartosz Szatkowski <bulislaw@linux.com>
Wed, 25 Aug 2010 13:43:31 +0000 (15:43 +0200)
committerBartosz Szatkowski <bulislaw@linux.com>
Wed, 25 Aug 2010 13:43:31 +0000 (15:43 +0200)
trunk/src/base/backbone/Bookmarks.cpp
trunk/src/base/backbone/Bookmarks.h
trunk/src/base/backbone/backbone.h

index dfee9c8..5bdcc24 100644 (file)
@@ -6,6 +6,7 @@ Bookmarks::Bookmarks() {
     this->dbName = QDir::homePath() + "/.mdictionary/"
                  + "bookmarks.db";
     checkAndCreateDb();
+    initAccents();
 }
 
 
@@ -16,6 +17,35 @@ QSqlDatabase Bookmarks::getDbCnx(QString dbName) {
     return db;
 }
 
+
+
+void Bookmarks::initAccents() {
+    letters['a'] = QRegExp("[ÀàÁáÂÂâÃãÄäÅåæÆĀāĂ㥹]", Qt::CaseInsensitive);
+    letters['c'] = QRegExp("[ÇçÈçŒĆćĈĉĊċČč]", Qt::CaseInsensitive);
+    letters['d'] = QRegExp("[ÐĐđĎď]", Qt::CaseInsensitive);
+    letters['e'] = QRegExp("[ÈéèÉÊêËëĒēĔĕĖėĘęĚěē]", Qt::CaseInsensitive);
+    letters['f'] = QRegExp("[ſ]", Qt::CaseInsensitive);
+    letters['g'] = QRegExp("[ĠġĢģĜĝĞğ]", Qt::CaseInsensitive);
+    letters['h'] = QRegExp("[ħĤĥĦ]", Qt::CaseInsensitive);
+    letters['i'] = QRegExp("[ÌìÍíÎîÏïİijĨĩĪīĬĭĮį]", Qt::CaseInsensitive);
+    letters['j'] = QRegExp("[Ĵĵ]", Qt::CaseInsensitive);
+    letters['k'] = QRegExp("[Ķķĸ]", Qt::CaseInsensitive);
+    letters['l'] = QRegExp("[ŀŁłĹĺĻļĽľĿ]", Qt::CaseInsensitive);
+    letters['n'] = QRegExp("[ÑñŃńŅņŇňʼnŊŋ]", Qt::CaseInsensitive);
+    letters['o'] = QRegExp("[ÒòÓóÔÕõÖöØøŐőœŌōŎŏ]", Qt::CaseInsensitive);
+    letters['r'] = QRegExp("[ŕŖŖŗŘř]", Qt::CaseInsensitive);
+    letters['s'] = QRegExp("[ߊšŚśŜŝŞş]", Qt::CaseInsensitive);
+    letters['t'] = QRegExp("[ŢţŤťŦŧ]", Qt::CaseInsensitive);
+    letters['u'] = QRegExp("[ÙùÚúÛûÜüŰűŲųŨũŪūŬŮů]", Qt::CaseInsensitive);
+    letters['w'] = QRegExp("[Ŵŵ]", Qt::CaseInsensitive);
+    letters['y'] = QRegExp("[ÿÝýŶŷŸ]", Qt::CaseInsensitive);
+    letters['z'] = QRegExp("[ŹźŻżŽž]", Qt::CaseInsensitive);
+    noLetter = QRegExp("[^a-z ]", Qt::CaseInsensitive);
+}
+
+
+
+
 bool Bookmarks::checkAndCreateDb() {
     QSqlDatabase db = getDbCnx(dbName);
     if(!db.isOpen() && !db.open()) {
@@ -23,7 +53,7 @@ bool Bookmarks::checkAndCreateDb() {
         return false;
     }
     QSqlQuery cur(db);
-    cur.exec("create table bookmarks(key text ,translation text)");
+    cur.exec("create table bookmarks(key text, normalized text, translation text)");
     db.close();
 
     return true;
@@ -39,7 +69,7 @@ void Bookmarks::clear() {
     }
     QSqlQuery cur(db);
     cur.exec("drop table bookmarks");
-    cur.exec("create table bookmarks(key text ,translation text)");
+    cur.exec("create table bookmarks(key text, normalized text,translation text)");
     db.close();
 }
 
@@ -53,8 +83,9 @@ void Bookmarks::add(Translation* translation) {
     }
     translation->setBookmark(true);
     QSqlQuery cur(db);
-    cur.prepare("insert into bookmarks values (?,?)");
+    cur.prepare("insert into bookmarks values (?,?,?)");
     cur.addBindValue(translation->key());
+    cur.addBindValue(removeAccents(translation->key()));
     cur.addBindValue(translation->toHtml());
     cur.exec();
     db.close();
@@ -108,7 +139,8 @@ QList<Translation*> Bookmarks::searchWordList(QString word) {
         return tr;
     }
     QSqlQuery cur(db);
-    cur.prepare("select key from bookmarks where key like ?");
+    cur.prepare("select key from bookmarks where key like ? or normalized like ?");
+    cur.addBindValue(word);
     cur.addBindValue(word);
     cur.exec();
     QSet<QString> res;
@@ -143,19 +175,14 @@ QStringList Bookmarks::search(QString word, QString dbName) {
 
 
 QString Bookmarks::removeAccents(QString string) {
-    string = string.replace(QString::fromUtf8("ł"), "l", Qt::CaseInsensitive);
-    QString normalized = string.normalized(QString::NormalizationForm_D);
-    normalized = normalized;
-    for(int i=0; i<normalized.size(); i++) {
-        if( !normalized[i].isLetterOrNumber() &&
-            !normalized[i].isSpace() &&
-            !normalized[i].isDigit() &&
-            normalized[i] != '*' &&
-            normalized[i] != '%') {
-            normalized.remove(i,1);
-        }
-    }
-    return normalized;
+   string = string.toLower();
+   QString normalized = string.normalized(QString::NormalizationForm_KD);
+   foreach(QChar let, letters.keys())
+       normalized.replace(letters[let], QString(let));
+
+   normalized.replace(noLetter, "");
+   //qDebug() << "NORMALIZED: " << normalized;
+   return normalized;
 }
 
 
index 3726415..ddee782 100644 (file)
@@ -96,11 +96,15 @@ public:
     bool inBookmarks(QString word);
 
 private:
-    QString dbName;
-
     bool checkAndCreateDb();
+    void initAccents();
+
+    
+    QString dbName;
     QString removeAccents(QString);
     QSqlDatabase getDbCnx(QString dbName);
+    QMap<QChar, QRegExp> letters;
+    QRegExp noLetter;
 
 };
 
index 6ca7ff2..9d50aa0 100644 (file)
@@ -228,7 +228,7 @@ public Q_SLOTS:
 
         if(_searchBookmarks) {
            _innerBookmarks = QtConcurrent::run(_bookmarks,
-                   &Bookmarks::searchWordList, QString("*"));
+                   &Bookmarks::list);
            _bookmarkSearchWatcher.setFuture(_innerBookmarks);
         }
    }