diff options
author | Lindsay Mathieson <lindsay.mathieson@gmail.com> | 2012-09-17 19:52:53 +0200 |
---|---|---|
committer | Andrea Diamantini <adjam7@gmail.com> | 2012-09-17 19:56:40 +0200 |
commit | b2b2692bf2a24ef4a588c0f94cffde0dbe3c94ac (patch) | |
tree | 43deb1c344798373dd2f62de45c36afbef8245ea /src/kspellplugin.cpp | |
parent | SVN_SILENT made messages (.desktop file) (diff) | |
download | rekonq-b2b2692bf2a24ef4a588c0f94cffde0dbe3c94ac.tar.xz |
Integrated spell checking
- inline spell highlighter. This requires WebKit 2.3 to work.
- Addition of a suggested replacement word list to the context menu,
for the word right clicked on
- A standard modeless spell check dialog that works on the current
editable text (or selection).
Heavily cribbed from Dawit's work on kdewebkitpart.
BUG: 305720
CCMAIL: lindsay.mathieson@gmail.com
REVIEW: 106417
REVIEWED-BY: adjam
Diffstat (limited to 'src/kspellplugin.cpp')
-rw-r--r-- | src/kspellplugin.cpp | 197 |
1 files changed, 197 insertions, 0 deletions
diff --git a/src/kspellplugin.cpp b/src/kspellplugin.cpp new file mode 100644 index 00000000..d25ddf9f --- /dev/null +++ b/src/kspellplugin.cpp @@ -0,0 +1,197 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2012 by Lindsay Mathieson <lindsay dot mathieson at gmail dot com> +* +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License as +* published by the Free Software Foundation; either version 2 of +* the License or (at your option) version 3 or any later version +* accepted by the membership of KDE e.V. (or its successor approved +* by the membership of KDE e.V.), which shall act as a proxy +* defined in Section 14 of version 3 of the license. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +* +* ============================================================ */ + + +#include <stdio.h> +#include <KDebug> +#include "kspellplugin.h" +#include <QTextBoundaryFinder> + +#include "rekonq.h" + +#define methodDebug() kDebug("KWebSpellChecker: %s", __FUNCTION__) + +///////////////////////////// +// KWebSpellChecker + + +KWebSpellChecker::KWebSpellChecker() +{ + m_speller = new Sonnet::Speller(); + kDebug() << "!!! Client = " << m_speller->defaultClient() << endl; + kDebug() << "!!! Language = " << m_speller->defaultLanguage() << endl; +} + +KWebSpellChecker::~KWebSpellChecker() +{ + delete m_speller; +} + +bool KWebSpellChecker::isContinousSpellCheckingEnabled() const +{ + return ReKonfig::automaticSpellChecking(); +} + +void KWebSpellChecker::toggleContinousSpellChecking() +{ + ReKonfig::setAutomaticSpellChecking(! ReKonfig::automaticSpellChecking()); +} + +void KWebSpellChecker::learnWord(const QString& word) +{ + Q_UNUSED(word); +} + +void KWebSpellChecker::ignoreWordInSpellDocument(const QString& word) +{ + Q_UNUSED(word); +} + +static bool isValidWord(const QString &str) +{ + if (str.isEmpty() || (str.length() == 1 && !str[0].isLetter())) + { + return false; + } + const int length = str.length(); + for (int i = 0; i < length; ++i) + { + if (!str[i].isNumber()) + { + return true; + } + } + // 'str' only contains numbers + return false; +} + +void KWebSpellChecker::checkSpellingOfString(const QString& word, int* misspellingLocation, int* misspellingLength) +{ + // sanity check + if (misspellingLocation == NULL || misspellingLength == NULL) + return; + + *misspellingLocation = -1; + *misspellingLength = 0; + + kDebug() << word << endl; + + QTextBoundaryFinder finder = QTextBoundaryFinder(QTextBoundaryFinder::Word, word); + + QTextBoundaryFinder::BoundaryReasons boundary = finder.boundaryReasons(); + int start = finder.position(), end = finder.position(); + bool inWord = (boundary & QTextBoundaryFinder::StartWord) != 0; + while (finder.toNextBoundary() > 0) + { + boundary = finder.boundaryReasons(); + if ((boundary & QTextBoundaryFinder::EndWord) && inWord) + { + end = finder.position(); + QString str = finder.string().mid(start, end - start); + if (isValidWord(str)) + { +#if 1 + qDebug() << "Word at " << start << " word = '" + << str << "', len = " << str.length(); +#endif + if (m_speller->isMisspelled(str)) + { + *misspellingLocation = start; + *misspellingLength = end - start; + } + return; + } + inWord = false; + } + if ((boundary & QTextBoundaryFinder::StartWord)) + { + start = finder.position(); + inWord = true; + } + } +} + +QString KWebSpellChecker::autoCorrectSuggestionForMisspelledWord(const QString& word) +{ + /* + QStringList words = m_speller->suggest(word); + if (words.size() > 0) + return words[0]; + else + return QString(""); + */ + + + return QString(""); +} + +void KWebSpellChecker::guessesForWord(const QString& word, const QString& context, QStringList& guesses) +{ + Q_UNUSED(context); + + QStringList words = m_speller->suggest(word); + guesses = words; +} + +bool KWebSpellChecker::isGrammarCheckingEnabled() +{ + return false; +} + +void KWebSpellChecker::toggleGrammarChecking() +{ +} + +void KWebSpellChecker::checkGrammarOfString(const QString&, QList<GrammarDetail>&, int* badGrammarLocation, int* badGrammarLength) +{ + Q_UNUSED(badGrammarLocation); + Q_UNUSED(badGrammarLength); +} + + +//////////////////////////////////////////// +// KWebKitPlatformPlugin +KWebKitPlatformPlugin::KWebKitPlatformPlugin() +{ +} + +KWebKitPlatformPlugin::~KWebKitPlatformPlugin() +{ +} + + +bool KWebKitPlatformPlugin::supportsExtension(Extension ext) const +{ + return ext == SpellChecker; +} + +QObject* KWebKitPlatformPlugin::createExtension(Extension) const +{ + return new KWebSpellChecker(); +} + +Q_EXPORT_PLUGIN2(kwebspellchecker, KWebKitPlatformPlugin); +Q_IMPORT_PLUGIN(kwebspellchecker) + |