]> git.lyx.org Git - lyx.git/blobdiff - src/output_docbook.cpp
Fix bug #12772
[lyx.git] / src / output_docbook.cpp
index 114c2583042039f428ea47459c6aa13e76438ccc..c80a7cdb91b7e4dab05591cc308c23e63ac205ae 100644 (file)
@@ -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 <inlineequation> 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<InsetCode> 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<docstring> pars_prepend;
         std::vector<docstring> pars;
         std::vector<docstring> 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 &paragraphs,
        bool documentHasSections = false;
 
        while (bpit < epit) {
+               LASSERT(static_cast<size_t>(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 &paragraphs,
        set<pit_type> abstractWithLayout;
        set<pit_type> 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 &paragraphs,
                // There should never be any section here, except for the first paragraph (a title can be part of <info>).
                // (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 <info> paragraphs.");
+                       LYXERR(Debug::OUTFILE, "Assertion failed: section found in potential <info> 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("<!--"))) != lyx::docstring::npos) {
+                       if ((endComment = 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;