X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Foutput_docbook.cpp;h=c80a7cdb91b7e4dab05591cc308c23e63ac205ae;hb=4ed0312c51704780af1c452d3a82a84171b3725a;hp=114c2583042039f428ea47459c6aa13e76438ccc;hpb=14ed5b205021f57140dcfb603c4869edc352b60a;p=lyx.git diff --git a/src/output_docbook.cpp b/src/output_docbook.cpp index 114c258304..c80a7cdb91 100644 --- a/src/output_docbook.cpp +++ b/src/output_docbook.cpp @@ -200,9 +200,18 @@ void openParTag(XMLStream & xs, const Paragraph * par, const Paragraph * prevpar } // Main logic. - if (openWrapper) + if (openWrapper) { xml::openTag(xs, lay.docbookwrappertag(), lay.docbookwrapperattr(), lay.docbookwrappertagtype()); + if (lay.docbookgeneratetitle()) { + docstring const label = par->params().labelString(); + + xml::openTag(xs, "title", "", "paragraph"); + xs << (!label.empty() ? label : from_ascii("No title")); + xml::closeTag(xs, "title", "paragraph"); + } + } + const string & tag = lay.docbooktag(); if (tag != "NONE") { auto xmltag = xml::ParTag(tag, lay.docbookattr()); @@ -360,11 +369,13 @@ void makeParagraph( // Plain layouts must be ignored. special_case |= buf.params().documentClass().isPlainLayout(par->layout()) && !runparams.docbook_force_pars; + // Equations do not deserve their own paragraph (DocBook allows them outside paragraphs). // Exception: any case that generates an must still get a paragraph to be valid. - special_case |= nInsets == parSize && std::all_of(par->insetList().begin(), par->insetList().end(), [](InsetList::Element inset) { + auto isEquationSpecialCase = [](InsetList::Element inset) { return inset.inset && inset.inset->asInsetMath() && inset.inset->asInsetMath()->getType() != hullSimple; - }); + }; + special_case |= nInsets == parSize && std::all_of(par->insetList().begin(), par->insetList().end(), isEquationSpecialCase); // Things that should not get into their own paragraph. (Only valid for DocBook.) static std::set lyxCodeSpecialCases = { @@ -420,6 +431,12 @@ void makeParagraph( }; special_case |= nInsets == parSize && std::all_of(par->insetList().begin(), par->insetList().end(), isFlexSpecialCase); + // If the insets should be rendered as images, enter the special case. + auto isRenderedAsImageSpecialCase = [](InsetList::Element inset) { + return inset.inset && inset.inset->getLayout().docbookrenderasimage(); + }; + special_case |= nInsets == parSize && std::all_of(par->insetList().begin(), par->insetList().end(), isRenderedAsImageSpecialCase); + // Open a paragraph if it is allowed, we are not already within a paragraph, and the insets in the paragraph do // not forbid paragraphs (aka special cases). bool const open_par = runparams.docbook_make_pars @@ -500,7 +517,9 @@ void makeEnvironment(Text const &text, std::vector pars_prepend; std::vector pars; std::vector pars_append; - tie(pars_prepend, pars, pars_append) = par->simpleDocBookOnePar(buf, runparams, text.outerFont(std::distance(text.paragraphs().begin(), par)), 0, false, ignoreFonts); + tie(pars_prepend, pars, pars_append) = + par->simpleDocBookOnePar(buf, runparams, text.outerFont(std::distance(text.paragraphs().begin(), par)), + 0, false, ignoreFonts); for (docstring const & parXML : pars_prepend) xs << XMLStream::ESCAPE_NONE << parXML; @@ -746,6 +765,8 @@ DocBookDocumentSectioning hasDocumentSectioning(ParagraphList const ¶graphs, bool documentHasSections = false; while (bpit < epit) { + LASSERT(static_cast(bpit) < paragraphs.size(), return make_tuple(documentHasSections, bpit)); + Layout const &style = paragraphs[bpit].layout(); documentHasSections |= isLayoutSectioningOrSimilar(style); @@ -792,7 +813,7 @@ DocBookInfoTag getParagraphsWithInfo(ParagraphList const ¶graphs, set abstractWithLayout; set abstractNoLayout; - // Find the first non empty paragraph by mutating bpit. + // Find the first nonempty paragraph by mutating bpit. while (bpit < epit) { Paragraph const &par = paragraphs[bpit]; if (par.empty() || hasOnlyNotes(par)) @@ -816,7 +837,7 @@ DocBookInfoTag getParagraphsWithInfo(ParagraphList const ¶graphs, // There should never be any section here, except for the first paragraph (a title can be part of ). // (Just a sanity check: if this fails, this function could end up processing the whole document.) if (cpit != bpit && isLayoutSectioningOrSimilar(par.layout())) { - LYXERR0("Assertion failed: section found in potential paragraphs."); + LYXERR(Debug::OUTFILE, "Assertion failed: section found in potential paragraphs."); break; } @@ -1010,12 +1031,20 @@ void outputDocBookInfo( } } - // Actually output the abstract if there is something to do. Don't count line feeds or spaces in this, - // even though they must be properly output if there is some abstract. + // Actually output the abstract if there is something to do. Don't count line feeds, spaces, or comments + // in this -- even though line feeds and spaces must be properly output if there is some abstract. abstract = os2.str(); docstring cleaned = abstract; cleaned.erase(std::remove_if(cleaned.begin(), cleaned.end(), lyx::isSpace), cleaned.end()); + size_t beginComment; + size_t endComment; + while ((beginComment = cleaned.find(from_ascii(""), beginComment)) != lyx::docstring::npos) { + cleaned.erase(cleaned.begin() + beginComment, cleaned.begin() + endComment + 3); + } + } + // Nothing? Then there is no abstract! if (cleaned.empty()) hasAbstract = false;