Author: spitz
Date: Fri Mar 2 11:20:09 2012
New Revision: 40830
URL: http://www.lyx.org/trac/changeset/40830
Log:
Implement access to hunspell's stemming function and let the Thesaurus use that
(part of bug #8060).
Modified:
lyx-devel/trunk/src/AppleSpellChecker.h
lyx-devel/trunk/src/AspellChecker.h
lyx-devel/trunk/src/EnchantChecker.h
lyx-devel/trunk/src/HunspellChecker.cpp
lyx-devel/trunk/src/HunspellChecker.h
lyx-devel/trunk/src/SpellChecker.h
lyx-devel/trunk/src/Thesaurus.cpp
lyx-devel/trunk/src/Thesaurus.h
lyx-devel/trunk/src/frontends/qt4/GuiThesaurus.cpp
lyx-devel/trunk/src/frontends/qt4/GuiThesaurus.h
Modified: lyx-devel/trunk/src/AppleSpellChecker.h
==============================================================================
--- lyx-devel/trunk/src/AppleSpellChecker.h Fri Mar 2 10:06:09 2012
(r40829)
+++ lyx-devel/trunk/src/AppleSpellChecker.h Fri Mar 2 11:20:09 2012
(r40830)
@@ -26,6 +26,7 @@
//@{
enum Result check(WordLangTuple const &);
void suggest(WordLangTuple const &, docstring_list &);
+ void stem(WordLangTuple const &, docstring_list &) {};
void insert(WordLangTuple const &);
void remove(WordLangTuple const &);
void accept(WordLangTuple const &);
Modified: lyx-devel/trunk/src/AspellChecker.h
==============================================================================
--- lyx-devel/trunk/src/AspellChecker.h Fri Mar 2 10:06:09 2012 (r40829)
+++ lyx-devel/trunk/src/AspellChecker.h Fri Mar 2 11:20:09 2012 (r40830)
@@ -27,6 +27,7 @@
//@{
enum Result check(WordLangTuple const &);
void suggest(WordLangTuple const &, docstring_list &);
+ void stem(WordLangTuple const &, docstring_list &) {};
void insert(WordLangTuple const &);
void remove(WordLangTuple const &);
void accept(WordLangTuple const &);
Modified: lyx-devel/trunk/src/EnchantChecker.h
==============================================================================
--- lyx-devel/trunk/src/EnchantChecker.h Fri Mar 2 10:06:09 2012
(r40829)
+++ lyx-devel/trunk/src/EnchantChecker.h Fri Mar 2 11:20:09 2012
(r40830)
@@ -33,6 +33,7 @@
///@{
enum Result check(WordLangTuple const &);
void suggest(WordLangTuple const &, docstring_list &);
+ void stem(WordLangTuple const &, docstring_list &) {};
void insert(WordLangTuple const &);
void remove(WordLangTuple const &);
void accept(WordLangTuple const &);
Modified: lyx-devel/trunk/src/HunspellChecker.cpp
==============================================================================
--- lyx-devel/trunk/src/HunspellChecker.cpp Fri Mar 2 10:06:09 2012
(r40829)
+++ lyx-devel/trunk/src/HunspellChecker.cpp Fri Mar 2 11:20:09 2012
(r40830)
@@ -413,6 +413,25 @@
}
+void HunspellChecker::stem(WordLangTuple const & wl,
+ docstring_list & suggestions)
+{
+ suggestions.clear();
+ Hunspell * h = d->speller(wl.lang());
+ if (!h)
+ return;
+ string const encoding = h->get_dic_encoding();
+ string const word_to_check = to_iconv_encoding(wl.word(), encoding);
+ char ** suggestion_list;
+ int const suggestion_number = h->stem(&suggestion_list,
word_to_check.c_str());
+ if (suggestion_number <= 0)
+ return;
+ for (int i = 0; i != suggestion_number; ++i)
+ suggestions.push_back(from_iconv_encoding(suggestion_list[i],
encoding));
+ h->free_list(&suggestion_list, suggestion_number);
+}
+
+
bool HunspellChecker::hasDictionary(Language const * lang) const
{
if (!lang)
Modified: lyx-devel/trunk/src/HunspellChecker.h
==============================================================================
--- lyx-devel/trunk/src/HunspellChecker.h Fri Mar 2 10:06:09 2012
(r40829)
+++ lyx-devel/trunk/src/HunspellChecker.h Fri Mar 2 11:20:09 2012
(r40830)
@@ -27,6 +27,7 @@
///@{
enum Result check(WordLangTuple const &);
void suggest(WordLangTuple const &, docstring_list &);
+ void stem(WordLangTuple const &, docstring_list &);
void insert(WordLangTuple const &);
void remove(WordLangTuple const &);
void accept(WordLangTuple const &);
Modified: lyx-devel/trunk/src/SpellChecker.h
==============================================================================
--- lyx-devel/trunk/src/SpellChecker.h Fri Mar 2 10:06:09 2012 (r40829)
+++ lyx-devel/trunk/src/SpellChecker.h Fri Mar 2 11:20:09 2012 (r40830)
@@ -62,6 +62,9 @@
/// Gives suggestions.
virtual void suggest(WordLangTuple const &, docstring_list &
suggestions) = 0;
+ /// Lemmatizing: return stem of word (used by Thesaurus).
+ virtual void stem(WordLangTuple const &, docstring_list & suggestions)
= 0;
+
/// insert the given word into the personal dictionary
virtual void insert(WordLangTuple const &) = 0;
Modified: lyx-devel/trunk/src/Thesaurus.cpp
==============================================================================
--- lyx-devel/trunk/src/Thesaurus.cpp Fri Mar 2 10:06:09 2012 (r40829)
+++ lyx-devel/trunk/src/Thesaurus.cpp Fri Mar 2 11:20:09 2012 (r40830)
@@ -15,9 +15,13 @@
#include "LyXRC.h"
+#include "SpellChecker.h"
+#include "WordLangTuple.h"
+
#include "support/FileNameList.h"
#include "support/Package.h"
#include "support/debug.h"
+#include "support/docstring_list.h"
#include "support/filetools.h"
#include "support/gettext.h"
#include "support/lstrings.h"
@@ -195,17 +199,20 @@
}
-Thesaurus::Meanings Thesaurus::lookup(docstring const & t, docstring const &
lang)
+Thesaurus::Meanings Thesaurus::lookup(WordLangTuple const & wl)
{
Meanings meanings;
MyThes * mythes = 0;
- if (!d->addThesaurus(lang))
+ docstring const lang_code = from_ascii(wl.lang()->code());
+ docstring const t = wl.word();
+
+ if (!d->addThesaurus(lang_code))
return meanings;
for (Thesauri::const_iterator it = d->thes_.begin();
it != d->thes_.end(); ++it) {
- if (it->first == lang) {
+ if (it->first == lang_code) {
mythes = it->second;
break;
}
@@ -220,8 +227,22 @@
string const text = to_iconv_encoding(support::lowercase(t), encoding);
int len = strlen(text.c_str());
int count = mythes->Lookup(text.c_str(), len, &pmean);
- if (!count)
- return meanings;
+ if (!count) {
+ SpellChecker * speller = theSpellChecker();
+ if (!speller)
+ return meanings;
+ docstring_list suggestions;
+ speller->stem(wl, suggestions);
+ for (size_t i = 0; i != suggestions.size(); ++i) {
+ string const wordform =
to_iconv_encoding(support::lowercase(suggestions[i]), encoding);
+ len = strlen(wordform.c_str());
+ count = mythes->Lookup(wordform.c_str(), len, &pmean);
+ if (count)
+ break;
+ }
+ if (!count)
+ return meanings;
+ }
// don't change value of pmean or count
// they are needed for the CleanUpAfterLookup routine
Modified: lyx-devel/trunk/src/Thesaurus.h
==============================================================================
--- lyx-devel/trunk/src/Thesaurus.h Fri Mar 2 10:06:09 2012 (r40829)
+++ lyx-devel/trunk/src/Thesaurus.h Fri Mar 2 11:20:09 2012 (r40830)
@@ -14,6 +14,7 @@
#define THESAURUS_H
#include "support/docstring.h"
+#include "WordLangTuple.h"
#include <map>
#include <string>
@@ -38,7 +39,7 @@
/**
* look up some text in the thesaurus
*/
- Meanings lookup(docstring const & text, docstring const & lang);
+ Meanings lookup(WordLangTuple const & wl);
/** check if a thesaurus for a given language \p lang is available
* (installed and loaded)
*/
Modified: lyx-devel/trunk/src/frontends/qt4/GuiThesaurus.cpp
==============================================================================
--- lyx-devel/trunk/src/frontends/qt4/GuiThesaurus.cpp Fri Mar 2 10:06:09
2012 (r40829)
+++ lyx-devel/trunk/src/frontends/qt4/GuiThesaurus.cpp Fri Mar 2 11:20:09
2012 (r40830)
@@ -22,6 +22,7 @@
#include "FuncRequest.h"
#include "Language.h"
#include "lyxfind.h"
+#include "WordLangTuple.h"
#include "support/debug.h"
#include "support/gettext.h"
@@ -173,11 +174,11 @@
QString const lang = languageCO->itemData(
languageCO->currentIndex()).toString();
- docstring const lang_code =
- from_ascii(lyx::languages.getLanguage(fromqstr(lang))->code());
+ Language * language =
const_cast<Language*>(lyx::languages.getLanguage(fromqstr(lang)));
+ docstring const lang_code = from_ascii(language->code());
Thesaurus::Meanings meanings =
- getMeanings(qstring_to_ucs4(entryCO->currentText()), lang_code);
+
getMeanings(WordLangTuple(qstring_to_ucs4(entryCO->currentText()), language));
for (Thesaurus::Meanings::const_iterator cit = meanings.begin();
cit != meanings.end(); ++cit) {
@@ -271,11 +272,10 @@
}
-Thesaurus::Meanings const & GuiThesaurus::getMeanings(docstring const & str,
- docstring const & lang)
+Thesaurus::Meanings const & GuiThesaurus::getMeanings(WordLangTuple const & wl)
{
- if (str != laststr_)
- meanings_ = thesaurus.lookup(str, lang);
+ if (wl.word() != laststr_)
+ meanings_ = thesaurus.lookup(wl);
return meanings_;
}
Modified: lyx-devel/trunk/src/frontends/qt4/GuiThesaurus.h
==============================================================================
--- lyx-devel/trunk/src/frontends/qt4/GuiThesaurus.h Fri Mar 2 10:06:09
2012 (r40829)
+++ lyx-devel/trunk/src/frontends/qt4/GuiThesaurus.h Fri Mar 2 11:20:09
2012 (r40830)
@@ -16,6 +16,8 @@
#include "Thesaurus.h"
#include "ui_ThesaurusUi.h"
+#include "WordLangTuple.h"
+
class QTreeWidgetItem;
namespace lyx {
@@ -56,8 +58,7 @@
void replace(docstring const & newstr);
/// get meanings
- Thesaurus::Meanings const & getMeanings(docstring const & str,
- docstring const & lang);
+ Thesaurus::Meanings const & getMeanings(WordLangTuple const & wl);
private:
/// last string looked up