void docbookNoSubfigures(XMLStream & xs, OutputParams const & runparams, const InsetCaption * caption,
- const InsetLabel * label, Floating const & ftype, const InsetFloat * thisFloat)
-{
+ const InsetLabel * label, Floating const & ftype, const InsetFloat * thisFloat) {
// Ensure there is no label output, it is supposed to be handled as xml:id.
OutputParams rpNoLabel = runparams;
if (label)
rpNoTitle.docbook_in_table = true;
// Generate the contents of the float (to check for emptiness).
- odocstringstream os2;
- XMLStream xs2(os2);
- thisFloat->InsetText::docbook(xs2, rpNoTitle);
+ odocstringstream osFloatContent;
+ bool hasFloat = false;
+
+ if (thisFloat) {
+ XMLStream xsFloatContent(osFloatContent);
+ thisFloat->InsetText::docbook(xsFloatContent, rpNoTitle);
+ hasFloat = !osFloatContent.str().empty();
+ }
+
+ // Do the same for the caption.
+ odocstringstream osCaptionContent;
+ bool hasCaption = false;
+
+ if (caption != nullptr) {
+ XMLStream xsCaptionContent(osCaptionContent);
+ caption->getCaptionAsDocBook(xsCaptionContent, rpNoLabel);
+ hasCaption = !osCaptionContent.str().empty();
+ }
- // Organisation: <float> <title if any/> <contents without title/> </float>.
+ // Organisation: <float with xml:id if any> <title if any/> <contents without title nor xml:id/> </float>.
+ // Titles and xml:id are generated with specific insets and must be dealt with using OutputParams.
+
+ // - Generate the attributes for the float tag.
docstring attr = docstring();
if (label)
attr += "xml:id=\"" + xml::cleanID(label->screenLabel()) + "\"";
}
// - Open the float tag.
- xs << xml::StartTag(ftype.docbookTag(caption != nullptr), attr);
+ xs << xml::StartTag(ftype.docbookTag(hasCaption), attr);
xs << xml::CR();
// - Generate the caption.
- if (caption) {
+ if (hasCaption) {
string const &titleTag = ftype.docbookCaption();
xs << xml::StartTag(titleTag);
- caption->getCaptionAsDocBook(xs, rpNoLabel);
+ xs << XMLStream::ESCAPE_NONE << osCaptionContent.str();
xs << xml::EndTag(titleTag);
xs << xml::CR();
}
- // - Output the actual content of the float.
- if (!os2.str().empty())
- xs << XMLStream::ESCAPE_NONE << os2.str();
+ // - Output the actual content of the float or some dummy content (to ensure that the output
+ // document is valid).
+ if (hasFloat)
+ xs << XMLStream::ESCAPE_NONE << osFloatContent.str();
else if (ftype.docbookFloatType() == "table")
docbookGenerateFillerTable(xs, thisFloat->buffer().params().docbook_table_output);
else
docbookGenerateFillerMedia(xs);
// - Close the float.
- xs << xml::EndTag(ftype.docbookTag(caption != nullptr));
+ xs << xml::EndTag(ftype.docbookTag(hasCaption));
xs << xml::CR();
}
void InsetFloat::docbook(XMLStream & xs, OutputParams const & runparams) const
{
-// if (runparams.docbook_in_par) {
-// xs << xml::EndTag("para");
-// xs << xml::CR();
-// }
-
const InsetCaption* caption = getCaptionInset();
const InsetLabel* label = getLabelInset();
docbookSubfigures(xs, runparams, caption, label, subfigures);
else
docbookNoSubfigures(xs, runparams, caption, label, ftype, this);
-
-// if (runparams.docbook_in_par) {
-// xs << xml::CR();
-// xs << xml::StartTag("para");
-// }
}
void InsetFloat::setNewLabel()
{
- docstring lab = _("float: ");
+ docstring lab = _("Float: ");
if (params_.subfloat)
- lab = _("subfloat: ");
+ lab = _("Subfloat: ");
lab += floatName(params_.type);