]> git.lyx.org Git - features.git/blobdiff - src/output_docbook.cpp
xHTML export: change filenames of exported images.
[features.git] / src / output_docbook.cpp
index c5519de5c95aea4f95b6896cc07c8bcc534ed0d6..1a2bb4109488788262a01417f1ec9264f3918bbe 100644 (file)
@@ -36,6 +36,8 @@
 #include "support/lstrings.h"
 #include "support/textutils.h"
 
+#include "support/regex.h"
+
 #include <stack>
 #include <iostream>
 #include <algorithm>
@@ -346,7 +348,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;
                        }
                }
@@ -453,9 +455,8 @@ 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) {
+               if (open_par)
                        openParTag(xs, lay);
-               }
 
                par->simpleDocBookOnePar(buf, xs, runparams, text.outerFont(distance(begin, par)), open_par, close_par, 0);
 
@@ -849,8 +850,29 @@ void outputDocBookInfo(
        pit_type epitInfo;
        tie(shouldBeInInfo, mustBeInInfo, bpitInfo, epitInfo) = info;
 
-       // The abstract must go in <info>.
+       // Perform an additional check on the abstract. Sometimes, there are many paragraphs that should go
+       // into the abstract, but none generates actual content. Thus, first generate to a temporary stream,
+       // then only create the <abstract> tag if these paragraphs generate some content.
+       // This check must be performed *before* a decision on whether or not to output <info> is made.
        bool hasAbstract = hasAbstractBetween(paragraphs, bpitAbstract, epitAbstract);
+       docstring abstract;
+       if (hasAbstract) {
+               odocstringstream os2;
+               XMLStream xs2(os2);
+               generateDocBookParagraphWithoutSectioning(text, buf, xs2, runparams, paragraphs, bpitAbstract, epitAbstract);
+
+               // 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.
+               docstring abstractContent = os2.str();
+               static const lyx::regex reg("[ \\r\\n]*");
+               abstractContent = from_utf8(lyx::regex_replace(to_utf8(abstractContent), reg, string("")));
+
+               // Nothing? Then there is no abstract!
+               if (abstractContent.empty())
+                       hasAbstract = false;
+       }
+
+       // The abstract must go in <info>.
        bool needInfo = !mustBeInInfo.empty() || hasAbstract;
 
        // Start the <info> tag if required.
@@ -863,26 +885,16 @@ void outputDocBookInfo(
        // Output the elements that should go in <info>.
        generateDocBookParagraphWithoutSectioning(text, buf, xs, runparams, paragraphs, bpitInfo, epitInfo);
 
-       if (hasAbstract) {
-               // Sometimes, there are many paragraphs that should go into the abstract, but none generates actual content.
-               // Thus, first generate to a temporary stream, then only create the <abstract> tag if these paragraphs
-               // generate some content.
-               odocstringstream os2;
-               XMLStream xs2(os2);
-               generateDocBookParagraphWithoutSectioning(text, buf, xs2, runparams, paragraphs, bpitAbstract, epitAbstract);
-
-               // Actually output the abstract if there is something to do.
-               if (!os2.str().empty()) {
-                       string tag = paragraphs[bpitAbstract].layout().docbookforceabstracttag();
-                       if (tag == "NONE")
-                               tag = "abstract";
+       if (hasAbstract && !abstract.empty()) { // The second test is probably superfluous.
+               string tag = paragraphs[bpitAbstract].layout().docbookforceabstracttag();
+               if (tag == "NONE")
+                       tag = "abstract";
 
-                       xs << xml::StartTag(tag);
-                       xs << xml::CR();
-                       xs << XMLStream::ESCAPE_NONE << os2.str();
-                       xs << xml::EndTag(tag);
-                       xs << xml::CR();
-               }
+               xs << xml::StartTag(tag);
+               xs << xml::CR();
+               xs << XMLStream::ESCAPE_NONE << abstract;
+               xs << xml::EndTag(tag);
+               xs << xml::CR();
        }
 
        // End the <info> tag if it was started.