X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FParagraph.cpp;h=d96ddaeefea3d282cfab127f0add726f1b00e116;hb=8693ae474be667e88dba1e53a5a1130ff440e756;hp=b03766406453e2cd8af57e8df4f36465c2923638;hpb=f94e6274a99855ee39fc88de39c4ccb65440d8a7;p=lyx.git diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp index b037664064..d96ddaeefe 100644 --- a/src/Paragraph.cpp +++ b/src/Paragraph.cpp @@ -153,6 +153,12 @@ public: needsRefresh(pos); } + void refreshLast(pos_type pos) + { + if (pos < refresh_.last) + refresh_.last = pos; + } + SpellChecker::Result getState(pos_type pos) const { SpellChecker::Result result = SpellChecker::WORD_OK; @@ -333,14 +339,16 @@ public: /// match a string against a particular point in the paragraph bool isTextAt(string const & str, pos_type pos) const; - /// a vector of inset positions - typedef vector Positions; - typedef Positions::const_iterator PositionsIterator; + /// a vector of speller skip positions + typedef vector SkipPositions; + typedef SkipPositions::const_iterator SkipPositionsIterator; + void appendSkipPosition(SkipPositions & skips, pos_type const pos) const; + Language * getSpellLanguage(pos_type const from) const; Language * locateSpellRange(pos_type & from, pos_type & to, - Positions & softbreaks) const; + SkipPositions & skips) const; bool hasSpellerChange() const { SpellChecker::ChangeNumber speller_change_number = 0; @@ -391,22 +399,23 @@ public: last = endpos; } - int countSoftbreaks(PositionsIterator & it, PositionsIterator const et, + int countSkips(SkipPositionsIterator & it, SkipPositionsIterator const et, int & start) const { - int numbreaks = 0; - while (it != et && *it < start) { - ++start; - ++numbreaks; + int numskips = 0; + while (it != et && it->first < start) { + int skip = it->last - it->first + 1; + start += skip; + numskips += skip; ++it; } - return numbreaks; + return numskips; } void markMisspelledWords(pos_type const & first, pos_type const & last, SpellChecker::Result result, docstring const & word, - Positions const & softbreaks); + SkipPositions const & skips); InsetCode ownerCode() const { @@ -748,6 +757,8 @@ bool Paragraph::eraseChar(pos_type pos, bool trackChanges) if (!change.changed() || (change.inserted() && !change.currentAuthor())) { setChange(pos, Change(Change::DELETED)); + // request run of spell checker + requestSpellCheck(pos); return false; } @@ -779,6 +790,7 @@ bool Paragraph::eraseChar(pos_type pos, bool trackChanges) // Update list of misspelled positions d->speller_state_.decreasePosAfterPos(pos); + d->speller_state_.refreshLast(size()); return true; } @@ -2713,13 +2725,9 @@ docstring Paragraph::simpleLyXHTMLOnePar(Buffer const & buf, Inset const * inset = getInset(i); if (inset) { - InsetCommand const * ic = inset->asInsetCommand(); - InsetLayout const & il = inset->getLayout(); - InsetMath const * im = inset->asInsetMath(); - if (!runparams.for_toc - || im || il.isInToc() || (ic && ic->isInToc())) { + if (!runparams.for_toc || inset->isInToc()) { OutputParams np = runparams; - if (!il.htmlisblock()) + if (!inset->getLayout().htmlisblock()) np.html_in_par = true; retval += inset->xhtml(xs, np); } @@ -2891,6 +2899,8 @@ docstring Paragraph::asString(pos_type beg, pos_type end, int options) const os << d->params_.labelString() << ' '; for (pos_type i = beg; i < end; ++i) { + if ((options & AS_STR_SKIPDELETE) && isDeleted(i)) + continue; char_type const c = d->text_[i]; if (isPrintable(c) || c == '\t' || (c == '\n' && (options & AS_STR_NEWLINES))) @@ -3410,9 +3420,24 @@ void Paragraph::updateWords() } +void Paragraph::Private::appendSkipPosition(SkipPositions & skips, pos_type const pos) const +{ + SkipPositionsIterator begin = skips.begin(); + SkipPositions::iterator end = skips.end(); + if (pos > 0 && begin < end) { + --end; + if (end->last == pos - 1) { + end->last = pos; + return; + } + } + skips.insert(end, FontSpan(pos, pos)); +} + + Language * Paragraph::Private::locateSpellRange( pos_type & from, pos_type & to, - Positions & softbreaks) const + SkipPositions & skips) const { // skip leading white space while (from < to && owner_->isWordSeparator(from)) @@ -3429,7 +3454,9 @@ Language * Paragraph::Private::locateSpellRange( // hop to end of word while (last < to && !owner_->isWordSeparator(last)) { if (owner_->getInset(last)) { - softbreaks.insert(softbreaks.end(), last); + appendSkipPosition(skips, last); + } else if (owner_->isDeleted(last)) { + appendSkipPosition(skips, last); } ++last; } @@ -3437,6 +3464,9 @@ Language * Paragraph::Private::locateSpellRange( while (sameinset && last < to && owner_->isWordSeparator(last)) { if (Inset const * inset = owner_->getInset(last)) sameinset = inset->isChar() && inset->isLetter(); + if (sameinset && owner_->isDeleted(last)) { + appendSkipPosition(skips, last); + } if (sameinset) last++; } @@ -3504,7 +3534,7 @@ SpellChecker::Result Paragraph::spellCheck(pos_type & from, pos_type & to, if (from == to || from >= size()) return result; - docstring word = asString(from, to, AS_STR_INSETS); + docstring word = asString(from, to, AS_STR_INSETS + AS_STR_SKIPDELETE); Language * lang = d->getSpellLanguage(from); wl = WordLangTuple(word, lang); @@ -3552,7 +3582,7 @@ void Paragraph::Private::markMisspelledWords( pos_type const & first, pos_type const & last, SpellChecker::Result result, docstring const & word, - Positions const & softbreaks) + SkipPositions const & skips) { if (!SpellChecker::misspelled(result)) { setMisspelled(first, last, SpellChecker::WORD_OK); @@ -3562,9 +3592,9 @@ void Paragraph::Private::markMisspelledWords( SpellChecker * speller = theSpellChecker(); // locate and enumerate the error positions int nerrors = speller->numMisspelledWords(); - int numbreaks = 0; - PositionsIterator it = softbreaks.begin(); - PositionsIterator et = softbreaks.end(); + int numskipped = 0; + SkipPositionsIterator it = skips.begin(); + SkipPositionsIterator et = skips.end(); for (int index = 0; index < nerrors; ++index) { int wstart; int wlen = 0; @@ -3572,15 +3602,15 @@ void Paragraph::Private::markMisspelledWords( /// should not happen if speller supports range checks if (!wlen) continue; docstring const misspelled = word.substr(wstart, wlen); - wstart += first + numbreaks; + wstart += first + numskipped; if (snext < wstart) { /// mark the range of correct spelling - numbreaks += countSoftbreaks(it, et, wstart); + numskipped += countSkips(it, et, wstart); setMisspelled(snext, wstart - 1, SpellChecker::WORD_OK); } snext = wstart + wlen; - numbreaks += countSoftbreaks(it, et, snext); + numskipped += countSkips(it, et, snext); /// mark the range of misspelling setMisspelled(wstart, snext, result); LYXERR(Debug::GUI, "misspelled word: \"" << @@ -3607,16 +3637,16 @@ void Paragraph::spellCheck() const // loop until we leave the range for (pos_type first = start; first < endpos; ) { pos_type last = endpos; - Private::Positions softbreaks; - Language * lang = d->locateSpellRange(first, last, softbreaks); + Private::SkipPositions skips; + Language * lang = d->locateSpellRange(first, last, skips); if (first >= endpos) break; // start the spell checker on the unit of meaning - docstring word = asString(first, last, AS_STR_INSETS); + docstring word = asString(first, last, AS_STR_INSETS + AS_STR_SKIPDELETE); WordLangTuple wl = WordLangTuple(word, lang); SpellChecker::Result result = word.size() ? speller->check(wl) : SpellChecker::WORD_OK; - d->markMisspelledWords(first, last, result, word, softbreaks); + d->markMisspelledWords(first, last, result, word, skips); first = ++last; } } else {