File indexing completed on 2024-04-21 04:00:55

0001 /*
0002  * SPDX-FileCopyrightText: 2007 Zack Rusin <zack@kde.org>
0003  *
0004  * SPDX-License-Identifier: LGPL-2.1-or-later
0005  */
0006 #include "speller.h"
0007 
0008 #include "loader_p.h"
0009 #include "settingsimpl_p.h"
0010 #include "spellerplugin_p.h"
0011 
0012 #include "core_debug.h"
0013 
0014 #include <QCache>
0015 
0016 namespace Sonnet
0017 {
0018 class SpellerPrivate
0019 {
0020 public:
0021     SpellerPrivate()
0022     {
0023     }
0024 
0025     ~SpellerPrivate()
0026     {
0027     }
0028 
0029     void init(const QString &lang)
0030     {
0031         Loader *loader = Loader::openLoader();
0032         settings = loader->settings();
0033 
0034         language = lang;
0035         updateDict();
0036     }
0037 
0038     void updateDict()
0039     {
0040         dict = Loader::openLoader()->cachedSpeller(language);
0041     }
0042 
0043     bool isValid()
0044     {
0045         if (settings->modified()) {
0046             recreateDict();
0047             settings->setModified(false);
0048         }
0049         return !dict.isNull();
0050     }
0051 
0052     void recreateDict()
0053     {
0054         Loader::openLoader()->clearSpellerCache();
0055         updateDict();
0056     }
0057 
0058     QSharedPointer<SpellerPlugin> dict;
0059     SettingsImpl *settings = nullptr;
0060     QString language;
0061 };
0062 
0063 Speller::Speller(const QString &lang)
0064     : d(new SpellerPrivate)
0065 {
0066     d->init(lang);
0067 }
0068 
0069 Speller::~Speller()
0070 {
0071     qCDebug(SONNET_LOG_CORE) << "deleting" << this << "for" << d->language;
0072 }
0073 
0074 Speller::Speller(const Speller &speller)
0075     : d(new SpellerPrivate)
0076 {
0077     d->language = speller.language();
0078     d->init(d->language);
0079 }
0080 
0081 Speller &Speller::operator=(const Speller &speller)
0082 {
0083     d->language = speller.language();
0084     d->updateDict();
0085     return *this;
0086 }
0087 
0088 bool Speller::isCorrect(const QString &word) const
0089 {
0090     if (!d->isValid()) {
0091         return true;
0092     }
0093     return d->dict->isCorrect(word);
0094 }
0095 
0096 bool Speller::isMisspelled(const QString &word) const
0097 {
0098     if (!d->isValid()) {
0099         return false;
0100     }
0101     return d->dict->isMisspelled(word);
0102 }
0103 
0104 QStringList Speller::suggest(const QString &word) const
0105 {
0106     if (!d->isValid()) {
0107         return QStringList();
0108     }
0109     return d->dict->suggest(word);
0110 }
0111 
0112 bool Speller::checkAndSuggest(const QString &word, QStringList &suggestions) const
0113 {
0114     if (!d->isValid()) {
0115         return true;
0116     }
0117     return d->dict->checkAndSuggest(word, suggestions);
0118 }
0119 
0120 bool Speller::storeReplacement(const QString &bad, const QString &good)
0121 {
0122     if (!d->isValid()) {
0123         return false;
0124     }
0125     return d->dict->storeReplacement(bad, good);
0126 }
0127 
0128 bool Speller::addToPersonal(const QString &word)
0129 {
0130     if (!d->isValid()) {
0131         return false;
0132     }
0133     return d->dict->addToPersonal(word);
0134 }
0135 
0136 bool Speller::addToSession(const QString &word)
0137 {
0138     if (!d->isValid()) {
0139         return false;
0140     }
0141     return d->dict->addToSession(word);
0142 }
0143 
0144 QString Speller::language() const
0145 {
0146     if (!d->isValid()) {
0147         return QString();
0148     }
0149     return d->dict->language();
0150 }
0151 
0152 void Speller::save()
0153 {
0154     if (d->settings) {
0155         d->settings->save();
0156     }
0157 }
0158 
0159 void Speller::restore()
0160 {
0161     if (d->settings) {
0162         d->settings->restore();
0163         d->recreateDict();
0164     }
0165 }
0166 
0167 QStringList Speller::availableBackends() const
0168 {
0169     Loader *l = Loader::openLoader();
0170     return l->clients();
0171 }
0172 
0173 QStringList Speller::availableLanguages() const
0174 {
0175     Loader *l = Loader::openLoader();
0176     return l->languages();
0177 }
0178 
0179 QStringList Speller::availableLanguageNames() const
0180 {
0181     Loader *l = Loader::openLoader();
0182     return l->languageNames();
0183 }
0184 
0185 void Speller::setDefaultLanguage(const QString &lang)
0186 {
0187     if (d->settings->setDefaultLanguage(lang)) {
0188         d->settings->save();
0189     }
0190 }
0191 
0192 QString Speller::defaultLanguage() const
0193 {
0194     return d->settings->defaultLanguage();
0195 }
0196 
0197 void Speller::setDefaultClient(const QString &client)
0198 {
0199     if (d->settings->setDefaultClient(client)) {
0200         d->settings->save();
0201     }
0202 }
0203 
0204 QString Speller::defaultClient() const
0205 {
0206     return d->settings->defaultClient();
0207 }
0208 
0209 void Speller::setAttribute(Attribute attr, bool b)
0210 {
0211     switch (attr) {
0212     case CheckUppercase:
0213         d->settings->setCheckUppercase(b);
0214         break;
0215     case SkipRunTogether:
0216         d->settings->setSkipRunTogether(b);
0217         break;
0218     case AutoDetectLanguage:
0219         d->settings->setAutodetectLanguage(b);
0220         break;
0221     }
0222     d->settings->save();
0223 }
0224 
0225 bool Speller::testAttribute(Attribute attr) const
0226 {
0227     switch (attr) {
0228     case CheckUppercase:
0229         return d->settings->checkUppercase();
0230     case SkipRunTogether:
0231         return d->settings->skipRunTogether();
0232     case AutoDetectLanguage:
0233         return d->settings->autodetectLanguage();
0234     }
0235     return false;
0236 }
0237 
0238 bool Speller::isValid() const
0239 {
0240     return !d->dict.isNull();
0241 }
0242 
0243 void Speller::setLanguage(const QString &lang)
0244 {
0245     d->language = lang;
0246     d->updateDict();
0247 }
0248 
0249 QMap<QString, QString> Sonnet::Speller::availableDictionaries() const
0250 {
0251     Loader *l = Loader::openLoader();
0252     const QStringList lst = l->languages();
0253     QMap<QString, QString> langs;
0254 
0255     for (const QString &tag : lst) {
0256         langs.insert(l->languageNameForCode(tag), tag);
0257     }
0258 
0259     return langs;
0260 }
0261 
0262 QMap<QString, QString> Speller::preferredDictionaries() const
0263 {
0264     Loader *l = Loader::openLoader();
0265     QMap<QString, QString> langs;
0266 
0267     for (const QString &tag : l->settings()->preferredLanguages()) {
0268         langs.insert(l->languageNameForCode(tag), tag);
0269     }
0270 
0271     return langs;
0272 }
0273 
0274 } // namespace Sonnet