]> git.lyx.org Git - lyx.git/blobdiff - src/Paragraph.cpp
Fix a crash when closing tabs
[lyx.git] / src / Paragraph.cpp
index 77611c2e264dfa72d35801fd2673440eac6c8413..22dcdb68ac8cb614ed59dc6e7b281f8438c84750 100644 (file)
@@ -2515,7 +2515,9 @@ void Paragraph::latex(BufferParams const & bparams,
        // Do we have an open font change?
        bool open_font = false;
 
-       Change runningChange = Change(Change::UNCHANGED);
+       Change runningChange =
+           runparams.inDeletedInset && !inInset().canTrackChanges()
+           ? runparams.changeOfDeletedInset : Change(Change::UNCHANGED);
 
        Encoding const * const prev_encoding = runparams.encoding;
 
@@ -3050,8 +3052,9 @@ void Paragraph::latex(BufferParams const & bparams,
                os << "{\\" << font.latexSize() << "\\par}";
        }
 
-       column += Changes::latexMarkChange(os, bparams, runningChange,
-                                          Change(Change::UNCHANGED), runparams);
+       if (!runparams.inDeletedInset || inInset().canTrackChanges())
+               column += Changes::latexMarkChange(os, bparams, runningChange,
+                                       Change(Change::UNCHANGED), runparams);
 
        // Needed if there is an optional argument but no contents.
        if (body_pos > 0 && body_pos == size()) {
@@ -3448,6 +3451,10 @@ std::vector<docstring> Paragraph::simpleDocBookOnePar(Buffer const & buf,
 
        // Parsing main loop.
        for (pos_type i = initial; i < size(); ++i) {
+           bool ignore_fonts_i = ignore_fonts
+                              || style.docbooknofontinside()
+                              || (getInset(i) && getInset(i)->getLayout().docbooknofontinside());
+
                // Don't show deleted material in the output.
                if (isDeleted(i))
                        continue;
@@ -3455,7 +3462,7 @@ std::vector<docstring> Paragraph::simpleDocBookOnePar(Buffer const & buf,
                // If this is an InsetNewline, generate a new paragraph. Also reset the fonts, so that tags are closed in
                // this paragraph.
                if (getInset(i) && getInset(i)->lyxCode() == NEWLINE_CODE) {
-                       if (!ignore_fonts)
+                       if (!ignore_fonts_i)
                                xs->closeFontTags();
 
                        // Output one paragraph (i.e. one string entry in generatedParagraphs).
@@ -3468,7 +3475,7 @@ std::vector<docstring> Paragraph::simpleDocBookOnePar(Buffer const & buf,
                        xs = new XMLStream(os);
 
                        // Restore the fonts for the new paragraph, so that the right tags are opened for the new entry.
-                       if (!ignore_fonts) {
+                       if (!ignore_fonts_i) {
                                font_old = outerfont.fontInfo();
                                fs = old_fs;
                        }
@@ -3476,24 +3483,23 @@ std::vector<docstring> Paragraph::simpleDocBookOnePar(Buffer const & buf,
 
                // Determine which tags should be opened or closed regarding fonts.
                Font const font = getFont(buf.masterBuffer()->params(), i, outerfont);
-               if (!ignore_fonts) {
-                       tie(tagsToOpen, tagsToClose) = computeDocBookFontSwitch(font_old, font, default_family, fs);
-
-                       // FIXME XHTML
-                       // Other such tags? What about the other text ranges?
-
-                       vector<xml::EndFontTag>::const_iterator cit = tagsToClose.begin();
-                       vector<xml::EndFontTag>::const_iterator cen = tagsToClose.end();
-                       for (; cit != cen; ++cit)
-                               *xs << *cit;
-
-                       // Deal with the delayed characters *after* closing font tags.
-                       if (!delayedChars.empty()) {
-                               for (char_type c: delayedChars)
-                                       *xs << c;
-                               delayedChars.clear();
-                       }
-
+        tie(tagsToOpen, tagsToClose) = computeDocBookFontSwitch(font_old, font, default_family, fs);
+
+               if (!ignore_fonts_i) {
+            vector<xml::EndFontTag>::const_iterator cit = tagsToClose.begin();
+            vector<xml::EndFontTag>::const_iterator cen = tagsToClose.end();
+            for (; cit != cen; ++cit)
+                *xs << *cit;
+        }
+
+        // Deal with the delayed characters *after* closing font tags.
+        if (!delayedChars.empty()) {
+            for (char_type c: delayedChars)
+                *xs << c;
+            delayedChars.clear();
+        }
+
+        if (!ignore_fonts_i) {
                        vector<xml::FontTag>::const_iterator sit = tagsToOpen.begin();
                        vector<xml::FontTag>::const_iterator sen = tagsToOpen.end();
                        for (; sit != sen; ++sit)
@@ -3503,6 +3509,7 @@ std::vector<docstring> Paragraph::simpleDocBookOnePar(Buffer const & buf,
                        tagsToOpen.clear();
                }
 
+        // Finally, write the next character or inset.
                if (Inset const * inset = getInset(i)) {
                        if (!runparams.for_toc || inset->isInToc()) {
                                OutputParams np = runparams;
@@ -4498,10 +4505,12 @@ int Paragraph::find(docstring const & str, bool cs, bool mw,
                                break;
                        odocstringstream os;
                        inset->toString(os);
-                       if (!os.str().empty()) {
-                               int const insetstringsize = os.str().length();
+                       docstring const insetstring = os.str();
+                       if (!insetstring.empty()) {
+                               int const insetstringsize = insetstring.length();
                                for (int j = 0; j < insetstringsize && pos < parsize; ++i, ++j) {
-                                       if (str[i] != os.str()[j]) {
+                                       if ((cs && str[i] != insetstring[j])
+                                           || (!cs && uppercase(str[i]) != uppercase(insetstring[j]))) {
                                                nonmatch = true;
                                                break;
                                        }