]> git.lyx.org Git - lyx.git/blobdiff - src/Thesaurus.C
get rid of MSVC warning (signed/unsigned comparison)
[lyx.git] / src / Thesaurus.C
index 8e30bf9da7d6b267b4426f820a6d641e0058bc8d..12f7a029a9af5fedd0bad00061f4dcd2952d896f 100644 (file)
@@ -1,33 +1,33 @@
 /**
  * \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()
@@ -36,45 +36,72 @@ 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;
-       string ret;
+       int prev_meaning = -1;
+       int cur_meaning;
+       docstring meaning;
+
+       // correct, returns "" at the end
+       string ret = aik_->next(cur_meaning);
 
-       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