X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FParagraph.cpp;h=4ce94415f796f23e1f83a60a378e1257d1d77145;hb=874f559bc78f1572a3daeeea375f7b4be376bbdd;hp=e37a123823e3e828df7084eeacf6c400cf0d9b3f;hpb=801768af9242ff1aca8735a0226e4c78becded00;p=features.git diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp index e37a123823..4ce94415f7 100644 --- a/src/Paragraph.cpp +++ b/src/Paragraph.cpp @@ -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); } @@ -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) != 0); + 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; @@ -3997,6 +4020,8 @@ docstring Paragraph::simpleLyXHTMLOnePar(Buffer const & buf, runparams, i); if (c == ' ' && (style.free_spacing || runparams.free_spacing)) xs << XMLStream::ESCAPE_NONE << " "; + else if (c == '\'') + xs << XMLStream::ESCAPE_NONE << "’"; else xs << c; } @@ -4560,32 +4585,6 @@ void Paragraph::changeCase(BufferParams const & bparams, pos_type pos, } } -static char_type matchquote(char_type in) -{ - switch (in) { - case 0x2018: // Left Single Quotation Mark - case 0x2019: // Right Single Quotation Mark - case 0x201a: // Single Low-9 Quotation Mark - case 0x201b: // Single High-Reversed-9 Quotation Mark - case 0x2039: // Single Left-Pointing Angle Quotation Mark - case 0x203a: // Single Right-Pointing Angle Quotation Mark - return '\''; - case 0x00bb: // Right-Pointing Double Angle Quotation Mark - case 0x00ab: // Left-Pointing Double Angle Quotation Mark - case 0x201e: // Double Low-9 Quotation Mark - case 0x201c: // Left Double Quotation Mark - case 0x201d: // Right Double Quotation Mark - case 0x201f: // Double High-Reversed-9 Quotation Mark - case 0x2e42: // Double Low-Reversed-9 Quotation Mark - case 0x301e: // Double Prime Quotation Mark - case 0x301d: // Reversed Double Prime Quotation Mark - case 0x301f: // Low Double Prime Quotation Mark - return '"'; - default: - return in; - } -} - int Paragraph::find(docstring const & str, bool cs, bool mw, pos_type start_pos, bool del) const { @@ -4610,14 +4609,20 @@ 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(); for (int j = 0; j < insetstringsize && pos < parsize; ++i, ++j) { - char_type ij = matchquote(insetstring[j]); - if ((cs && str[i] != ij) - || (!cs && uppercase(str[i]) != uppercase(ij))) { + if ((cs && str[i] != insetstring[j]) + || (!cs && uppercase(str[i]) != uppercase(insetstring[j]))) { nonmatch = true; break; } @@ -4627,7 +4632,7 @@ int Paragraph::find(docstring const & str, bool cs, bool mw, } if (nonmatch || i == strsize) break; - char_type dp = matchquote(d->text_[pos]); + char_type dp = d->text_[pos]; if (cs && str[i] != dp) break; if (!cs && uppercase(str[i]) != uppercase(dp))