#include "insets/InsetBibtex.h"
#include "insets/InsetBibitem.h"
#include "insets/InsetLabel.h"
+#include "mathed/InsetMath.h"
#include "insets/InsetNote.h"
#include "support/lassert.h"
+#include "support/textutils.h"
#include <stack>
#include <iostream>
const string & tag = lay.docbooktag();
if (tag != "NONE") {
auto xmltag = xml::ParTag(tag, lay.docbookattr());
- if (!xs.isTagOpen(xmltag, 1)) // Don't nest a paragraph directly in a paragraph.
+ if (!xs.isTagOpen(xmltag, 1)) { // Don't nest a paragraph directly in a paragraph.
// TODO: required or not?
// TODO: avoid creating a ParTag object just for this query...
openTag(xs, lay.docbooktag(), lay.docbookattr(), lay.docbooktagtype());
+ openTag(xs, lay.docbookinnertag(), lay.docbookinnerattr(), lay.docbookinnertagtype());
+ }
}
openTag(xs, lay.docbookitemtag(), lay.docbookitemattr(), lay.docbookitemtagtype());
// Main logic.
closeTag(xs, lay.docbookiteminnertag(), lay.docbookiteminnertagtype());
closeTag(xs, lay.docbookitemtag(), lay.docbookitemtagtype());
+ closeTag(xs, lay.docbookinnertag(), lay.docbookinnertagtype());
closeTag(xs, lay.docbooktag(), lay.docbooktagtype());
if (closeWrapper)
closeTag(xs, lay.docbookwrappertag(), lay.docbookwrappertagtype());
// 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 <inlineequation> 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) {
- return inset.inset && inset.inset->asInsetMath();
+ return inset.inset && inset.inset->asInsetMath() && inset.inset->asInsetMath()->getType() != hullSimple;
+ });
+ // 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;
+ });
+ // 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;
+ });
+ // 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;
+ });
+ // 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;
+ });
+ // 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;
+ });
+ // 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;
});
-
- // TODO: Could get rid of this with a DocBook equivalent to htmlisblock? Not for all cases, unfortunately... See above for those that have been determined not to be allowable for this potential refactoring.
- if (!special_case && par->size() == 1 && par->getInset(0)) {
- Inset const * firstInset = par->getInset(0);
-
- // Floats cannot be in paragraphs.
- special_case = to_utf8(firstInset->layoutName()).substr(0, 6) == "Float:";
-
- // Bibliographies cannot be in paragraphs.
- if (!special_case && firstInset->asInsetCommand())
- special_case = firstInset->asInsetCommand()->params().getCmdName() == "bibtex";
-
- // ERTs are in comments, not paragraphs.
- if (!special_case && firstInset->lyxCode() == lyx::ERT_CODE)
- special_case = true;
-
- // Listings should not get into their own paragraph.
- if (!special_case && firstInset->lyxCode() == lyx::LISTINGS_CODE)
- special_case = true;
-
- // Boxes cannot get into their own paragraph.
- if (!special_case && firstInset->lyxCode() == lyx::BOX_CODE)
- special_case = true;
- }
bool const open_par = runparams.docbook_make_pars
&& !runparams.docbook_in_par
// even though they must be properly output if there is some abstract.
abstract = os2.str();
docstring cleaned = abstract;
- cleaned.erase(std::remove_if(cleaned.begin(), cleaned.end(), ::isspace), cleaned.end());
+ cleaned.erase(std::remove_if(cleaned.begin(), cleaned.end(), lyx::isSpace), cleaned.end());
// Nothing? Then there is no abstract!
if (cleaned.empty())
for (auto pit : info.mustBeInInfo)
makeAny(text, buf, xs, runparams, paragraphs.iterator_at(pit));
+ // If there is no title, generate one (required for the document to be valid).
+ // This code is called for the main document, for table cells, etc., so be precise in this condition.
+ if (text.isMainText() && info.shouldBeInInfo.empty() && !runparams.inInclude) {
+ xs << xml::StartTag("title");
+ xs << "Untitled Document";
+ xs << xml::EndTag("title");
+ xs << xml::CR();
+ }
+
// Always output the abstract as the last item of the <info>, as it requires special treatment (especially if
// it contains several paragraphs that are empty).
if (hasAbstract) {