X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FThesaurus.cpp;h=cf8567eb53f5c9a5403296c3e1615ccd3ce7530d;hb=28be7d552f62cc02fa86d7f79201d089bfb2d7b5;hp=bf657762c1c2d4a423d3998a7dc8245734d3e132;hpb=0bc5f2795922d75fa18add8c528fa7d986edd2fe;p=lyx.git diff --git a/src/Thesaurus.cpp b/src/Thesaurus.cpp index bf657762c1..cf8567eb53 100644 --- a/src/Thesaurus.cpp +++ b/src/Thesaurus.cpp @@ -15,15 +15,20 @@ #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" #include "support/os.h" -#include "support/mythes/mythes.hxx" +#include +#include MYTHES_H_LOCATION #include "frontends/alert.h" @@ -98,6 +103,11 @@ pair Thesaurus::Private::getThesaurus(string const & path, docstr for (FileNameList::const_iterator it = idx_files.begin(); it != idx_files.end(); ++it) { basename = it->onlyFileNameWithoutExt(); if (contains(basename, to_ascii(lang))) { + // do not use more specific dicts. + if (contains(basename, '_') && !contains(lang, '_')) + continue; + if (contains(basename, '-') && !contains(lang, '-')) + continue; ifstream ifs(it->absFileName().c_str()); if (ifs) { // check for appropriate version of index file @@ -120,6 +130,20 @@ pair Thesaurus::Private::getThesaurus(string const & path, docstr } } if (idx.empty()) { + // try with a more general dictionary + docstring shortcode; + if (contains(lang, '_')) { + split(lang, shortcode, '_'); + LYXERR(Debug::FILES, "Did not find thesaurus for LANG code " + << lang << ". Trying with " << shortcode); + return getThesaurus(path, shortcode); + } + else if (contains(lang, '-')) { + split(lang, shortcode, '-'); + LYXERR(Debug::FILES, "Did not find thesaurus for LANG code " + << lang << ". Trying with " << shortcode); + return getThesaurus(path, shortcode); + } return make_pair(string(), string()); } for (support::FileNameList::const_iterator it = data_files.begin(); it != data_files.end(); ++it) { @@ -141,9 +165,8 @@ pair Thesaurus::Private::getThesaurus(docstring const & lang) if (thesaurusAvailable(lang)) return make_pair(string(), string()); - if (!thes_path.empty()) { + if (!thes_path.empty()) result = getThesaurus(thes_path, lang); - } if (result.first.empty() || result.second.empty()) { string const sys_path = external_path(addName(lyx::support::package().system_support().absFileName(),dataDirectory())) ; result = getThesaurus(sys_path, lang); @@ -190,17 +213,20 @@ bool Thesaurus::thesaurusInstalled(docstring const & lang) const } -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; } @@ -215,8 +241,22 @@ Thesaurus::Meanings Thesaurus::lookup(docstring const & t, docstring const & lan 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 @@ -245,7 +285,8 @@ Thesaurus::Meanings Thesaurus::lookup(docstring const & t, docstring const & lan } -Thesaurus::Thesaurus() : d(new Thesaurus::Private) +Thesaurus::Thesaurus() + : d(new Thesaurus::Private) { }