X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FThesaurus.cpp;h=a0f15150f4f33ec11b976ef356fec140e82bd444;hb=e45427de389bc188f02ebe0de2c052740dcde09c;hp=357ddbbe0bf42c919b08996ca031280f1f91c5ee;hpb=009e23910860c66b6fc27dd484d40b6a6156557c;p=lyx.git diff --git a/src/Thesaurus.cpp b/src/Thesaurus.cpp index 357ddbbe0b..a0f15150f4 100644 --- a/src/Thesaurus.cpp +++ b/src/Thesaurus.cpp @@ -13,15 +13,16 @@ #include "Thesaurus.h" -#include "support/debug.h" -#include "support/gettext.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 "support/mythes/mythes.hxx" #include "frontends/alert.h" @@ -34,133 +35,55 @@ using namespace lyx::support::os; namespace lyx { -#ifndef HAVE_LIBMYTHES -#ifdef HAVE_LIBAIKSAURUS - - -Thesaurus::Thesaurus() - : thes_(new Aiksaurus) -{} +namespace { +typedef std::map Thesauri; -Thesaurus::~Thesaurus() -{ - delete thes_; -} +} // namespace anon -Thesaurus::Meanings Thesaurus::lookup(docstring const & t, docstring const &) +struct Thesaurus::Private { - 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); - - docstring error = from_ascii(thes_->error()); - if (!error.empty()) { - static bool sent_error = false; - if (!sent_error) { - frontend::Alert::error(_("Thesaurus failure"), - bformat(_("Aiksaurus returned the following error:\n\n%1$s."), - error)); - sent_error = true; + ~Private() + { + for (Thesauri::iterator it = thes_.begin(); + it != thes_.end(); ++it) { + delete it->second; } - return meanings; } - 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)); + /// + 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; } - - ret = thes_->next(cur_meaning); + return false; } - for (Meanings::iterator it = meanings.begin(); - it != meanings.end(); ++it) - sort(it->second.begin(), it->second.end()); - - return meanings; -} - - -bool Thesaurus::thesaurusAvailable(docstring const & lang) const -{ - // we support English only - return prefixIs(lang, from_ascii("en_")); -} - -#endif // HAVE_LIBAIKSAURUS -#endif // !HAVE_LIBMYTHES - - -#ifdef HAVE_LIBMYTHES + /// + typedef std::pair ThesFiles; + /// + ThesFiles getThesaurus(docstring const & lang); + /// add a thesaurus to the list + bool addThesaurus(docstring const & lang); -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()); -} - -} // namespace anon + /// the thesauri + Thesauri thes_; +}; -Thesaurus::Thesaurus() -{} - - -Thesaurus::~Thesaurus() -{ - for (Thesauri::iterator it = thes_.begin(); - it != thes_.end(); ++it) { - delete it->second; - } -} - - -bool Thesaurus::addThesaurus(docstring const & lang) +pair Thesaurus::Private::getThesaurus(docstring const & lang) { string const thes_path = external_path(lyxrc.thesaurusdir_path); LYXERR(Debug::FILES, "thesaurus path: " << thes_path); if (thes_path.empty()) - return false; + return make_pair(string(), string()); if (thesaurusAvailable(lang)) - return true; + return make_pair(string(), string()); FileNameList const idx_files = FileName(thes_path).dirList("idx"); FileNameList const data_files = FileName(thes_path).dirList("dat"); @@ -187,6 +110,16 @@ bool Thesaurus::addThesaurus(docstring const & lang) } } + return make_pair(idx, data); +} + + +bool Thesaurus::Private::addThesaurus(docstring const & lang) +{ + ThesFiles files = getThesaurus(lang); + string const idx = files.first; + string const data = files.second; + if (idx.empty() || data.empty()) return false; @@ -199,14 +132,14 @@ bool Thesaurus::addThesaurus(docstring const & lang) bool Thesaurus::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 d->thesaurusAvailable(lang); +} + - return false; +bool Thesaurus::thesaurusInstalled(docstring const & lang) const +{ + pair files = d->getThesaurus(lang); + return (!files.first.empty() && !files.second.empty()); } @@ -215,11 +148,11 @@ Thesaurus::Meanings Thesaurus::lookup(docstring const & t, docstring const & lan Meanings meanings; MyThes * mythes = 0; - if (!addThesaurus(lang)) + if (!d->addThesaurus(lang)) return meanings; - for (Thesauri::const_iterator it = thes_.begin(); - it != thes_.end(); ++it) { + for (Thesauri::const_iterator it = d->thes_.begin(); + it != d->thes_.end(); ++it) { if (it->first == lang) { mythes = it->second; break; @@ -264,32 +197,17 @@ Thesaurus::Meanings Thesaurus::lookup(docstring const & t, docstring const & lan return meanings; } -#else -#ifndef HAVE_LIBAIKSAURUS -Thesaurus::Thesaurus() -{ -} - -Thesaurus::~Thesaurus() +Thesaurus::Thesaurus() : d(new Thesaurus::Private) { } -Thesaurus::Meanings Thesaurus::lookup(docstring const &, docstring const &) -{ - return Meanings(); -} - - -bool Thesaurus::thesaurusAvailable(docstring const & lang) const +Thesaurus::~Thesaurus() { - return false; + delete d; } -#endif -#endif // HAVE_LIBMYTHES - // Global instance Thesaurus thesaurus;