]> 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 fa2b9a3226dd28f30eded87ecdf5958a5903760a..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>
@@ -343,9 +345,10 @@ ParagraphList::const_iterator makeParagraphBibliography(
                // Don't forget the citation ID!
                docstring attr;
                for (auto i = 0; i < par->size(); ++i) {
-                       if (par->getInset(0)->lyxCode() == BIBITEM_CODE) {
+                       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;
                        }
                }
@@ -418,7 +421,7 @@ ParagraphList::const_iterator makeParagraphs(
                        Inset const * firstInset = par->getInset(0);
 
                        // Floats cannot be in paragraphs.
-                       special_case = to_ascii(firstInset->layoutName()).substr(0, 6) == "Float:";
+                       special_case = to_utf8(firstInset->layoutName()).substr(0, 6) == "Float:";
 
                        // Bibliographies cannot be in paragraphs.
                        if (!special_case && firstInset->asInsetCommand())
@@ -452,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);
 
@@ -848,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.
@@ -862,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.