commit acdead04878a4eb43b4f40f407922180a07ec3a1
Author: Thibaut Cuvelier <[email protected]>
Date:   Fri Jul 31 01:20:08 2020 +0200

    DocBook: better condition for abstracts.
---
 src/output_docbook.cpp |   53 +++++++++++++++++++++++++++++------------------
 1 files changed, 33 insertions(+), 20 deletions(-)

diff --git a/src/output_docbook.cpp b/src/output_docbook.cpp
index c5519de..b37cc7a 100644
--- a/src/output_docbook.cpp
+++ b/src/output_docbook.cpp
@@ -36,6 +36,8 @@
 #include "support/lstrings.h"
 #include "support/textutils.h"
 
+#include "support/regex.h"
+
 #include <stack>
 #include <iostream>
 #include <algorithm>
@@ -849,8 +851,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 +886,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.
-- 
lyx-cvs mailing list
[email protected]
http://lists.lyx.org/mailman/listinfo/lyx-cvs

Reply via email to