[LyX/master] DocBook: clean the special-case code.

Thibaut Cuvelier tcuvelier at lyx.org
Sun Nov 29 21:24:16 UTC 2020


commit a8de4d32968886ee4265dffad013d474bdbafbf5
Author: Thibaut Cuvelier <tcuvelier at lyx.org>
Date:   Sat Nov 28 20:48:43 2020 +0100

    DocBook: clean the special-case code.
---
 src/output_docbook.cpp |   63 ++++++++++++++++--------------------------------
 1 files changed, 21 insertions(+), 42 deletions(-)

diff --git a/src/output_docbook.cpp b/src/output_docbook.cpp
index ec11481..d815abc 100644
--- a/src/output_docbook.cpp
+++ b/src/output_docbook.cpp
@@ -350,15 +350,6 @@ void makeParagraph(
 	size_t nInsets = std::distance(par->insetList().begin(), par->insetList().end());
 	auto parSize = (size_t) par->size();
 
-	// If this LyX code does not produce any output, it can be safely ignored in the following checks: if this thing
-	// is present in the paragraph, it has no impact on the definition of the special case (i.e. whether or not
-	// a <para> tag should be output).
-	auto isLyxCodeToIgnore = [](InsetCode x) { return x == TOC_CODE || x == NOTE_CODE; };
-
-	// TODO: if a paragraph *only* contains floats, listings, bibliographies, etc., should this be considered as a
-	//  special case? If so, the code could be largely simplifies (all the calls to all_of, basically) and optimised
-	//  at the compilation stage.
-
 	// Plain layouts must be ignored.
 	special_case |= buf.params().documentClass().isPlainLayout(par->layout()) && !runparams.docbook_force_pars;
 	// Equations do not deserve their own paragraph (DocBook allows them outside paragraphs).
@@ -366,40 +357,28 @@ void makeParagraph(
 	special_case |= nInsets == parSize && std::all_of(par->insetList().begin(), par->insetList().end(), [](InsetList::Element inset) {
 		return inset.inset && inset.inset->asInsetMath() && inset.inset->asInsetMath()->getType() != hullSimple;
 	});
-	// Tables do not deserve their own paragraphs (DocBook allows them outside paragraphs).
-	special_case |= nInsets == parSize && std::all_of(par->insetList().begin(), par->insetList().end(), [isLyxCodeToIgnore](InsetList::Element inset) {
-		return inset.inset->lyxCode() == TABULAR_CODE || isLyxCodeToIgnore(inset.inset->lyxCode());
-	});
-	// Floats cannot be in paragraphs.
-	special_case |= nInsets == parSize && std::all_of(par->insetList().begin(), par->insetList().end(), [isLyxCodeToIgnore](InsetList::Element inset) {
-		return inset.inset->lyxCode() == FLOAT_CODE || isLyxCodeToIgnore(inset.inset->lyxCode());
-	});
-	// Bibliographies cannot be in paragraphs. Bibitems should still be handled as paragraphs, though
-	// (see makeParagraphBibliography).
-	special_case |= nInsets == parSize && std::all_of(par->insetList().begin(), par->insetList().end(), [isLyxCodeToIgnore](InsetList::Element inset) {
-		return inset.inset->lyxCode() == BIBTEX_CODE || isLyxCodeToIgnore(inset.inset->lyxCode());
-	});
-	// ERTs are in comments, not paragraphs.
-	special_case |= nInsets == parSize && std::all_of(par->insetList().begin(), par->insetList().end(), [isLyxCodeToIgnore](InsetList::Element inset) {
-		return inset.inset->lyxCode() == ERT_CODE || isLyxCodeToIgnore(inset.inset->lyxCode());
-	});
-	// Listings should not get into their own paragraph.
-	special_case |= nInsets == parSize && std::all_of(par->insetList().begin(), par->insetList().end(), [isLyxCodeToIgnore](InsetList::Element inset) {
-		return inset.inset->lyxCode() == LISTINGS_CODE || isLyxCodeToIgnore(inset.inset->lyxCode());
-	});
-	// Boxes cannot get into their own paragraph.
-	special_case |= nInsets == parSize && std::all_of(par->insetList().begin(), par->insetList().end(), [isLyxCodeToIgnore](InsetList::Element inset) {
-		return inset.inset->lyxCode() == BOX_CODE || isLyxCodeToIgnore(inset.inset->lyxCode());
-	});
-	// Includes should not have a paragraph.
-	special_case |= nInsets == parSize && std::all_of(par->insetList().begin(), par->insetList().end(), [isLyxCodeToIgnore](InsetList::Element inset) {
-		return inset.inset->lyxCode() == INCLUDE_CODE || isLyxCodeToIgnore(inset.inset->lyxCode());
-	});
-	// Glossaries should not have a paragraph.
-	special_case |= nInsets == parSize && std::all_of(par->insetList().begin(), par->insetList().end(), [isLyxCodeToIgnore](InsetList::Element inset) {
-		return inset.inset->lyxCode() == NOMENCL_PRINT_CODE || isLyxCodeToIgnore(inset.inset->lyxCode());
-	});
 
+	// Things that should not get into their own paragraph. (Only valid for DocBook.)
+	static std::set<InsetCode> lyxCodeSpecialCases = {
+			TABULAR_CODE,
+			FLOAT_CODE,
+			BIBTEX_CODE, // Bibliographies cannot be in paragraphs. Bibitems should still be handled as paragraphs,
+			// though (see makeParagraphBibliography).
+			ERT_CODE, // ERTs are in comments, not paragraphs.
+			LISTINGS_CODE,
+			BOX_CODE,
+			INCLUDE_CODE,
+			NOMENCL_PRINT_CODE,
+			TOC_CODE, // To be ignored in DocBook, the processor afterwards should deal with ToCs.
+			NOTE_CODE // Notes do not produce any output.
+	};
+	auto isLyxCodeSpecialCase = [](InsetList::Element inset) {
+		return lyxCodeSpecialCases.find(inset.inset->lyxCode()) != lyxCodeSpecialCases.end();
+	};
+	special_case |= nInsets == parSize && std::all_of(par->insetList().begin(), par->insetList().end(), isLyxCodeSpecialCase);
+
+	// Open a paragraph if it is allowed, we are not already within a paragraph, and the insets in the paragraph do
+	// not forbid paragraphs (aka special cases).
 	bool const open_par = runparams.docbook_make_pars
 						  && !runparams.docbook_in_par
 						  && !special_case;


More information about the lyx-cvs mailing list