X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FThesaurus.cpp;h=a0f15150f4f33ec11b976ef356fec140e82bd444;hb=e45427de389bc188f02ebe0de2c052740dcde09c;hp=6bc082342595573045e8d24ffe32a26396b6b3ed;hpb=8f1b42984d7ce142074db6ac5d348b811c58c970;p=lyx.git diff --git a/src/Thesaurus.cpp b/src/Thesaurus.cpp index 6bc0823425..a0f15150f4 100644 --- a/src/Thesaurus.cpp +++ b/src/Thesaurus.cpp @@ -13,25 +13,18 @@ #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 "frontends/alert.h" +#include "support/mythes/mythes.hxx" -#ifdef HAVE_LIBMYTHES -#include MYTHES_H_LOCATION -#else -#ifdef HAVE_LIBAIKSAURUS -#include AIKSAURUS_H_LOCATION -#endif // HAVE_LIBAIKSAURUS -#endif // !HAVE_LIBMYTHES +#include "frontends/alert.h" #include #include @@ -42,98 +35,8 @@ using namespace lyx::support::os; namespace lyx { -#ifdef HAVE_LIBAIKSAURUS - -struct Thesaurus::Private -{ - Private(): thes_(new Aiksaurus) {} - Aiksaurus * thes_; -}; - -Thesaurus::Meanings Thesaurus::lookup(docstring const & t, docstring const &) -{ - 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(d->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; - } - return meanings; - } - if (!d->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 = d->thes_->next(cur_meaning); - - while (!ret.empty()) { - if (cur_meaning != prev_meaning) { - meaning = from_ascii(ret); - ret = d->thes_->next(cur_meaning); - prev_meaning = cur_meaning; - } else { - if (ret != text) - meanings[meaning].push_back(from_ascii(ret)); - } - - ret = d->thes_->next(cur_meaning); - } - - 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_")); -} - -#else // HAVE_LIBAIKSAURUS -#ifdef HAVE_LIBMYTHES - 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 @@ -160,6 +63,10 @@ struct Thesaurus::Private return false; } + /// + typedef std::pair ThesFiles; + /// + ThesFiles getThesaurus(docstring const & lang); /// add a thesaurus to the list bool addThesaurus(docstring const & lang); @@ -167,15 +74,16 @@ struct Thesaurus::Private Thesauri thes_; }; -bool Thesaurus::Private::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"); @@ -202,6 +110,16 @@ bool Thesaurus::Private::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; @@ -218,6 +136,13 @@ bool Thesaurus::thesaurusAvailable(docstring const & lang) const } +bool Thesaurus::thesaurusInstalled(docstring const & lang) const +{ + pair files = d->getThesaurus(lang); + return (!files.first.empty() && !files.second.empty()); +} + + Thesaurus::Meanings Thesaurus::lookup(docstring const & t, docstring const & lang) { Meanings meanings; @@ -272,26 +197,6 @@ Thesaurus::Meanings Thesaurus::lookup(docstring const & t, docstring const & lan return meanings; } -#else - -struct Thesaurus::Private -{ -}; - - -Thesaurus::Meanings Thesaurus::lookup(docstring const &, docstring const &) -{ - return Meanings(); -} - - -bool Thesaurus::thesaurusAvailable(docstring const &) const -{ - return false; -} - -#endif // HAVE_LIBMYTHES -#endif // HAVE_LIBAIKSAURUS Thesaurus::Thesaurus() : d(new Thesaurus::Private) {