]> git.lyx.org Git - features.git/blobdiff - src/Paragraph.cpp
Handle empty index subentries (#7820)
[features.git] / src / Paragraph.cpp
index 9a1171f99ebfc983dd84fcc2a08895154a1a8c94..4ce94415f796f23e1f83a60a378e1257d1d77145 100644 (file)
@@ -1209,26 +1209,41 @@ void Paragraph::Private::latexSpecialChar(otexstream & os,
 {
        char_type const c = owner_->getUChar(bparams, runparams, i);
 
-       if (style.pass_thru || runparams.pass_thru || (runparams.for_searchAdv != OutputParams::NoSearch)
+       if (style.pass_thru || runparams.pass_thru || runparams.find_effective()
            || contains(style.pass_thru_chars, c)
            || contains(runparams.pass_thru_chars, c)) {
-               if (runparams.for_searchAdv != OutputParams::NoSearch) {
-                       if (c == '\\')
+               if (runparams.find_effective()) {
+                       switch (c) {
+                       case '\\':
                                os << "\\\\";
-                       else if (c == '{')
+                               return;
+                       case '{':
                                os << "\\braceleft ";
-                       else if (c == '}')
+                               return;
+                       case '}':
                                os << "\\braceright ";
-                       else if (c != '\0')
+                               return;
+                       case '$':
+                               os << "\\lyxdollar ";
+                               return;
+                       case '~':
+                               os << "\\lyxtilde ";
+                               return;
+                       case ' ':
+                       case '\0':
+                               break;
+                       default:
                                os.put(c);
+                               return;
+                       }
                }
                else if (c != '\0') {
                        Encoding const * const enc = runparams.encoding;
                        if (enc && !enc->encodable(c))
                                throw EncodingException(c);
                        os.put(c);
+                       return;
                }
-               return;
        }
 
        // TIPA uses its own T3 encoding
@@ -1912,7 +1927,8 @@ FontSpan Paragraph::fontSpan(pos_type pos) const
 
        // This should not happen, but if so, we take no chances.
        LYXERR0("Paragraph::fontSpan: position not found in fontinfo table!");
-       LASSERT(false, return FontSpan(pos, pos));
+       LASSERT(false, /**/);
+       return FontSpan(pos, pos);
 }
 
 
@@ -2510,7 +2526,7 @@ void Paragraph::latex(BufferParams const & bparams,
        OutputParams const & runparams,
        int start_pos, int end_pos, bool force) const
 {
-       LYXERR(Debug::LATEX, "Paragraph::latex...     " << this);
+       LYXERR(Debug::OUTFILE, "Paragraph::latex...     " << this);
 
        // FIXME This check should not be needed. Perhaps issue an
        // error if it triggers.
@@ -2610,7 +2626,7 @@ void Paragraph::latex(BufferParams const & bparams,
                                                runparams);
                                runningChange = Change(Change::UNCHANGED);
 
-                               os << (isEnvSeparator(i) ? "}]~" : "}] ");
+                               os << ((isEnvSeparator(i) && !runparams.find_effective()) ? "}]~" : "}] ");
                                column +=3;
                        }
                        // For InTitle commands, we have already opened a group
@@ -2640,10 +2656,10 @@ void Paragraph::latex(BufferParams const & bparams,
 
                // Check whether a display math inset follows
                bool output_changes;
-               if (runparams.for_searchAdv == OutputParams::NoSearch)
+               if (!runparams.find_effective())
                        output_changes = bparams.output_changes;
                else
-                       output_changes = (runparams.for_searchAdv == OutputParams::SearchWithDeleted);
+                       output_changes = runparams.find_with_deleted();
                if (c == META_INSET
                    && i >= start_pos && (end_pos == -1 || i < end_pos)) {
                        if (isDeleted(i))
@@ -2773,9 +2789,11 @@ void Paragraph::latex(BufferParams const & bparams,
                                os << '}';
                                column += 1;
                        }
-                       if (closeLanguage)
+                       if (closeLanguage) {
                                // Force language closing
                                current_font.setLanguage(basefont.language());
+                               langClosed = true;
+                       }
                        Font const nextfont = (i == body_pos-1) ? basefont : current_font;
                        bool needPar = false;
                        column += running_font.latexWriteEndChanges(
@@ -2789,7 +2807,7 @@ void Paragraph::latex(BufferParams const & bparams,
                                        Change(Change::UNCHANGED), Change(Change::DELETED), rp);
                        }
                        // Has the language been closed in the latexWriteEndChanges() call above?
-                       langClosed = running_font.language() != basefont.language()
+                       langClosed |= running_font.language() != basefont.language()
                                        && running_font.language() != nextfont.language()
                                        && (running_font.language()->encoding()->package() != Encoding::CJK);
                        running_font = basefont;
@@ -2893,9 +2911,14 @@ void Paragraph::latex(BufferParams const & bparams,
                                        column += Changes::latexMarkChange(os, bparams,
                                                Change(Change::UNCHANGED), change, rp);
                                }
-                       } else {
+                       } else {// if fontswitch_inset
+                               if (current_font != running_font || !langClosed)
+                                       // font is still open in fontswitch_insets if we have
+                                       // a non-lang font difference or if the language
+                                       // is the only difference but has not been forcedly
+                                       // closed meanwhile
+                                       open_font = true;
                                running_font = current_font;
-                               open_font &= !langClosed;
                        }
                }
 
@@ -2964,7 +2987,7 @@ void Paragraph::latex(BufferParams const & bparams,
                                d->latexInset(bparams, os, rp, running_font,
                                                basefont, real_outerfont, open_font,
                                                runningChange, style, i, column, fontswitch_inset,
-                                               closeLanguage, lang_switched_at_inset);
+                                               closeLanguage, (lang_switched_at_inset || langClosed));
                                if (fontswitch_inset) {
                                        if (open_font) {
                                                bool needPar = false;
@@ -3127,7 +3150,7 @@ void Paragraph::latex(BufferParams const & bparams,
                os << setEncoding(prev_encoding->iconvName());
        }
 
-       LYXERR(Debug::LATEX, "Paragraph::latex... done " << this);
+       LYXERR(Debug::OUTFILE, "Paragraph::latex... done " << this);
 }
 
 
@@ -3997,6 +4020,8 @@ docstring Paragraph::simpleLyXHTMLOnePar(Buffer const & buf,
                                               runparams, i);
                        if (c == ' ' && (style.free_spacing || runparams.free_spacing))
                                xs << XMLStream::ESCAPE_NONE << "&nbsp;";
+                       else if (c == '\'')
+                               xs << XMLStream::ESCAPE_NONE << "&#8217;";
                        else
                                xs << c;
                }
@@ -4560,7 +4585,6 @@ void Paragraph::changeCase(BufferParams const & bparams, pos_type pos,
        }
 }
 
-
 int Paragraph::find(docstring const & str, bool cs, bool mw,
                pos_type start_pos, bool del) const
 {
@@ -4585,7 +4609,14 @@ int Paragraph::find(docstring const & str, bool cs, bool mw,
                        if (!inset->isLetter() && !inset->isChar())
                                break;
                        odocstringstream os;
-                       inset->toString(os);
+                       if (inset->lyxCode() == lyx::QUOTE_CODE) {
+                               OutputParams op(0);
+                               op.find_set_feature(OutputParams::SearchQuick);
+                               inset->plaintext(os, op);
+                       }
+                       else {
+                               inset->toString(os);
+                       }
                        docstring const insetstring = os.str();
                        if (!insetstring.empty()) {
                                int const insetstringsize = insetstring.length();
@@ -4601,9 +4632,10 @@ int Paragraph::find(docstring const & str, bool cs, bool mw,
                }
                if (nonmatch || i == strsize)
                        break;
-               if (cs && str[i] != d->text_[pos])
+               char_type dp = d->text_[pos];
+               if (cs && str[i] != dp)
                        break;
-               if (!cs && uppercase(str[i]) != uppercase(d->text_[pos]))
+               if (!cs && uppercase(str[i]) != uppercase(dp))
                        break;
        }