X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FThesaurus.cpp;h=a80ef87ad7c09bae4d9b829278cc38a255f66699;hb=2098f1d8c20d51e63e670bcdc9da8996068975bf;hp=c9e9e8f3b1293ec4fc427faf3ddbaad636aac63e;hpb=d2d31b9130a3a0eafef6378864baaddde90999f7;p=lyx.git diff --git a/src/Thesaurus.cpp b/src/Thesaurus.cpp index c9e9e8f3b1..a80ef87ad7 100644 --- a/src/Thesaurus.cpp +++ b/src/Thesaurus.cpp @@ -4,7 +4,7 @@ * Licence details can be found in the file COPYING. * * \author John Levon - * \author Jürgen Spitzmüller + * \author Jürgen Spitzmüller * * Full author contact details are available in file CREDITS. */ @@ -13,83 +13,28 @@ #include "Thesaurus.h" -#include "debug.h" +#include "LyXRC.h" + +#include "support/FileNameList.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 - - -namespace lyx { - -using std::sort; -using std::string; -using std::endl; - - -#ifndef HAVE_LIBMYTHES -#ifdef HAVE_LIBAIKSAURUS -Thesaurus::Thesaurus() - : thes_(new Aiksaurus) -{} - - -Thesaurus::~Thesaurus() -{ - delete thes_; -} - - -Thesaurus::Meanings Thesaurus::lookup(docstring const & t) -{ - Meanings meanings; - - // aiksaurus is for english text only, therefore it does not work - // with non-ascii strings. - // The interface of the Thesaurus class uses docstring because a - // non-english thesaurus is possible in theory. - if (!support::isAscii(t)) - // to_ascii() would assert - return meanings; - - string const text = to_ascii(t); - if (!thes_->find(text.c_str())) - return meanings; - - // weird api, but ... - - int prev_meaning = -1; - int cur_meaning; - docstring meaning; - - // correct, returns "" at the end - string ret = thes_->next(cur_meaning); - - while (!ret.empty()) { - if (cur_meaning != prev_meaning) { - meaning = from_ascii(ret); - ret = thes_->next(cur_meaning); - prev_meaning = cur_meaning; - } else { - if (ret != text) - meanings[meaning].push_back(from_ascii(ret)); - } - - ret = thes_->next(cur_meaning); - } +#include "support/mythes/mythes.hxx" - for (Meanings::iterator it = meanings.begin(); - it != meanings.end(); ++it) - sort(it->second.begin(), it->second.end()); +#include "frontends/alert.h" - return meanings; -} - -#endif // HAVE_LIBAIKSAURUS -#endif // !HAVE_LIBMYTHES +#include +#include +using namespace std; +using namespace lyx::support; +using namespace lyx::support::os; -#ifdef HAVE_LIBMYTHES +namespace lyx { namespace { @@ -108,36 +53,115 @@ docstring const from_iconv_encoding(string const & s, string const & encoding) return docstring(ucs4.begin(), ucs4.end()); } +typedef std::map Thesauri; + } // namespace anon -Thesaurus::Thesaurus() +struct Thesaurus::Private +{ + ~Private() + { + for (Thesauri::iterator it = thes_.begin(); + it != thes_.end(); ++it) { + delete it->second; + } + } + /// + bool thesaurusAvailable(docstring const & lang) const + { + for (Thesauri::const_iterator it = thes_.begin(); + it != thes_.end(); ++it) { + if (it->first == lang) + if (it->second) + return true; + } + return false; + } + + /// add a thesaurus to the list + bool addThesaurus(docstring const & lang); + + /// the thesauri + Thesauri thes_; +}; + +bool Thesaurus::Private::addThesaurus(docstring const & lang) { - string const idx("/home/juergen/updates/MyThes-1.0/th_de_DE_v2.idx"); - string const data("/home/juergen/updates/MyThes-1.0/th_de_DE_v2.dat"); + string const thes_path = external_path(lyxrc.thesaurusdir_path); + LYXERR(Debug::FILES, "thesaurus path: " << thes_path); + if (thes_path.empty()) + return false; + + if (thesaurusAvailable(lang)) + return true; + + FileNameList const idx_files = FileName(thes_path).dirList("idx"); + FileNameList const data_files = FileName(thes_path).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(); + 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(); + LYXERR(Debug::FILES, "selected thesaurus data file: " << data); + break; + } + } + + if (idx.empty() || data.empty()) + return false; + char const * af = idx.c_str(); char const * df = data.c_str(); - thes_ = new MyThes(af, df); + thes_[lang] = new MyThes(af, df); + return true; } -Thesaurus::~Thesaurus() +bool Thesaurus::thesaurusAvailable(docstring const & lang) const { - if (thes_) - delete thes_; + return d->thesaurusAvailable(lang); } -Thesaurus::Meanings Thesaurus::lookup(docstring const & t) +Thesaurus::Meanings Thesaurus::lookup(docstring const & t, docstring const & lang) { Meanings meanings; + MyThes * mythes = 0; + + if (!d->addThesaurus(lang)) + return meanings; + + for (Thesauri::const_iterator it = d->thes_.begin(); + it != d->thes_.end(); ++it) { + if (it->first == lang) { + mythes = it->second; + break; + } + } - string const encoding = thes_->get_th_encoding(); + if (!mythes) + 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()); - int count = thes_->Lookup(text.c_str(), len, &pmean); + int count = mythes->Lookup(text.c_str(), len, &pmean); if (!count) return meanings; @@ -157,8 +181,8 @@ Thesaurus::Meanings Thesaurus::lookup(docstring const & t) meanings[meaning].push_back(ret); pm++; } - // now clean up all allocated memory - thes_->CleanUpAfterLookup(&pmean, count); + // now clean up all allocated memory + mythes->CleanUpAfterLookup(&pmean, count); for (Meanings::iterator it = meanings.begin(); it != meanings.end(); ++it) @@ -167,25 +191,17 @@ Thesaurus::Meanings Thesaurus::lookup(docstring const & t) return meanings; } -#else -Thesaurus::Thesaurus() +Thesaurus::Thesaurus() : d(new Thesaurus::Private) { } Thesaurus::~Thesaurus() { + delete d; } - -Thesaurus::Meanings Thesaurus::lookup(docstring const &) -{ - return Meanings(); -} - -#endif // HAVE_LIBMYTHES - // Global instance Thesaurus thesaurus;