]> git.lyx.org Git - lyx.git/blobdiff - src/Paragraph.cpp
Fix bug #7212: Paragraph::forToc has to include the labelString.
[lyx.git] / src / Paragraph.cpp
index ed22830e5a9f994f1e200ddfdb812dd6ac39c70a..67965ef4c5950da18f47d9143db248161b87d68b 100644 (file)
@@ -72,7 +72,7 @@ namespace lyx {
 namespace {
 /// Inset identifier (above 0x10ffff, for ucs-4)
 char_type const META_INSET = 0x200001;
-};
+}
 
 
 /////////////////////////////////////////////////////////////////////
@@ -173,6 +173,20 @@ public:
                return result;
        }
 
+       FontSpan const & getRange(pos_type pos) const
+       {
+               /// empty span to indicate mismatch
+               static FontSpan empty_;
+               RangesIterator et = ranges_.end();
+               RangesIterator it = ranges_.begin();
+               for (; it != et; ++it) {
+                       if(it->inside(pos)) {
+                               return it->range();
+                       }
+               }
+               return empty_;
+       }
+
        bool needsRefresh() const {
                return needs_refresh_;
        }
@@ -2825,6 +2839,13 @@ bool Paragraph::isWordSeparator(pos_type pos) const
 }
 
 
+bool Paragraph::isSameSpellRange(pos_type pos1, pos_type pos2) const
+{
+       return pos1 == pos2
+               || d->speller_state_.getRange(pos1) == d->speller_state_.getRange(pos2);
+}
+
+
 bool Paragraph::isChar(pos_type pos) const
 {
        if (Inset const * inset = getInset(pos))
@@ -2928,7 +2949,7 @@ docstring Paragraph::asString(pos_type beg, pos_type end, int options) const
                    || (c == '\n' && (options & AS_STR_NEWLINES)))
                        os.put(c);
                else if (c == META_INSET && (options & AS_STR_INSETS)) {
-                       getInset(i)->tocString(os);
+                       getInset(i)->toString(os);
                        if (getInset(i)->asInsetMath())
                                os << " ";
                }
@@ -2938,6 +2959,24 @@ docstring Paragraph::asString(pos_type beg, pos_type end, int options) const
 }
 
 
+void Paragraph::forToc(docstring & os, size_t maxlen) const
+{
+       if (!d->params_.labelString().empty())
+               os += d->params_.labelString() + ' ';
+       for (pos_type i = 0; i < size() && os.length() < maxlen; ++i) {
+               if (isDeleted(i))
+                       continue;
+               char_type const c = d->text_[i];
+               if (isPrintable(c))
+                       os += c;
+               else if (c == '\t' || c == '\n')
+                       os += ' ';
+               else if (c == META_INSET)
+                       getInset(i)->forToc(os, maxlen);
+       }
+}
+
+
 docstring Paragraph::stringify(pos_type beg, pos_type end, int options, OutputParams & runparams) const
 {
        odocstringstream os;
@@ -3578,7 +3617,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 + AS_STR_SKIPDELETE);
+       docstring word = asString(from, to, AS_STR_INSETS | AS_STR_SKIPDELETE);
        Language * lang = d->getSpellLanguage(from);
 
        wl = WordLangTuple(word, lang);
@@ -3597,6 +3636,11 @@ SpellChecker::Result Paragraph::spellCheck(pos_type & from, pos_type & to,
                                        LYXERR(Debug::GUI, "misspelled word is correct with dot: \"" <<
                                           word << "\" [" <<
                                           from << ".." << to << "]");
+                               } else {
+                                       // spell check with dot appended failed
+                                       // restore original word/lang value
+                                       word = asString(from, to, AS_STR_INSETS | AS_STR_SKIPDELETE);
+                                       wl = WordLangTuple(word, lang);
                                }
                        }
                }