Fix Assistant search crashes with square brackets, etc...
authorkh1 <karsten.heimrich@digia.com>
Wed, 19 Dec 2012 14:45:56 +0000 (15:45 +0100)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Wed, 9 Jan 2013 11:40:16 +0000 (12:40 +0100)
Task-number: QTBUG-28700

In 8f83747d12 escaping of special characters got lost in translation,
though it is required since some of these, like [] are field separators
inside clucenes index file. The full text search throws exceptions if
it encounters un-escaped field separators.

Change-Id: I5e457f95db426554d29bc33bea00a92fb6cfcba5
Reviewed-by: Christian Kandeler <christian.kandeler@digia.com>
src/assistant/help/qhelpsearchquerywidget.cpp

index befb5d4..26a85fc 100644 (file)
@@ -136,6 +136,35 @@ private:
 #endif
     }
 
+    QList<QHelpSearchQuery> escapeQueries(const QList<QHelpSearchQuery> &queries)
+    {
+        static QStringList charsToEscapeList;
+        if (charsToEscapeList.isEmpty()) {
+            charsToEscapeList << QLatin1String("\\") << QLatin1String("+") << QLatin1String("-")
+                << QLatin1String("!") << QLatin1String("(") << QLatin1String(")") << QLatin1String(":")
+                << QLatin1String("^") << QLatin1String("[") << QLatin1String("]") << QLatin1String("{")
+                << QLatin1String("}") << QLatin1String("~");
+        }
+
+        static QString escapeChar(QLatin1String("\\"));
+        static QRegExp regExp(QLatin1String("[\\+\\-\\!\\(\\)\\^\\[\\]\\{\\}~:]"));
+
+        QList<QHelpSearchQuery> escapedQueries;
+        foreach (const QHelpSearchQuery &query, queries) {
+            QHelpSearchQuery escapedQuery;
+            escapedQuery.fieldName = query.fieldName;
+            foreach (QString word, query.wordList) {
+                if (word.contains(regExp)) {
+                    foreach (const QString &charToEscape, charsToEscapeList)
+                        word.replace(charToEscape, escapeChar + charToEscape);
+                }
+                escapedQuery.wordList.append(word);
+            }
+            escapedQueries.append(escapedQuery);
+        }
+        return escapedQueries;
+    }
+
     QStringList buildTermList(const QString query)
     {
         bool s = false;
@@ -279,7 +308,6 @@ private slots:
 #if !defined(QT_CLUCENE_SUPPORT)
         queryList.append(QHelpSearchQuery(QHelpSearchQuery::DEFAULT,
             QStringList(defaultQuery->text())));
-
 #else
         if (defaultQuery->isEnabled()) {
             queryList.append(QHelpSearchQuery(QHelpSearchQuery::DEFAULT,
@@ -393,7 +421,7 @@ private:
     \fn void QHelpSearchQueryWidget::search()
 
     This signal is emitted when a the user has the search button invoked.
-    After reciving the signal you can ask the QHelpSearchQueryWidget for the
+    After receiving the signal you can ask the QHelpSearchQueryWidget for the
     build list of QHelpSearchQuery's that you may pass to the QHelpSearchEngine's
     search() function.
 */
@@ -538,8 +566,9 @@ QList<QHelpSearchQuery> QHelpSearchQueryWidget::query() const
 {
     const QHelpSearchQueryWidgetPrivate::QueryHistory &queryHist =
         d->simpleSearch ? d->simpleQueries : d->complexQueries;
-    return queryHist.queries.isEmpty() ?
-        QList<QHelpSearchQuery>() : queryHist.queries.last();
+    if (queryHist.queries.isEmpty())
+        return QList<QHelpSearchQuery>();
+    return d->escapeQueries(queryHist.queries.last());
 }
 
 /*!