void Highlighter::highlightBlock(const QString &text) { if (text.isEmpty() || !d->active || !d->spellCheckerFound) { return; } if (!d->connected) { connect(document(), SIGNAL(contentsChange(int,int,int)), SLOT(contentsChange(int,int,int))); d->connected = true; } QTextCursor cursor; if (d->textEdit) { cursor = d->textEdit->textCursor(); } else { cursor = d->plainTextEdit->textCursor(); } int index = cursor.position(); const int lengthPosition = text.length() - 1; if ( index != lengthPosition || ( lengthPosition > 0 && !text[lengthPosition-1].isLetter() ) ) { LanguageCache* cache=dynamic_cast<LanguageCache*>(currentBlockUserData()); if (!cache) { cache = new LanguageCache; setCurrentBlockUserData(cache); } QStringRef sentence=&text; d->tokenizer->setBuffer(sentence.toString()); int offset=sentence.position(); while (d->tokenizer->hasNext()) { QStringRef word=d->tokenizer->next(); if (!d->tokenizer->isSpellcheckable()) continue; ++d->wordCount; if (d->spellchecker->isMisspelled(word.toString())) { ++d->errorCount; setMisspelled(word.position()+offset, word.length()); } else { unsetMisspelled(word.position()+offset, word.length()); } } } //QTimer::singleShot( 0, this, SLOT(checkWords()) ); setCurrentBlockState(0); }
void Highlighter::highlightBlock(const QString &text) { if (text.isEmpty() || !d->active || !d->spellCheckerFound) { return; } if (!d->connected) { connect(document(), SIGNAL(contentsChange(int,int,int)), SLOT(contentsChange(int,int,int))); d->connected = true; } QTextCursor cursor; if (d->textEdit) { cursor = d->textEdit->textCursor(); } else { cursor = d->plainTextEdit->textCursor(); } int index = cursor.position(); const int lengthPosition = text.length() - 1; if ( index != lengthPosition || ( lengthPosition > 0 && !text[lengthPosition-1].isLetter() ) ) { d->languageFilter->setBuffer(text); LanguageCache* cache=dynamic_cast<LanguageCache*>(currentBlockUserData()); if (!cache) { cache = new LanguageCache; setCurrentBlockUserData(cache); } while (d->languageFilter->hasNext()) { QStringRef sentence=d->languageFilter->next(); if (d->spellchecker->testAttribute(Speller::AutoDetectLanguage)) { QString lang; QPair<int,int> spos=QPair<int,int>(sentence.position(),sentence.length()); // try cache first if (cache->languages.contains(spos)) { lang=cache->languages.value(spos); } else { lang=d->languageFilter->language(); if (!d->languageFilter->isSpellcheckable()) lang.clear(); cache->languages[spos]=lang; } if (lang.isEmpty()) continue; d->spellchecker->setLanguage(lang); } d->tokenizer->setBuffer(sentence.toString()); int offset=sentence.position(); while (d->tokenizer->hasNext()) { QStringRef word=d->tokenizer->next(); if (!d->tokenizer->isSpellcheckable()) continue; ++d->wordCount; if (d->spellchecker->isMisspelled(word.toString())) { ++d->errorCount; setMisspelled(word.position()+offset, word.length()); } else { unsetMisspelled(word.position()+offset, word.length()); } } } } //QTimer::singleShot( 0, this, SLOT(checkWords()) ); setCurrentBlockState(0); }