From dc94abf039852ebb4ef7060fbfd52bdfd715f470 Mon Sep 17 00:00:00 2001 From: Thibaut Cuvelier Date: Sun, 15 Nov 2020 19:04:21 +0100 Subject: [PATCH] DocBook: specific fix for Localization_Test.lyx. In one paragraph, there was both a float and a list of floats in a paragraph: the list of floats has no DocBook output, so that there should be no surrounding . --- .../export/docbook/Localization_Test.lyx | 220 ++++++++++++++++++ .../export/docbook/Localization_Test.xml | 30 +++ src/output_docbook.cpp | 43 ++-- 3 files changed, 276 insertions(+), 17 deletions(-) create mode 100644 autotests/export/docbook/Localization_Test.lyx create mode 100644 autotests/export/docbook/Localization_Test.xml diff --git a/autotests/export/docbook/Localization_Test.lyx b/autotests/export/docbook/Localization_Test.lyx new file mode 100644 index 0000000000..c2100206be --- /dev/null +++ b/autotests/export/docbook/Localization_Test.lyx @@ -0,0 +1,220 @@ +#LyX 2.4 created this file. For more info see https://www.lyx.org/ +\lyxformat 599 +\begin_document +\begin_header +\save_transient_properties true +\origin unavailable +\textclass article +\use_default_options false +\begin_modules +theorems-ams +theorems-ams-extended +linguistics +\end_modules +\maintain_unincluded_children no +\language english +\language_package default +\inputencoding utf8 +\fontencoding auto +\font_roman "lmodern" "default" +\font_sans "default" "default" +\font_typewriter "default" "default" +\font_math "auto" "auto" +\font_default_family default +\use_non_tex_fonts false +\font_sc false +\font_roman_osf false +\font_sans_osf false +\font_typewriter_osf false +\font_sf_scale 100 100 +\font_tt_scale 100 100 +\use_microtype false +\use_dash_ligatures false +\graphics default +\default_output_format default +\output_sync 0 +\bibtex_command default +\index_command default +\paperfontsize default +\spacing single +\use_hyperref false +\papersize default +\use_geometry false +\use_package amsmath 1 +\use_package amssymb 1 +\use_package cancel 1 +\use_package esint 1 +\use_package mathdots 1 +\use_package mathtools 1 +\use_package mhchem 1 +\use_package stackrel 1 +\use_package stmaryrd 1 +\use_package undertilde 1 +\cite_engine basic +\cite_engine_type default +\biblio_style plain +\use_bibtopic false +\use_indices false +\paperorientation portrait +\suppress_date false +\justification true +\use_refstyle 0 +\use_minted 0 +\use_lineno 0 +\index Index +\shortcut idx +\color #008000 +\end_index +\secnumdepth 3 +\tocdepth 3 +\paragraph_separation indent +\paragraph_indentation default +\is_math_indent 0 +\math_numbering_side default +\quotes_style english +\dynamic_quotes 0 +\papercolumns 1 +\papersides 1 +\paperpagestyle default +\tablestyle default +\tracking_changes false +\output_changes false +\change_bars false +\postpone_fragile_content false +\html_math_output 0 +\html_css_as_file 0 +\html_be_strict false +\docbook_table_output 0 +\end_header + +\begin_body + +\begin_layout Title +\SpecialChar LyX + localization test +\end_layout + +\begin_layout Section +Test of insets and listings +\end_layout + +\begin_layout Standard +\begin_inset Float algorithm +placement H +alignment document +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +hhh +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset FloatList algorithm + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset Float tableau +placement H +alignment document +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset Caption Standard + +\begin_layout Plain Layout +fggf +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset FloatList tableau + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset listings +lstparams "float,language={C++}" +inline false +status open + +\begin_layout Plain Layout + +\begin_inset Caption Standard + +\begin_layout Plain Layout +ccc +\end_layout + +\end_inset + +while(true); +\end_layout + +\end_inset + + +\begin_inset CommandInset toc +LatexCommand lstlistoflistings + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset nomenclature +LatexCommand nomenclature +symbol "x" +description "dfadsf13" +literal "false" + +\end_inset + + +\end_layout + +\begin_layout Standard +\begin_inset CommandInset nomencl_print +LatexCommand printnomenclature +set_width "auto" + +\end_inset + + +\end_layout + +\end_body +\end_document diff --git a/autotests/export/docbook/Localization_Test.xml b/autotests/export/docbook/Localization_Test.xml new file mode 100644 index 0000000000..9342dd9c52 --- /dev/null +++ b/autotests/export/docbook/Localization_Test.xml @@ -0,0 +1,30 @@ + + +
+LyX localization test +
+Test of insets and listings +
+hhh +
+ + +
fggf
+
+ccc +while(true); +
+ +x + +Nomenclature + +x + +dfadsf13 + + + +
+
\ No newline at end of file diff --git a/src/output_docbook.cpp b/src/output_docbook.cpp index b43d2b0b58..ae65aedbe5 100644 --- a/src/output_docbook.cpp +++ b/src/output_docbook.cpp @@ -450,46 +450,55 @@ void makeParagraph( } size_t nInsets = std::distance(par->insetList().begin(), par->insetList().end()); + auto parSize = (size_t) par->size(); + + auto isLyxCodeToIgnore = [](InsetCode x) { return x == TOC_CODE; }; // 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 tag should be output). + + // 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). // Exception: any case that generates an must still get a paragraph to be valid. - special_case |= nInsets == (size_t) par->size() && std::all_of(par->insetList().begin(), par->insetList().end(), [](InsetList::Element inset) { + 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 == (size_t) par->size() && std::all_of(par->insetList().begin(), par->insetList().end(), [](InsetList::Element inset) { - return inset.inset->lyxCode() == TABULAR_CODE; + 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 == (size_t) par->size() && std::all_of(par->insetList().begin(), par->insetList().end(), [](InsetList::Element inset) { - return inset.inset->lyxCode() == FLOAT_CODE; + 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 == (size_t) par->size() && std::all_of(par->insetList().begin(), par->insetList().end(), [](InsetList::Element inset) { - return inset.inset->lyxCode() == BIBTEX_CODE; + 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 == (size_t) par->size() && std::all_of(par->insetList().begin(), par->insetList().end(), [](InsetList::Element inset) { - return inset.inset->lyxCode() == ERT_CODE; + 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 == (size_t) par->size() && std::all_of(par->insetList().begin(), par->insetList().end(), [](InsetList::Element inset) { - return inset.inset->lyxCode() == LISTINGS_CODE; + 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 == (size_t) par->size() && std::all_of(par->insetList().begin(), par->insetList().end(), [](InsetList::Element inset) { - return inset.inset->lyxCode() == BOX_CODE; + 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 == (size_t) par->size() && std::all_of(par->insetList().begin(), par->insetList().end(), [](InsetList::Element inset) { - return inset.inset->lyxCode() == INCLUDE_CODE; + 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 == (size_t) par->size() && std::all_of(par->insetList().begin(), par->insetList().end(), [](InsetList::Element inset) { - return inset.inset->lyxCode() == NOMENCL_PRINT_CODE; + 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()); }); bool const open_par = runparams.docbook_make_pars