/**
* \file Thesaurus.C
- * Copyright 2001 the LyX Team
- * Read the file COPYING
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
*
* \author John Levon
+ *
+ * Full author contact details are available in file CREDITS.
*/
+#include <config.h>
+
#include "Thesaurus.h"
-Thesaurus thesaurus;
+#include "support/lstrings.h"
+
+#include <algorithm>
+
+
+namespace lyx {
#ifdef HAVE_LIBAIKSAURUS
-
-Thesaurus::ThesaurusEntry::ThesaurusEntry(string const & ent, char part)
- : entry(ent), pos(Thesaurus::NONE)
-{
- if (part & AikSaurus::Unknown)
- pos |= OTHER;
- if (part & AikSaurus::Other)
- pos |= OTHER;
- if (part & AikSaurus::Noun)
- pos |= NOUN;
- if (part & AikSaurus::Verb)
- pos |= VERB;
- if (part & AikSaurus::Adjective)
- pos |= ADJECTIVE;
- if (part & AikSaurus::Adverb)
- pos |= ADVERB;
-}
+
+using std::sort;
+using std::string;
Thesaurus::Thesaurus()
-{
- aik_ = new AikSaurus;
-}
+ : aik_(new Aiksaurus)
+{}
Thesaurus::~Thesaurus()
}
-std::vector<Thesaurus::ThesaurusEntry> Thesaurus::lookup(string const & text)
+Thesaurus::Meanings Thesaurus::lookup(docstring const & t)
{
- std::vector<ThesaurusEntry> entries;
+ 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 (!aik_->find(text.c_str()))
- return entries;
+ return meanings;
+
+ // weird api, but ...
- char pos;
+ int prev_meaning = -1;
+ int cur_meaning;
+ docstring meaning;
+
+ // correct, returns "" at the end
+ string ret = aik_->next(cur_meaning);
- string ret = aik_->next(pos);
while (!ret.empty()) {
- entries.push_back(ThesaurusEntry(ret, pos));
- ret = aik_->next(pos);
+ if (cur_meaning != prev_meaning) {
+ meaning = from_ascii(ret);
+ ret = aik_->next(cur_meaning);
+ prev_meaning = cur_meaning;
+ } else {
+ if (ret != text)
+ meanings[meaning].push_back(from_ascii(ret));
+ }
+
+ ret = aik_->next(cur_meaning);
}
- return entries;
+ for (Meanings::iterator it = meanings.begin();
+ it != meanings.end(); ++it)
+ sort(it->second.begin(), it->second.end());
+
+ return meanings;
}
#else
-Thesaurus::ThesaurusEntry::ThesaurusEntry(string const &, char)
-{
-}
-
-
Thesaurus::Thesaurus()
{
}
-
-
+
+
Thesaurus::~Thesaurus()
{
}
-
-std::vector<Thesaurus::ThesaurusEntry>
-Thesaurus::lookup(string const & /*text*/)
+
+Thesaurus::Meanings Thesaurus::lookup(docstring const &)
{
- return std::vector<ThesaurusEntry>();
+ return Meanings();
}
#endif // HAVE_LIBAIKSAURUS
+
+// Global instance
+Thesaurus thesaurus;
+
+
+} // namespace lyx