X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FThesaurus.cpp;h=1c1adc03b0e22cb91154ac21e396957b05997bb3;hb=4ed0312c51704780af1c452d3a82a84171b3725a;hp=b4655ac27f93e6290fc320ba928c37404c515a45;hpb=aafd52f44167d5510be1ddcb974daa9dae486933;p=lyx.git diff --git a/src/Thesaurus.cpp b/src/Thesaurus.cpp index b4655ac27f..1c1adc03b0 100644 --- a/src/Thesaurus.cpp +++ b/src/Thesaurus.cpp @@ -21,20 +21,14 @@ #include "support/FileNameList.h" #include "support/Package.h" #include "support/debug.h" +#include "support/docstring.h" #include "support/docstring_list.h" #include "support/filetools.h" -#include "support/gettext.h" #include "support/lstrings.h" #include "support/os.h" -#ifdef USE_EXTERNAL_MYTHES -#include MYTHES_H_LOCATION -#else #include -#include "support/mythes/mythes.hxx" -#endif - -#include "frontends/alert.h" +#include MYTHES_H_LOCATION #include #include @@ -50,7 +44,7 @@ namespace { typedef std::map Thesauri; -} // namespace anon +} // namespace struct Thesaurus::Private { @@ -107,6 +101,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 @@ -128,8 +127,23 @@ pair Thesaurus::Private::getThesaurus(string const & path, docstr break; } } - if (idx.empty()) + 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) { if (contains(it->onlyFileName(), basename)) { data = it->absFileName(); @@ -200,10 +214,10 @@ bool Thesaurus::thesaurusInstalled(docstring const & lang) const Thesaurus::Meanings Thesaurus::lookup(WordLangTuple const & wl) { Meanings meanings; - MyThes * mythes = 0; + MyThes * mythes = nullptr; docstring const lang_code = from_ascii(wl.lang()->code()); - docstring const t = wl.word(); + docstring const & t = wl.word(); if (!d->addThesaurus(lang_code)) return meanings; @@ -220,7 +234,7 @@ Thesaurus::Meanings Thesaurus::lookup(WordLangTuple const & wl) return meanings; string const encoding = mythes->get_th_encoding(); - + mentry * pmean; string const text = to_iconv_encoding(support::lowercase(t), encoding); int len = strlen(text.c_str()); @@ -252,6 +266,7 @@ Thesaurus::Meanings Thesaurus::lookup(WordLangTuple const & wl) // remove silly item if (support::prefixIs(meaning, '-')) meaning = support::ltrim(meaning, "- "); + ret.reserve(pm->count); for (int j = 0; j < pm->count; j++) { ret.push_back(from_iconv_encoding(string(pm->psyns[j]), encoding)); }