[LyX/master] DocBook: implement InsetBox titles.

Thibaut Cuvelier tcuvelier at lyx.org
Sat Sep 19 18:18:56 UTC 2020


commit 50f011e062646fbc7354ee4be938dd376769900d
Author: Thibaut Cuvelier <tcuvelier at lyx.org>
Date:   Sat Sep 12 01:52:58 2020 +0200

    DocBook: implement InsetBox titles.
---
 autotests/export/docbook/A0_Poster_Simple.lyx |  192 +++++++++++++++++++++++++
 autotests/export/docbook/A0_Poster_Simple.xml |   16 ++
 src/insets/InsetBox.cpp                       |   17 ++-
 src/output_docbook.cpp                        |   66 ++++-----
 src/output_docbook.h                          |   24 ++--
 5 files changed, 269 insertions(+), 46 deletions(-)

diff --git a/autotests/export/docbook/A0_Poster_Simple.lyx b/autotests/export/docbook/A0_Poster_Simple.lyx
new file mode 100644
index 0000000..998f210
--- /dev/null
+++ b/autotests/export/docbook/A0_Poster_Simple.lyx
@@ -0,0 +1,192 @@
+#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 a0poster
+\begin_preamble
+% Adjust padding in boxes
+\setlength\fboxsep{12pt}
+% Added by lyx2lyx
+\setlength{\parskip}{\bigskipamount}
+\setlength{\parindent}{0pt}
+\end_preamble
+\options a0,portrait
+\use_default_options false
+\maintain_unincluded_children no
+\language english
+\language_package default
+\inputencoding utf8
+\fontencoding auto
+\font_roman "palatino" "default"
+\font_sans "default" "default"
+\font_typewriter "courier" "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 true
+\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
+\leftmargin 1cm
+\topmargin 1cm
+\rightmargin 1cm
+\bottommargin 1cm
+\secnumdepth 0
+\tocdepth 0
+\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 empty
+\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 Standard
+\align center
+\begin_inset Box Shadowbox
+position "c"
+hor_pos "c"
+has_inner_box 1
+inner_pos "c"
+use_parbox 1
+use_makebox 0
+width "98col%"
+special "none"
+height "5cm"
+height_special "none"
+thickness "0.4pt"
+separation "3pt"
+shadowsize "4pt"
+framecolor "black"
+backgroundcolor "none"
+status open
+
+\begin_layout Plain Layout
+\noindent
+\align center
+
+\series bold
+\noun on
+\begin_inset Flex Most Giant Snippet
+status open
+
+\begin_layout Plain Layout
+\noindent
+
+\series bold
+\noun on
+Poster Heading
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\begin_layout Standard
+\begin_inset Box Boxed
+position "t"
+hor_pos "c"
+has_inner_box 1
+inner_pos "t"
+use_parbox 0
+use_makebox 0
+width "98col%"
+special "none"
+height "1in"
+height_special "totalheight"
+thickness "0.4pt"
+separation "3pt"
+shadowsize "4pt"
+framecolor "black"
+backgroundcolor "none"
+status open
+
+\begin_layout Section
+Summary
+\end_layout
+
+\begin_layout Itemize
+For multiple columns, use the 
+\begin_inset Quotes eld
+\end_inset
+
+Multiple Columns
+\begin_inset Quotes erd
+\end_inset
+
+ module as documented in 
+\family sans
+Help\SpecialChar menuseparator
+Additional Features
+\family default
+.
+\end_layout
+
+\end_inset
+
+
+\end_layout
+
+\end_body
+\end_document
diff --git a/autotests/export/docbook/A0_Poster_Simple.xml b/autotests/export/docbook/A0_Poster_Simple.xml
new file mode 100644
index 0000000..3594ffd
--- /dev/null
+++ b/autotests/export/docbook/A0_Poster_Simple.xml
@@ -0,0 +1,16 @@
+<?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">
+<sidebar role='shadowbox'>
+Poster Heading
+</sidebar>
+<sidebar role='boxed'>
+<title>Summary</title>
+<itemizedlist>
+<listitem>
+<para>For multiple columns, use the “Multiple Columns” module as documented in <emphasis role='sans'>Help&#x21D2;Additional Features</emphasis>.</para>
+</listitem>
+</itemizedlist>
+</sidebar>
+</article>
\ No newline at end of file
diff --git a/src/insets/InsetBox.cpp b/src/insets/InsetBox.cpp
index db76f53..d714cf7 100644
--- a/src/insets/InsetBox.cpp
+++ b/src/insets/InsetBox.cpp
@@ -26,6 +26,7 @@
 #include "LaTeXFeatures.h"
 #include "Lexer.h"
 #include "MetricsInfo.h"
+#include "output_docbook.h"
 #include "output_xhtml.h"
 #include "TexRow.h"
 #include "texstream.h"
@@ -727,7 +728,21 @@ void InsetBox::docbook(XMLStream & xs, OutputParams const & runparams) const
 		LYXERR0("Assertion failed: box layout " + getLayout().name() + " missing DocBookWrapperTag.");
 	}
 
