X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FParagraph.cpp;h=d69fa55bb539459b0760adc24d19724a6da75ec3;hb=2b02b73f4a59bb73f9e819a960ea98c86ef8716f;hp=8ea7eec895125a2ec63cd53200d5201e38ffd60b;hpb=b38500353cb2e00ae82d336c5fcbaa5d5ea70e78;p=lyx.git diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp index 8ea7eec895..d69fa55bb5 100644 --- a/src/Paragraph.cpp +++ b/src/Paragraph.cpp @@ -66,6 +66,7 @@ #include "support/textutils.h" #include "output_docbook.h" +#include #include #include #include @@ -1087,7 +1088,7 @@ void Paragraph::Private::latexInset(BufferParams const & bparams, runparams.local_font = &basefont; } - if (fontswitch_inset && !closeLanguage && fontswitch_inset) { + if (fontswitch_inset && !closeLanguage) { // The directionality has been switched at inset. // Force markup inside. runparams.local_font = &basefont; @@ -1103,7 +1104,7 @@ void Paragraph::Private::latexInset(BufferParams const & bparams, // add location information and throw again. e.par_id = id_; e.pos = i; - throw(e); + throw; } if (close) @@ -2878,7 +2879,7 @@ void Paragraph::latex(BufferParams const & bparams, // add location information and throw again. e.par_id = id(); e.pos = i; - throw(e); + throw; } } } @@ -3358,6 +3359,10 @@ std::vector Paragraph::simpleDocBookOnePar(Buffer const & buf, auto * xs = new XMLStream(os); // XMLStream has no copy constructor: to create a new object, the only solution // is to hold a pointer to the XMLStream (xs = XMLStream(os) is not allowed once the first object is built). + // When a font tag ends with a space, output it after the closing font tag. This requires to store delayed + // characters at some point. + std::vector delayedChars; + // Parsing main loop. for (pos_type i = initial; i < size(); ++i) { // Don't show deleted material in the output. @@ -3399,6 +3404,13 @@ std::vector Paragraph::simpleDocBookOnePar(Buffer const & buf, 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(); + } + vector::const_iterator sit = tagsToOpen.begin(); vector::const_iterator sen = tagsToOpen.end(); for (; sit != sen; ++sit) @@ -3419,7 +3431,10 @@ std::vector Paragraph::simpleDocBookOnePar(Buffer const & buf, } } else { char_type c = getUChar(buf.masterBuffer()->params(), runparams, i); - *xs << c; + if (lyx::isSpace(c) && !ignore_fonts) + delayedChars.push_back(c); + else + *xs << c; } font_old = font.fontInfo(); } @@ -3430,7 +3445,13 @@ std::vector Paragraph::simpleDocBookOnePar(Buffer const & buf, if (!ignore_fonts) xs->closeFontTags(); - // In listings, new lines are very important. Avoid generating one for the last line. + // Deal with the delayed characters *after* closing font tags. + if (!delayedChars.empty()) + for (char_type c: delayedChars) + *xs << c; + + // In listings, new lines (i.e. \n characters in the output) are very important. Avoid generating one for the + // last line to get a clean output. if (runparams.docbook_in_listing && !is_last_par) *xs << xml::CR(); @@ -4348,10 +4369,8 @@ void Paragraph::changeCase(BufferParams const & bparams, pos_type pos, } int erasePos = pos - changes.size(); - for (size_t i = 0; i < changes.size(); i++) { - insertChar(pos, changes[i].first, - changes[i].second, - trackChanges); + for (auto const & change : changes) { + insertChar(pos, change.first, change.second, trackChanges); if (!eraseChar(erasePos, trackChanges)) { ++erasePos; ++pos; // advance @@ -4810,7 +4829,7 @@ void Paragraph::spellCheck() const // start the spell checker on the unit of meaning docstring word = asString(first, last, AS_STR_INSETS + AS_STR_SKIPDELETE); WordLangTuple wl = WordLangTuple(word, lang); - SpellChecker::Result result = word.size() ? + SpellChecker::Result result = !word.empty() ? speller->check(wl) : SpellChecker::WORD_OK; d->markMisspelledWords(first, last, result, word, skips); first = ++last;