X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FThesaurus.cpp;h=bf657762c1c2d4a423d3998a7dc8245734d3e132;hb=0b17cb113523fb23c43064709e9b6606fe80914c;hp=83eed55ea0133963468f4c9c1e4fc68688f2f35e;hpb=f6071af49d12683a52753f280626d6e7dadcc172;p=lyx.git diff --git a/src/Thesaurus.cpp b/src/Thesaurus.cpp index 83eed55ea0..bf657762c1 100644 --- a/src/Thesaurus.cpp +++ b/src/Thesaurus.cpp @@ -29,6 +29,7 @@ #include #include +#include using namespace std; using namespace lyx::support; @@ -91,10 +92,28 @@ pair Thesaurus::Private::getThesaurus(string const & path, docstr FileNameList const data_files = base.dirList("dat"); string idx; string data; + string basename; LYXERR(Debug::FILES, "thesaurus path: " << path); for (FileNameList::const_iterator it = idx_files.begin(); it != idx_files.end(); ++it) { - if (contains(it->onlyFileName(), to_ascii(lang))) { + basename = it->onlyFileNameWithoutExt(); + if (contains(basename, to_ascii(lang))) { + ifstream ifs(it->absFileName().c_str()); + if (ifs) { + // check for appropriate version of index file + string encoding; // first line is encoding + int items = 0; // second line is no. of items + getline(ifs,encoding); + ifs >> items; + if (ifs.fail()) { + LYXERR(Debug::FILES, "ignore irregular thesaurus idx file: " << it->absFileName()); + continue; + } + if (encoding.length() == 0 || encoding.find_first_of(',') != string::npos) { + LYXERR(Debug::FILES, "ignore version1 thesaurus idx file: " << it->absFileName()); + continue; + } + } idx = it->absFileName(); LYXERR(Debug::FILES, "selected thesaurus idx file: " << idx); break; @@ -104,7 +123,7 @@ pair Thesaurus::Private::getThesaurus(string const & path, docstr return make_pair(string(), string()); } for (support::FileNameList::const_iterator it = data_files.begin(); it != data_files.end(); ++it) { - if (contains(it->onlyFileName(), to_ascii(lang))) { + if (contains(it->onlyFileName(), basename)) { data = it->absFileName(); LYXERR(Debug::FILES, "selected thesaurus data file: " << data); break; @@ -164,6 +183,8 @@ bool Thesaurus::thesaurusAvailable(docstring const & lang) const bool Thesaurus::thesaurusInstalled(docstring const & lang) const { + if (thesaurusAvailable(lang)) + return true; pair files = d->getThesaurus(lang); return (!files.first.empty() && !files.second.empty()); } @@ -201,17 +222,17 @@ Thesaurus::Meanings Thesaurus::lookup(docstring const & t, docstring const & lan // they are needed for the CleanUpAfterLookup routine mentry * pm = pmean; docstring meaning; - docstring ret; for (int i = 0; i < count; i++) { + vector ret; meaning = from_iconv_encoding(string(pm->defn), encoding); // remove silly item if (support::prefixIs(meaning, '-')) meaning = support::ltrim(meaning, "- "); for (int j = 0; j < pm->count; j++) { - ret = from_iconv_encoding(string(pm->psyns[j]), encoding); + ret.push_back(from_iconv_encoding(string(pm->psyns[j]), encoding)); } - meanings[meaning].push_back(ret); - pm++; + meanings[meaning] = ret; + ++pm; } // now clean up all allocated memory mythes->CleanUpAfterLookup(&pmean, count);