- pos_type snext = first;
- if (SpellChecker::misspelled(result)) {
- SpellChecker * speller = theSpellChecker();
- // locate and enumerate the error positions
- int nerrors = speller->numMisspelledWords();
- int numbreaks = 0;
- PositionsIterator it = softbreaks.begin();
- PositionsIterator et = softbreaks.end();
- for (int index = 0; index < nerrors; ++index) {
- int wstart;
- int wlen = 0;
- speller->misspelledWord(index, wstart, wlen);
- if (wlen) {
- docstring const misspelled = word.substr(wstart, wlen);
- wstart += first + numbreaks;
- if (snext < wstart) {
- while (it != et && *it < wstart) {
- ++wstart;
- ++numbreaks;
- ++it;
- }
- setMisspelled(snext,
- wstart - 1, SpellChecker::WORD_OK);
- }
- snext = wstart + wlen;
- while (it != et && *it < snext) {
- ++snext;
- ++numbreaks;
- ++it;
- }
- setMisspelled(wstart, snext, result);
- LYXERR(Debug::GUI, "misspelled word: \"" <<
- misspelled << "\" [" <<
- wstart << ".." << (snext-1) << "]");
- ++snext;
- }
- }
+ if (!SpellChecker::misspelled(result)) {
+ setMisspelled(first, last, SpellChecker::WORD_OK);
+ return;
+ }
+ int snext = first;
+ SpellChecker * speller = theSpellChecker();
+ // locate and enumerate the error positions
+ int nerrors = speller->numMisspelledWords();
+ int numskipped = 0;
+ SkipPositionsIterator it = skips.begin();
+ SkipPositionsIterator et = skips.end();
+ for (int index = 0; index < nerrors; ++index) {
+ int wstart;
+ int wlen = 0;
+ speller->misspelledWord(index, wstart, wlen);
+ /// should not happen if speller supports range checks
+ if (!wlen) continue;
+ docstring const misspelled = word.substr(wstart, wlen);
+ wstart += first + numskipped;
+ if (snext < wstart) {
+ /// mark the range of correct spelling
+ numskipped += countSkips(it, et, wstart);
+ setMisspelled(snext,
+ wstart - 1, SpellChecker::WORD_OK);
+ }
+ snext = wstart + wlen;
+ numskipped += countSkips(it, et, snext);
+ /// mark the range of misspelling
+ setMisspelled(wstart, snext, result);
+ LYXERR(Debug::GUI, "misspelled word: \"" <<
+ misspelled << "\" [" <<
+ wstart << ".." << (snext-1) << "]");
+ ++snext;