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