X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FThesaurus.C;h=12f7a029a9af5fedd0bad00061f4dcd2952d896f;hb=9667cb383640866f47aea57f059a9d2a5caefc3d;hp=a166de5ec54fef6e14e888187aed428e936d9300;hpb=7aebbe6e10b3b4cf1f110b98c73a0a27059da6d8;p=lyx.git diff --git a/src/Thesaurus.C b/src/Thesaurus.C index a166de5ec5..12f7a029a9 100644 --- a/src/Thesaurus.C +++ b/src/Thesaurus.C @@ -1,39 +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 + #include "Thesaurus.h" -Thesaurus thesaurus; +#include "support/lstrings.h" + +#include + + +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() @@ -42,45 +36,72 @@ Thesaurus::~Thesaurus() } -std::vector Thesaurus::lookup(string const & text) +Thesaurus::Meanings Thesaurus::lookup(docstring const & t) { - std::vector 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::lookup(string const & /*text*/) + +Thesaurus::Meanings Thesaurus::lookup(docstring const &) { - return std::vector(); + return Meanings(); } #endif // HAVE_LIBAIKSAURUS + +// Global instance +Thesaurus thesaurus; + + +} // namespace lyx