]> git.lyx.org Git - features.git/blobdiff - src/output_docbook.cpp
Move include of own header to the top. Fix dependencies
[features.git] / src / output_docbook.cpp
index a8d509adb7723dc71c36de1bcc60ada97138ea42..63cae8a58bb69ae9b42ba0bf604cb8a4fa3110e1 100644 (file)
 
 #include <config.h>
 
+#include "output_docbook.h"
+
 #include "Buffer.h"
 #include "buffer_funcs.h"
 #include "BufferParams.h"
 #include "Font.h"
 #include "InsetList.h"
-#include "output_docbook.h"
 #include "Paragraph.h"
 #include "ParagraphList.h"
 #include "ParagraphParameters.h"
 #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>
@@ -446,33 +449,35 @@ void makeParagraph(
        // 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
@@ -896,7 +901,7 @@ void outputDocBookInfo(
                // 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())
@@ -920,6 +925,15 @@ void outputDocBookInfo(
        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) {