]> git.lyx.org Git - features.git/blobdiff - src/output_docbook.cpp
Slight code-consistency improvements.
[features.git] / src / output_docbook.cpp
index eb1a9a5a5f5cbcb8459fe1815135b5e084ff478f..5b788f3278fadf357d9e0e6571b73049d55965ef 100644 (file)
@@ -189,7 +189,7 @@ namespace {
 
 // convenience functions
 
-void openParTag(XMLStream &xs, Layout const &lay)
+void openParTag(XMLStream & xs, Layout const & lay)
 {
        if (lay.docbookwrappertag() != "NONE") {
                xs << xml::StartTag(lay.docbookwrappertag(), lay.docbookwrapperattr());
@@ -203,7 +203,7 @@ void openParTag(XMLStream &xs, Layout const &lay)
 }
 
 
-void closeTag(XMLStream &xs, Layout const &lay)
+void closeTag(XMLStream & xs, Layout const & lay)
 {
        string tag = lay.docbooktag();
        if (tag == "Plain Layout")
@@ -228,14 +228,14 @@ void closeLabelTag(XMLStream & xs, Layout const & lay)
 }
 
 
-void openItemTag(XMLStream &xs, Layout const &lay)
+void openItemTag(XMLStream & xs, Layout const & lay)
 {
        xs << xml::StartTag(lay.docbookitemtag(), lay.docbookitemattr());
 }
 
 
 // Return true when new elements are output in a paragraph, false otherwise.
-bool openInnerItemTag(XMLStream &xs, Layout const &lay)
+bool openInnerItemTag(XMLStream & xs, Layout const & lay)
 {
        if (lay.docbookiteminnertag() != "NONE") {
                xs << xml::CR();
@@ -249,7 +249,7 @@ bool openInnerItemTag(XMLStream &xs, Layout const &lay)
 }
 
 
-void closeInnerItemTag(XMLStream &xs, Layout const &lay)
+void closeInnerItemTag(XMLStream & xs, Layout const & lay)
 {
        if (lay.docbookiteminnertag()!= "NONE") {
                xs << xml::EndTag(lay.docbookiteminnertag());
@@ -258,7 +258,7 @@ void closeInnerItemTag(XMLStream &xs, Layout const &lay)
 }
 
 
-inline void closeItemTag(XMLStream &xs, Layout const &lay)
+inline void closeItemTag(XMLStream & xs, Layout const & lay)
 {
        xs << xml::EndTag(lay.docbookitemtag());
        xs << xml::CR();
@@ -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("")));
 
-               par->simpleDocBookOnePar(buf, xs, runparams, text.outerFont(distance(begin, par)), open_par, close_par, 0);
+               if (!cleaned.empty()) {
+                       if (open_par)
+                               openParTag(xs, lay);
 
-               if (close_par) {
-                       closeTag(xs, lay);
-                       xs << xml::CR();
+                       xs << XMLStream::ESCAPE_NONE << os2.str();
+
+                       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;
                }
@@ -744,15 +764,34 @@ DocBookDocumentSectioning hasDocumentSectioning(ParagraphList const &paragraphs,
 }
 
 
-DocBookInfoTag getParagraphsWithInfo(ParagraphList const &paragraphs, pit_type const bpit, pit_type const epit) {
+bool hasOnlyNotes(Paragraph const & par)
+{
+       for (int i = 0; i < par.size(); ++i)
+               if (!par.isInset(i) || !dynamic_cast<InsetNote *>(par.insetList().get(i)))
+                       return false;
+       return true;
+}
+
+
+DocBookInfoTag getParagraphsWithInfo(ParagraphList const &paragraphs, pit_type bpit, pit_type const epit) {
        set<pit_type> shouldBeInInfo;
        set<pit_type> mustBeInInfo;
 
+       // Find the first non empty paragraph by mutating bpit.
+       while (bpit < epit) {
+               Paragraph const &par = paragraphs[bpit];
+               if (par.empty() || hasOnlyNotes(par))
+                       bpit += 1;
+               else
+                       break;
+       }
+
+       // Find the last info-like paragraph.
        pit_type cpit = bpit;
        while (cpit < epit) {
                // Skip paragraphs only containing one note.
                Paragraph const &par = paragraphs[cpit];
-               if (par.size() == 1 && dynamic_cast<InsetNote*>(paragraphs[cpit].insetList().get(0))) {
+               if (hasOnlyNotes(par)) {
                        cpit += 1;
                        continue;
                }