From f6e50fd9eb5319c93ca0d97195d232b9ca8b4636 Mon Sep 17 00:00:00 2001 From: Jean-Francois Dockes Date: Fri, 17 Feb 2012 09:01:28 +0100 Subject: [PATCH] Result list: improve the spelling suggestions now presented as links which will replace the appropriate word inside the query --- src/qtgui/rclmain_w.cpp | 2 ++ src/qtgui/reslist.cpp | 42 ++++++++++++++++++++++++++++++-------- src/qtgui/reslist.h | 1 + src/qtgui/ssearch_w.cpp | 9 ++++++++ src/qtgui/ssearch_w.h | 2 +- src/query/reslistpager.cpp | 23 +++++++++++++-------- src/query/reslistpager.h | 3 ++- 7 files changed, 64 insertions(+), 18 deletions(-) diff --git a/src/qtgui/rclmain_w.cpp b/src/qtgui/rclmain_w.cpp index 6c580245..c6fd1d71 100644 --- a/src/qtgui/rclmain_w.cpp +++ b/src/qtgui/rclmain_w.cpp @@ -306,6 +306,8 @@ void RclMain::init() this, SLOT(docExpand(Rcl::Doc))); connect(reslist, SIGNAL(wordSelect(QString)), sSearch, SLOT(addTerm(QString))); + connect(reslist, SIGNAL(wordReplace(const QString&, const QString&)), + sSearch, SLOT(onWordReplace(const QString&, const QString&))); connect(reslist, SIGNAL(nextPageAvailable(bool)), this, SLOT(enableNextPage(bool))); connect(reslist, SIGNAL(prevPageAvailable(bool)), diff --git a/src/qtgui/reslist.cpp b/src/qtgui/reslist.cpp index 697d2a56..2eb7a05e 100644 --- a/src/qtgui/reslist.cpp +++ b/src/qtgui/reslist.cpp @@ -76,7 +76,8 @@ public: virtual string nextUrl(); virtual string prevUrl(); virtual string pageTop(); - virtual void suggest(const vectoruterms, vector&sugg); + virtual void suggest(const vectoruterms, + map >& sugg); virtual string absSep() {return (const char *)(prefs.abssep.toUtf8());} virtual string iconUrl(RclConfig *, Rcl::Doc& doc); private: @@ -163,7 +164,8 @@ string QtGuiResListPager::pageTop() } -void QtGuiResListPager::suggest(const vectoruterms, vector&sugg) +void QtGuiResListPager::suggest(const vectoruterms, + map >& sugg) { sugg.clear(); #ifdef RCL_USE_ASPELL @@ -179,6 +181,10 @@ void QtGuiResListPager::suggest(const vectoruterms, vector&sugg) uit != uterms.end(); uit++) { list asuggs; string reason; + + // If the term is in the index, we don't suggest alternatives. + // Actually, we may want to check the frequencies and propose something + // anyway if a possible variation is much more common (as google does) if (aspell->check(*rcldb, *uit, reason)) continue; else if (!reason.empty()) @@ -189,7 +195,15 @@ void QtGuiResListPager::suggest(const vectoruterms, vector&sugg) continue; } if (!asuggs.empty()) { - sugg.push_back(*asuggs.begin()); + sugg[*uit] = vector(asuggs.begin(), asuggs.end()); + if (sugg[*uit].size() > 5) + sugg[*uit].resize(5); + // Set up the links as a . + for (vector::iterator it = sugg[*uit].begin(); + it != sugg[*uit].end(); it++) { + *it = string("" + + *it + ""; + } } } #endif @@ -607,11 +621,9 @@ void ResList::mouseDoubleClickEvent(QMouseEvent *event) void ResList::linkWasClicked(const QUrl &url) { - QByteArray s = url.toString().toAscii(); - const char *ascurl = (const char *)s; - LOGDEB(("ResList::linkWasClicked: [%s]\n", ascurl)); + string ascurl = (const char *)url.toString().toAscii();; + LOGDEB(("ResList::linkWasClicked: [%s]\n", ascurl.c_str())); - int i = atoi(ascurl+1) - 1; int what = ascurl[0]; switch (what) { case 'H': @@ -620,6 +632,7 @@ void ResList::linkWasClicked(const QUrl &url) case 'P': case 'E': { + int i = atoi(ascurl.c_str()+1) - 1; Rcl::Doc doc; if (!getDoc(i, doc)) { LOGERR(("ResList::linkWasClicked: can't get doc for %d\n", i)); @@ -637,8 +650,21 @@ void ResList::linkWasClicked(const QUrl &url) case 'p': resultPageBack(); break; + case 'S': + { + QString s = url.toString(); + if (!s.isEmpty()) + s = s.right(s.size()-1); + int bar = s.indexOf("|"); + if (bar != -1 && bar < s.size()-1) { + QString o = s.left(bar); + QString n = s.right(s.size() - (bar+1)); + emit wordReplace(o, n); + } + } + break; default: - LOGERR(("ResList::linkWasClicked: bad link [%s]\n", ascurl)); + LOGERR(("ResList::linkWasClicked: bad link [%s]\n", ascurl.c_str())); break;// ?? } } diff --git a/src/qtgui/reslist.h b/src/qtgui/reslist.h index cf94a735..8c9828f8 100644 --- a/src/qtgui/reslist.h +++ b/src/qtgui/reslist.h @@ -105,6 +105,7 @@ class ResList : public QTextBrowser void headerClicked(); void docExpand(Rcl::Doc); void wordSelect(QString); + void wordReplace(const QString&, const QString&); void linkClicked(const QString&, int); // See emitLinkClicked() void hasResults(int); diff --git a/src/qtgui/ssearch_w.cpp b/src/qtgui/ssearch_w.cpp index fc75b5f4..a458c8bd 100644 --- a/src/qtgui/ssearch_w.cpp +++ b/src/qtgui/ssearch_w.cpp @@ -236,6 +236,15 @@ void SSearch::addTerm(QString term) queryText->setEditText(text); } +void SSearch::onWordReplace(const QString& o, const QString& n) +{ + QString txt = queryText->currentText(); + QRegExp exp = QRegExp(QString("\\b") + o + QString("\\b")); + exp.setCaseSensitivity(Qt::CaseInsensitive); + txt.replace(exp, n); + queryText->setEditText(txt); +} + void SSearch::setAnyTermMode() { searchTypCMB->setCurrentIndex(SST_ANY); diff --git a/src/qtgui/ssearch_w.h b/src/qtgui/ssearch_w.h index 68d33eb8..f1156f42 100644 --- a/src/qtgui/ssearch_w.h +++ b/src/qtgui/ssearch_w.h @@ -51,7 +51,7 @@ public slots: virtual void setSearchString(const QString& text); virtual void startSimpleSearch(); virtual void addTerm(QString); - + virtual void onWordReplace(const QString&, const QString&); signals: void startSearch(RefCntr); void clearSearch(); diff --git a/src/query/reslistpager.cpp b/src/query/reslistpager.cpp index 1c8fa9ed..06544fac 100644 --- a/src/query/reslistpager.cpp +++ b/src/query/reslistpager.cpp @@ -290,17 +290,24 @@ void ResListPager::displayPage(RclConfig *config) vectoruterms; m_docSource->getUTerms(uterms); if (!uterms.empty()) { - vector spellings; + map > spellings; suggest(uterms, spellings); if (!spellings.empty()) { chunk << - trans("

Alternate spellings (accents suppressed): "); - for (vector::iterator it = spellings.begin(); - it != spellings.end(); it++) { - chunk << *it; - chunk << " "; - } - chunk << "

"; + trans("

Alternate spellings (accents suppressed): ") + << "

"; + + for (map >::const_iterator it0 = + spellings.begin(); it0 != spellings.end(); it0++) { + chunk << "" << it0->first << " : "; + for (vector::const_iterator it = + it0->second.begin(); + it != it0->second.end(); it++) { + chunk << *it << " "; + } + chunk << "
"; + } + chunk << "

"; } } } else { diff --git a/src/query/reslistpager.h b/src/query/reslistpager.h index ee404181..746109d4 100644 --- a/src/query/reslistpager.h +++ b/src/query/reslistpager.h @@ -111,7 +111,8 @@ public: virtual string prevUrl(); virtual string pageTop() {return string();} virtual string iconUrl(RclConfig *, Rcl::Doc& doc); - virtual void suggest(const vector, vector&sugg) { + virtual void suggest(const vector, + map >& sugg) { sugg.clear(); } virtual string absSep() {return "…";}