#include "LaTeXFeatures.h"
#include "Lexer.h"
#include "MetricsInfo.h"
+#include "output_docbook.h"
#include "output_xhtml.h"
#include "TexRow.h"
#include "texstream.h"
#include "support/debug.h"
#include "support/docstream.h"
+#include "support/FileName.h"
#include "support/gettext.h"
#include "support/lstrings.h"
#include "support/Translator.h"
if (hasFixedWidth())
mi.base.textwidth = mi.base.inPixels(params_.width);
InsetCollapsible::metrics(mi, dim);
- // retore textwidth.
+ // restore textwidth.
mi.base.textwidth = textwidth_backup;
}
return getLayout().bgcolor();
if (params_.type == "Shaded") {
- // FIXME: This hardcoded color is a hack!
- if (buffer().params().boxbgcolor == lyx::rgbFromHexName("#ff0000"))
+ if (!buffer().params().isboxbgcolor)
return getLayout().bgcolor();
- ColorCode c = lcolor.getFromLyXName("boxbgcolor");
+ ColorCode c = lcolor.getFromLyXName("boxbgcolor@" + buffer().fileName().absFileName());
if (c == Color_none)
return getLayout().bgcolor();
return c;
cur.recordUndoInset(this);
if (change_type) {
params_.type = cmd.getArg(1);
- // set a makebox if there is no inner box but Frameless was exectued
+ // set a makebox if there is no inner box but Frameless was executed
// otherwise the result would be a non existent box (no inner AND outer box)
// (this was LyX bug 8712)
if (params_.type == "Frameless" && !params_.inner_box) {
}
-int InsetBox::docbook(odocstream & os, OutputParams const & runparams) const
+void InsetBox::docbook(XMLStream & xs, OutputParams const & runparams) const
{
- return InsetText::docbook(os, runparams);
+ // There really should be a wrapper tag for this layout.
+ bool hasBoxTag = !getLayout().docbookwrappertag().empty();
+ if (!hasBoxTag)
+ LYXERR0("Assertion failed: box layout " + getLayout().name() + " missing DocBookWrapperTag.");
+
+ // Avoid nesting boxes in DocBook, it's not allowed. Only make the check for <sidebar> to avoid destroying
+ // tags if this is not the wrapper tag for this layout (unlikely).
+ bool isAlreadyInBox = hasBoxTag && xs.isTagOpen(xml::StartTag(getLayout().docbookwrappertag()));
+
+ bool outputBoxTag = hasBoxTag && !isAlreadyInBox;
+
+ // Generate the box tag (typically, <sidebar>).
+ if (outputBoxTag) {
+ if (!xs.isLastTagCR())
+ xs << xml::CR();
+
+ xs << xml::StartTag(getLayout().docbookwrappertag(), getLayout().docbookwrapperattr());
+ xs << xml::CR();
+ }
+
+ // 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());
+ }
+
+ // 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.
+ // Elements in the box must keep their paragraphs.
+ auto rp = runparams;
+ rp.docbook_in_par = false;
+ rp.docbook_force_pars = true;
+
+ xs.startDivision(false);
+ while (current_par != paragraphs().end())
+ current_par = makeAny(text(), buffer(), xs, rp, current_par);
+ xs.endDivision();
+
+ // Close the box.
+ if (outputBoxTag) {
+ if (!xs.isLastTagCR())
+ xs << xml::CR();
+
+ xs << xml::EndTag(getLayout().docbookwrappertag());
+ xs << xml::CR();
+ }
}
-docstring InsetBox::xhtml(XHTMLStream & xs, OutputParams const & runparams) const
+docstring InsetBox::xhtml(XMLStream & xs, OutputParams const & runparams) const
{
// construct attributes
string attrs = "class='" + params_.type + "'";
if (!style.empty())
attrs += " style='" + style + "'";
- xs << html::StartTag("div", attrs);
+ xs << xml::StartTag("div", attrs);
XHTMLOptions const opts = InsetText::WriteLabel | InsetText::WriteInnerTag;
docstring defer = InsetText::insetAsXHTML(xs, runparams, opts);
- xs << html::EndTag("div");
+ xs << xml::EndTag("div");
xs << defer;
return docstring();
}