* Licence details can be found in the file COPYING.
*
* \author John Levon
- * \author Jürgen Spitzmüller
*
* Full author contact details are available in file CREDITS.
*/
#include "Thesaurus.h"
-#include "debug.h"
+#include "gettext.h"
+
#include "support/lstrings.h"
-#include "support/unicode.h"
+
+#include "frontends/alert.h"
#include <algorithm>
namespace lyx {
+#ifdef HAVE_LIBAIKSAURUS
+using support::bformat;
+
using std::sort;
using std::string;
-using std::endl;
-#ifndef HAVE_LIBMYTHES
-#ifdef HAVE_LIBAIKSAURUS
Thesaurus::Thesaurus()
- : thes_(new Aiksaurus)
+ : aik_(new Aiksaurus)
{}
Thesaurus::~Thesaurus()
{
- delete thes_;
+ delete aik_;
}
return meanings;
string const text = to_ascii(t);
- if (!thes_->find(text.c_str()))
+
+ docstring error = from_ascii(aik_->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 (!aik_->find(text.c_str()))
return meanings;
// weird api, but ...
docstring meaning;
// correct, returns "" at the end
- string ret = thes_->next(cur_meaning);
+ string ret = aik_->next(cur_meaning);
while (!ret.empty()) {
if (cur_meaning != prev_meaning) {
meaning = from_ascii(ret);
- ret = thes_->next(cur_meaning);
+ ret = aik_->next(cur_meaning);
prev_meaning = cur_meaning;
} else {
if (ret != text)
meanings[meaning].push_back(from_ascii(ret));
}
- ret = thes_->next(cur_meaning);
+ ret = aik_->next(cur_meaning);
}
for (Meanings::iterator it = meanings.begin();
return meanings;
}
-#endif // HAVE_LIBAIKSAURUS
-#endif // !HAVE_LIBMYTHES
-
-
-#ifdef HAVE_LIBMYTHES
-
-namespace {
-
-string const to_iconv_encoding(docstring const & s, string const & encoding)
-{
- std::vector<char> 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<char_type> const ucs4 =
- eightbit_to_ucs4(s.data(), s.length(), encoding);
- return docstring(ucs4.begin(), ucs4.end());
-}
-
-} // namespace anon
-
-
-Thesaurus::Thesaurus()
-{
- 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");
- char const * af = idx.c_str();
- char const * df = data.c_str();
- thes_ = new MyThes(af, df);
-}
-
-
-Thesaurus::~Thesaurus()
-{
- if (thes_)
- delete thes_;
-}
-
-
-Thesaurus::Meanings Thesaurus::lookup(docstring const & t)
-{
- Meanings meanings;
-
- string const encoding = thes_->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);
- if (!count)
- return meanings;
-
- // don't change value of pmean or count
- // they are needed for the CleanUpAfterLookup routine
- mentry * pm = pmean;
- docstring meaning;
- docstring ret;
- for (int i = 0; i < count; i++) {
- 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);
- }
- meanings[meaning].push_back(ret);
- pm++;
- }
- // now clean up all allocated memory
- thes_->CleanUpAfterLookup(&pmean, count);
-
- for (Meanings::iterator it = meanings.begin();
- it != meanings.end(); ++it)
- sort(it->second.begin(), it->second.end());
-
- return meanings;
-}
-
#else
Thesaurus::Thesaurus()
return Meanings();
}
-#endif // HAVE_LIBMYTHES
+#endif // HAVE_LIBAIKSAURUS
// Global instance
Thesaurus thesaurus;