summaryrefslogtreecommitdiffstats
path: root/kdelibs/kdelibs-nepomuk-unicode.diff
blob: 6a276447d2b5bbf8d3e0a8159b58b8d6c9a2acf6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
diff --git a/nepomuk/query/querybuilderdata_p.h b/nepomuk/query/querybuilderdata_p.h
index 055482e..3880e13 100644
--- a/nepomuk/query/querybuilderdata_p.h
+++ b/nepomuk/query/querybuilderdata_p.h
@@ -32,6 +32,28 @@
 #include "query_p.h"
 #include "groupterm_p.h"

+namespace {
+/// A hack to avoid passing extended chars to the bif:search_excerpts method which cannot handle
+/// utf8 chars which use more than one char, ie. wide chars.
+/// Thus, we simply truncate each term at the first wide char.
+QStringList stripExtendedCharsHack(const QStringList& terms) {
+    QStringList newTerms;
+    foreach(const QString& term, terms) {
+        int i = 0;
+        while(i < term.length()) {
+            if(term[i].unicode() > 0x7f) {
+                break;
+            }
+            ++i;
+        }
+        if(i > 0) {
+            newTerms.append(term.left(i));
+        }
+    }
+    return newTerms;
+}
+}
+
 namespace Nepomuk {
     namespace Query {
         class QueryBuilderData
@@ -246,16 +268,23 @@ namespace Nepomuk {
                     for( QHash<QString, QStringList>::const_iterator it = m_fullTextSearchTerms.constBegin();
                          it != m_fullTextSearchTerms.constEnd(); ++it ) {
                         const QString& varName = it.key();
-                        const QStringList& terms = it.value();
-                        // bif:search_excerpt wants a vector of all search terms
-                        excerptParts
-                                << QString::fromLatin1("bif:search_excerpt(bif:vector(bif:charset_recode('%1', '_WIDE_', 'UTF-8')), %2)")
-                            .arg( terms.join(QLatin1String("','")),
-                                  varName );
+                        const QStringList terms = stripExtendedCharsHack(it.value());
+                        if(terms.count()) {
+                            // bif:search_excerpt wants a vector of all search terms
+                            excerptParts
+                                    << QString::fromLatin1("bif:search_excerpt(bif:vector('%1'), %2)")
+                                       .arg( terms.join(QLatin1String("','")),
+                                             varName );
+                        }
                     }

-                    return QString::fromLatin1("(bif:concat(%1)) as ?_n_f_t_m_ex_")
-                        .arg(excerptParts.join(QLatin1String(",")));
+                    if(excerptParts.count()) {
+                        return QString::fromLatin1("(bif:concat(%1)) as ?_n_f_t_m_ex_")
+                                .arg(excerptParts.join(QLatin1String(",")));
+                    }
+                    else {
+                        return QString();
+                    }
                 }
                 else {
                     return QString();