-	InsetText::docbook(xs, runparams);
+	// If the box starts with a sectioning item, use as box title.
+	auto current_par = paragraphs().begin();
+	if (current_par->layout().category() == from_utf8("Sectioning")) {
+		// Only generate the first paragraph.
+		current_par = makeAny(text(), buffer(), xs, runparams, paragraphs().begin());
+	}
+
+	xs.startDivision(false);
+	// Don't call InsetText::docbook, as this would generate all paragraphs in the inset, not the ones we are
+	// interested in. The best solution would be to call docbookParagraphs with an updated OutputParams object to only
+	// generate paragraphs after the title, but it leads to strange crashes, as if text().paragraphs() then returns
+	// a smaller set of paragrphs.
+	while (current_par != paragraphs().end())
+		current_par = makeAny(text(), buffer(), xs, runparams, current_par);
+	xs.endDivision();
 
 	if (!getLayout().docbookwrappertag().empty()) {
 		if (!xs.isLastTagCR())
diff --git a/src/output_docbook.cpp b/src/output_docbook.cpp
index ee829e5..c8ddc1a 100644
--- a/src/output_docbook.cpp
+++ b/src/output_docbook.cpp
@@ -16,6 +16,7 @@
 #include "BufferParams.h"
 #include "Font.h"
 #include "InsetList.h"
+#include "output_docbook.h"
 #include "Paragraph.h"
 #include "ParagraphList.h"
 #include "ParagraphParameters.h"
@@ -347,13 +348,6 @@ void closeParTag(XMLStream & xs, Paragraph const * par, Paragraph const * nextpa
 }
 
 
-ParagraphList::const_iterator makeAny(Text const &,
-		                              Buffer const &,
-		                              XMLStream &,
-		                              OutputParams const &,
-		                              ParagraphList::const_iterator);
-
-
 void makeBibliography(
 		Text const & text,
 		Buffer const & buf,
@@ -714,35 +708,6 @@ void makeCommand(
 }
 
 
-ParagraphList::const_iterator makeAny(Text const &text,
-		                              Buffer const &buf,
-		                              XMLStream &xs,
-		                              OutputParams const &runparams,
-		                              ParagraphList::const_iterator par)
-{
-	switch (par->layout().latextype) {
-	case LATEX_COMMAND:
-		makeCommand(text, buf, xs, runparams, par);
-		break;
-	case LATEX_ENVIRONMENT:
-		makeEnvironment(text, buf, xs, runparams, par);
-		break;
-	case LATEX_LIST_ENVIRONMENT:
-	case LATEX_ITEM_ENVIRONMENT:
-		// Only case when makeAny() might consume more than one paragraph.
-		return makeListEnvironment(text, buf, xs, runparams, par);
-	case LATEX_PARAGRAPH:
-		makeParagraph(text, buf, xs, runparams, par);
-		break;
-	case LATEX_BIB_ENVIRONMENT:
-		makeBibliography(text, buf, xs, runparams, par);
-		break;
-	}
-	++par;
-	return par;
-}
-
-
 bool isLayoutSectioning(Layout const & lay)
 {
 	return lay.category() == from_utf8("Sectioning");
@@ -862,6 +827,35 @@ DocBookInfoTag getParagraphsWithInfo(ParagraphList const &paragraphs,
 } // end anonymous namespace
 
 
+ParagraphList::const_iterator makeAny(Text const &text,
+                                      Buffer const &buf,
+                                      XMLStream &xs,
+                                      OutputParams const &runparams,
+                                      ParagraphList::const_iterator par)
+{
+	switch (par->layout().latextype) {
+	case LATEX_COMMAND:
+		makeCommand(text, buf, xs, runparams, par);
+		break;
+	case LATEX_ENVIRONMENT:
+		makeEnvironment(text, buf, xs, runparams, par);
+		break;
+	case LATEX_LIST_ENVIRONMENT:
+	case LATEX_ITEM_ENVIRONMENT:
+		// Only case when makeAny() might consume more than one paragraph.
+		return makeListEnvironment(text, buf, xs, runparams, par);
+	case LATEX_PARAGRAPH:
+		makeParagraph(text, buf, xs, runparams, par);
+		break;
+	case LATEX_BIB_ENVIRONMENT:
+		makeBibliography(text, buf, xs, runparams, par);
+		break;
+	}
+	++par;
+	return par;
+}
+
+
 xml::FontTag docbookStartFontTag(xml::FontTypes type)
 {
 	return xml::FontTag(from_utf8(fontToDocBookTag(type)), from_utf8(fontToAttribute(type)), type);
diff --git a/src/output_docbook.h b/src/output_docbook.h
index 4dcc853..401018d 100644
--- a/src/output_docbook.h
+++ b/src/output_docbook.h
@@ -16,6 +16,7 @@
 #define OUTPUT_DOCBOOK_H
 
 #include "LayoutEnums.h"
+#include "ParagraphList.h"
 
 #include "support/docstream.h"
 #include "support/strfwd.h"
@@ -27,18 +28,23 @@ class Buffer;
 class OutputParams;
 class Text;
 
-///
-std::string const fontToDocBookTag(xml::FontTypes type);
-///
+/// generates an xml::StartTag for the given style
 xml::FontTag docbookStartFontTag(xml::FontTypes type);
-///
+/// generates an xml::EndTag for the given style
 xml::EndFontTag docbookEndFontTag(xml::FontTypes type);
 
-///
-void docbookParagraphs(Text const & text,
-		               Buffer const & buf,
-                       XMLStream & os,
-		               OutputParams const & runparams);
+/// output a series of paragraphs into the XMLStream
+void docbookParagraphs(Text const &,
+		               Buffer const &,
+                       XMLStream &,
+		               OutputParams const &);
+
+/// output a single paragraph into the XMLStream
+ParagraphList::const_iterator makeAny(Text const &,
+                                      Buffer const &,
+                                      XMLStream &,
+                                      OutputParams const &,
+                                      ParagraphList::const_iterator);
 
 } // namespace lyx
 


More information about the lyx-cvs mailing list