DocBook: fix issues with nested labeling lists.

This commit is contained in:
Thibaut Cuvelier 2020-07-26 04:44:04 +02:00
parent 88e00a0b7b
commit e0b8bac36e
6 changed files with 243 additions and 19 deletions

View File

@ -50,6 +50,7 @@
</varlistentry>
</variablelist>
</listitem>
</varlistentry>
<varlistentry>
<term>New&#xA0;inset</term>
@ -71,9 +72,7 @@
<para> If a style or inset layout is removed in any layout file or module shipped with LyX, a new file format is required.</para>
</listitem>
</varlistentry>
<!-- Output Error: Closing tag `variablelist' when other tags are open, namely: -->
<!-- Output Error: varlistentry -->
</varlistentry></variablelist>
</variablelist>
<para>However, <emphasis role='bold'>new</emphasis> layouts and modules do <emphasis role='bold'>not</emphasis> require a file format update (changed 03/16). </para>
<para>If you are still unsure, please ask on the development list.</para>
<section xml:id="par.export-test-output-formats-1">
@ -109,6 +108,7 @@
</varlistentry>
</variablelist>
</listitem>
</varlistentry>
<varlistentry>
<term>LyX&#xA0;+&#xA0;LaTeX:</term>
@ -173,6 +173,7 @@
</varlistentry>
</variablelist>
</listitem>
</varlistentry>
<varlistentry>
<term>LyX&#xA0;+&#xA0;LaTeX&#xA0;+&#xA0;postprocessing:</term>
@ -195,6 +196,7 @@
</varlistentry>
</variablelist>
</listitem>
</varlistentry>
<varlistentry>
<term>not&#xA0;tested:</term>
@ -303,9 +305,6 @@
</listitem>
<!-- Output Error: Closing tag `variablelist' when other tags are open, namely: -->
<!-- Output Error: varlistentry -->
</varlistentry><!-- Output Error: varlistentry -->
</varlistentry><!-- Output Error: varlistentry -->
</varlistentry><!-- Output Error: varlistentry -->
</varlistentry></variablelist>
</section>
</section>

View File

@ -25,8 +25,8 @@
</listitem>
</varlistentry>
</variablelist>
<!-- lastlay != nullptr; item tag: listitem; item wrapper tag: varlistentry --></listitem>
<!-- has docbookwrappertag --></varlistentry>
</listitem>
</varlistentry>
<varlistentry>
<term>New&#xA0;inset</term>

View File

@ -0,0 +1,150 @@
#LyX 2.4 created this file. For more info see https://www.lyx.org/
\lyxformat 598
\begin_document
\begin_header
\save_transient_properties true
\origin unavailable
\textclass scrartcl
\options BCOR8mm,captions=tableheading
\use_default_options false
\begin_modules
logicalmkup
\end_modules
\maintain_unincluded_children no
\language english
\language_package default
\inputencoding utf8
\fontencoding auto
\font_roman "lmodern" "default"
\font_sans "lmss" "default"
\font_typewriter "lmtt" "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 true
\graphics default
\default_output_format pdf2
\output_sync 1
\bibtex_command default
\index_command default
\paperfontsize 12
\spacing single
\use_hyperref true
\pdf_title "LyX's Development manual"
\pdf_author "LyX Team"
\pdf_subject "LyX's development documentation"
\pdf_keywords "LyX, Documentation, Development"
\pdf_bookmarks true
\pdf_bookmarksnumbered true
\pdf_bookmarksopen true
\pdf_bookmarksopenlevel 1
\pdf_breaklinks false
\pdf_pdfborder false
\pdf_colorlinks true
\pdf_backref false
\pdf_pdfusetitle false
\pdf_quoted_options "linkcolor=black, citecolor=black, urlcolor=blue, filecolor=blue, pdfpagelayout=OneColumn, pdfnewwindow=true, pdfstartview=XYZ, plainpages=false"
\papersize a4
\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
\notefontcolor #0000ff
\index Index
\shortcut idx
\color #008000
\end_index
\secnumdepth 4
\tocdepth 4
\paragraph_separation indent
\paragraph_indentation default
\is_math_indent 0
\math_numbering_side default
\quotes_style english
\dynamic_quotes 0
\papercolumns 1
\papersides 2
\paperpagestyle headings
\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 true
\docbook_table_output 0
\end_header
\begin_body
\begin_layout Title
Developing \SpecialChar LyX
\end_layout
\begin_layout Standard
The following output formats are currently tested for each sample document:
\end_layout
\begin_layout Labeling
\labelwidthstring 00.00.0000
LyX:
\end_layout
\begin_deeper
\begin_layout Labeling
\labelwidthstring 00.00.0000
lyx16 LyX 1.6 file format (lyx2lyx)
\end_layout
\begin_layout Labeling
\labelwidthstring 00.00.0000
lyx21
\end_layout
\end_deeper
\begin_layout Labeling
\labelwidthstring 00.00.0000
LyX:
\end_layout
\begin_deeper
\begin_layout Labeling
\labelwidthstring 00.00.0000
lyx16 LyX 1.6 file format (lyx2lyx)
\end_layout
\begin_layout Labeling
\labelwidthstring 00.00.0000
lyx21
\end_layout
\end_deeper
\end_body
\end_document

