X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2FThesaurus.cpp;h=bf657762c1c2d4a423d3998a7dc8245734d3e132;hb=53a72a45266feb86c13f47615a4cbb15053f3c63;hp=f3814baaf7adc4bf246f4ca3c52ea715589063c9;hpb=5c59e8c7cb3a804d403061e76a34c0378320b9b0;p=lyx.git diff --git a/src/Thesaurus.cpp b/src/Thesaurus.cpp index f3814baaf7..bf657762c1 100644 --- a/src/Thesaurus.cpp +++ b/src/Thesaurus.cpp @@ -16,12 +16,12 @@ #include "LyXRC.h" #include "support/FileNameList.h" +#include "support/Package.h" #include "support/debug.h" #include "support/filetools.h" #include "support/gettext.h" #include "support/lstrings.h" #include "support/os.h" -#include "support/unicode.h" #include "support/mythes/mythes.hxx" @@ -29,6 +29,7 @@ #include #include +#include using namespace std; using namespace lyx::support; @@ -38,26 +39,10 @@ namespace lyx { namespace { -string const to_iconv_encoding(docstring const & s, string const & encoding) -{ - std::vector const encoded = - ucs4_to_eightbit(s.data(), s.length(), encoding); - return string(encoded.begin(), encoded.end()); -} - - -docstring const from_iconv_encoding(string const & s, string const & encoding) -{ - std::vector const ucs4 = - eightbit_to_ucs4(s.data(), s.length(), encoding); - return docstring(ucs4.begin(), ucs4.end()); -} - typedef std::map Thesauri; } // namespace anon - struct Thesaurus::Private { ~Private() @@ -82,56 +67,100 @@ struct Thesaurus::Private /// typedef std::pair ThesFiles; /// + ThesFiles getThesaurus(string const & path, docstring const & lang); ThesFiles getThesaurus(docstring const & lang); /// add a thesaurus to the list bool addThesaurus(docstring const & lang); /// the thesauri Thesauri thes_; + + /// the location below system/user directory + /// there the data+idx files lookup will happen + const string dataDirectory(void) { return "thes"; } + }; -pair Thesaurus::Private::getThesaurus(docstring const & lang) +pair Thesaurus::Private::getThesaurus(string const & path, docstring const & lang) { - string const thes_path = external_path(lyxrc.thesaurusdir_path); - LYXERR(Debug::FILES, "thesaurus path: " << thes_path); - if (thes_path.empty()) + FileName base(path); + if (!base.isDirectory()) { return make_pair(string(), string()); - - if (thesaurusAvailable(lang)) - return make_pair(string(), string()); - - FileNameList const idx_files = FileName(thes_path).dirList("idx"); - FileNameList const data_files = FileName(thes_path).dirList("dat"); + } + FileNameList const idx_files = base.dirList("idx"); + FileNameList const data_files = base.dirList("dat"); string idx; string data; - - for (FileNameList::const_iterator it = idx_files.begin(); - it != idx_files.end(); ++it) { - LYXERR(Debug::FILES, "found thesaurus idx file: " << it->onlyFileName()); - if (contains(it->onlyFileName(), to_ascii(lang))) { - idx = it->absFilename(); + string basename; + + LYXERR(Debug::FILES, "thesaurus path: " << path); + for (FileNameList::const_iterator it = idx_files.begin(); it != idx_files.end(); ++it) { + 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; - } } - - for (support::FileNameList::const_iterator it = data_files.begin(); - it != data_files.end(); ++it) { - LYXERR(Debug::FILES, "found thesaurus data file: " << it->onlyFileName()); - if (contains(it->onlyFileName(), to_ascii(lang))) { - data = it->absFilename(); + } + if (idx.empty()) { + 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(); LYXERR(Debug::FILES, "selected thesaurus data file: " << data); break; - } } - + } return make_pair(idx, data); } +pair Thesaurus::Private::getThesaurus(docstring const & lang) +{ + string const thes_path = external_path(lyxrc.thesaurusdir_path); + pair result ; + + if (thesaurusAvailable(lang)) + return make_pair(string(), string()); + + 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); + } + if (result.first.empty() || result.second.empty()) { + string const user_path = external_path(addName(lyx::support::package().user_support().absFileName(),dataDirectory())) ; + result = getThesaurus(user_path, lang); + } + return result; +} + + bool Thesaurus::Private::addThesaurus(docstring const & lang) { + if (thesaurusAvailable(lang)) + return true; + ThesFiles files = getThesaurus(lang); string const idx = files.first; string const data = files.second; @@ -154,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()); } @@ -191,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);