]> git.lyx.org Git - lyx.git/blobdiff - src/output_docbook.cpp
Fix #10328.
[lyx.git] / src / output_docbook.cpp
index eb1a9a5a5f5cbcb8459fe1815135b5e084ff478f..5e15edcee9b47b84d50432e5bd0f6d29f903f064 100644 (file)
@@ -274,6 +274,14 @@ ParagraphList::const_iterator findLastParagraph(
        return p;
 }
 
+ParagraphList::const_iterator findLastBibliographyParagraph(
+               ParagraphList::const_iterator p,
+               ParagraphList::const_iterator const & pend) {
+       for (++p; p != pend && p->layout().latextype == LATEX_BIB_ENVIRONMENT; ++p);
+
+       return p;
+}
+
 
 ParagraphList::const_iterator findEndOfEnvironment(
                ParagraphList::const_iterator const & pstart,
@@ -339,7 +347,7 @@ ParagraphList::const_iterator makeParagraphBibliography(
                xs << xml::CR();
        }
 
-       // Generate the required paragraphs.
+       // Generate the required paragraphs, but only if they are .
        for (; par != pend; ++par) {
                // Start the precooked bibliography entry. This is very much like opening a paragraph tag.
                // Don't forget the citation ID!
@@ -348,7 +356,7 @@ ParagraphList::const_iterator makeParagraphBibliography(
                        Inset const *ip = par->getInset(0);
                        if (ip != nullptr && ip->lyxCode() == BIBITEM_CODE) {
                                const auto * bibitem = dynamic_cast<const InsetBibitem*>(par->getInset(i));
-                               attr = from_utf8("xml:id='") + bibitem->bibLabel() + from_utf8("'");
+                               attr = from_utf8("xml:id='") + bibitem->getParam("key") + from_utf8("'");
                                break;
                        }
                }
@@ -455,14 +463,26 @@ ParagraphList::const_iterator makeParagraphs(
                                ((open_par && (!runparams.docbook_in_par || nextpar != pend))
                                || (!open_par && runparams.docbook_in_par && par == pbegin && nextpar != pend));
 
-               if (open_par)
-                       openParTag(xs, lay);
+               // Determine if this paragraph has some real content. Things like new pages are not caught
+               // by Paragraph::empty(), even though they do not generate anything useful in DocBook.
+               odocstringstream os2;
+               XMLStream xs2(os2);
+               par->simpleDocBookOnePar(buf, xs2, runparams, text.outerFont(distance(begin, par)), open_par, close_par, 0);
+
+               docstring cleaned = os2.str();
+               static const lyx::regex reg("[ \\r\\n]*");
+               cleaned = from_utf8(lyx::regex_replace(to_utf8(cleaned), reg, string("")));
+
+               if (!cleaned.empty()) {
+                       if (open_par)
+                               openParTag(xs, lay);
 
-               par->simpleDocBookOnePar(buf, xs, runparams, text.outerFont(distance(begin, par)), open_par, close_par, 0);
+                       xs << XMLStream::ESCAPE_NONE << os2.str();
 
-               if (close_par) {
-                       closeTag(xs, lay);
-                       xs << xml::CR();
+                       if (close_par) {
+                               closeTag(xs, lay);
+                               xs << xml::CR();
+                       }
                }
        }
        return pend;
@@ -628,7 +648,7 @@ ParagraphList::const_iterator makeEnvironment(
                        par = makeParagraphs(buf, xs, runparams, text, par, send);
                        break;
                case LATEX_BIB_ENVIRONMENT:
-                       send = findLastParagraph(par, pend);
+                       send = findLastBibliographyParagraph(par, pend);
                        par = makeParagraphBibliography(buf, xs, runparams, text, par, send);
                        break;
                case LATEX_COMMAND:
@@ -705,7 +725,7 @@ pair<ParagraphList::const_iterator, ParagraphList::const_iterator> makeAny(
                        break;
                }
                case LATEX_BIB_ENVIRONMENT: {
-                       send = findLastParagraph(par, pend);
+                       send = findLastBibliographyParagraph(par, pend);
                        par = makeParagraphBibliography(buf, xs, ourparams, text, par, send);
                        break;
                }