View File

@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- This DocBook file was created by LyX 2.4.0dev
See http://www.lyx.org/ for more information -->
<article xml:lang="en_US" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:xi="http://www.w3.org/2001/XInclude" version="5.2">
<title>Developing LyX</title>
<para>The following output formats are currently tested for each sample document:</para>
<variablelist>
<varlistentry>
<term>LyX:</term>
<listitem>
<variablelist>
<varlistentry>
<term>lyx16</term>
<listitem>
<para> LyX 1.6 file format (lyx2lyx)</para>
</listitem>
</varlistentry>
<varlistentry>
<term>lyx21</term>
<listitem>
<para> </para>
</listitem>
</varlistentry>
</variablelist>
</listitem>
</varlistentry>
<varlistentry>
<term>LyX:</term>
<listitem>
<variablelist>
<varlistentry>
<term>lyx16</term>
<listitem>
<para> LyX 1.6 file format (lyx2lyx)</para>
</listitem>
</varlistentry>
<varlistentry>
<term>lyx21</term>
<listitem>
<para> </para>
</listitem>
</varlistentry>
</variablelist>
</listitem>
</varlistentry>
</variablelist>
</article>

View File

@ -30,4 +30,5 @@
<para>Text after second item</para>
</listitem>
</itemizedlist>
</article>

View File

@ -508,10 +508,8 @@ ParagraphList::const_iterator makeEnvironment(
if (par->params().depth() == origdepth) {
LATTEST(bstyle == style);
if (lastlay != nullptr) {
xs << XMLStream::ESCAPE_NONE << ("<!-- lastlay != nullptr; item tag: " + from_utf8(lastlay->docbookitemtag()) + "; item wrapper tag: " + from_utf8(lastlay->docbookitemwrappertag()) + " -->");
closeItemTag(xs, *lastlay);
if (lastlay->docbookitemwrappertag() != "NONE") {
xs << XMLStream::ESCAPE_NONE << "<!-- has docbookwrappertag -->";
xs << xml::EndTag(lastlay->docbookitemwrappertag());
xs << xml::CR();
}
@ -561,13 +559,35 @@ ParagraphList::const_iterator makeEnvironment(
}
} // end label output
// Start generating the item.
bool wasInParagraph = runparams.docbook_in_par;
openItemTag(xs, style);
bool getsIntoParagraph = openInnerItemTag(xs, style);
OutputParams rp = runparams;
rp.docbook_in_par = wasInParagraph | getsIntoParagraph;
par->simpleDocBookOnePar(buf, xs, rp, text.outerFont(distance(begin, par)), true, true, sep);
// Maybe the item is completely empty, i.e. if the first word ends at the end of the current paragraph
// AND if the next paragraph doesn't have the same depth (if there is such a paragraph).
// Common case: there is only the first word on the line, but there is a nested list instead.
bool emptyItem = false;
if (sep == par->size()) {
auto next_par = par;
++next_par;
if (next_par == text.paragraphs().end()) // There is no next paragraph.
emptyItem = true;
else // There is a next paragraph: check depth.
emptyItem = par->params().depth() > next_par->params().depth();
}
if (emptyItem) {
// Avoid having an empty item, this is not valid DocBook. A single character is enough to force
// generation of a full <para>.
xs << ' ';
} else {
// Generate the rest of the paragraph, if need be.
par->simpleDocBookOnePar(buf, xs, rp, text.outerFont(distance(begin, par)), true, true, sep);
}
++par;
if (getsIntoParagraph)
closeInnerItemTag(xs, style);
@ -613,8 +633,13 @@ ParagraphList::const_iterator makeEnvironment(
}
}
if (lastlay != 0)
if (lastlay != nullptr) {
closeItemTag(xs, *lastlay);
if (lastlay->docbookitemwrappertag() != "NONE") {
xs << xml::EndTag(lastlay->docbookitemwrappertag());
xs << xml::CR();
}
}
closeTag(xs, bstyle);
xs << xml::CR();
return pend;
@ -731,10 +756,6 @@ DocBookInfoTag getParagraphsWithInfo(ParagraphList const &paragraphs, pit_type c
// Based on layout information, store this paragraph in one set: should be in <info>, must be.
Layout const &style = par.layout();
std::cout << "Name: " << to_utf8(style.name()) << std::endl;
std::cout << " DocBook tag: " << style.docbooktag() << std::endl;
std::cout << " In info: " << style.docbookininfo() << std::endl;
if (style.docbookininfo() == "always") {
mustBeInInfo.emplace(cpit);
} else if (style.docbookininfo() == "maybe") {
@ -796,14 +817,11 @@ pit_type generateDocBookParagraphWithoutSectioning(
(epit == (int) paragraphs.size()) ?
paragraphs.end() : paragraphs.iterator_at(epit);
std::cout << "generateDocBookParagraphWithoutSectioning" << std::endl;
while (bpit < epit) {
std::cout << "iteration; bpit: " << bpit << std::endl;
tie(par, send) = makeAny(text, buf, xs, runparams, par, send, pend);
bpit += distance(lastStartedPar, par);
lastStartedPar = par;
}
std::cout << "generateDocBookParagraphWithoutSectioning has looped; bpit: " << bpit << std::endl;
return bpit;
}