commit a8de4d32968886ee4265dffad013d474bdbafbf5
Author: Thibaut Cuvelier <[email protected]>
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;
--
lyx-cvs mailing list
[email protected]
http://lists.lyx.org/mailman/listinfo/lyx-cvs