]> git.lyx.org Git - lyx.git/blobdiff - src/output_docbook.cpp
Update Win installer for new dictionary links. Untested.
[lyx.git] / src / output_docbook.cpp
index 114c2583042039f428ea47459c6aa13e76438ccc..204fc430f7913fced45e7887507fc2b32cbd9d15 100644 (file)
@@ -200,9 +200,18 @@ void openParTag(XMLStream & xs, const Paragraph * par, const Paragraph * prevpar
        }
 
        // Main logic.
-       if (openWrapper)
+       if (openWrapper) {
                xml::openTag(xs, lay.docbookwrappertag(), lay.docbookwrapperattr(), lay.docbookwrappertagtype());
 
+               if (lay.docbookgeneratetitle()) {
+                       docstring const label = par->params().labelString();
+
+                       xml::openTag(xs, "title", "", "paragraph");
+                       xs << (!label.empty() ? label : from_ascii("No title"));
+                       xml::closeTag(xs, "title", "paragraph");
+               }
+       }
+
        const string & tag = lay.docbooktag();
        if (tag != "NONE") {
                auto xmltag = xml::ParTag(tag, lay.docbookattr());
@@ -360,18 +369,20 @@ 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 == parSize && std::all_of(par->insetList().begin(), par->insetList().end(), [](InsetList::Element inset) {
+       auto isEquationSpecialCase = [](InsetList::Element inset) {
                return inset.inset && inset.inset->asInsetMath() && inset.inset->asInsetMath()->getType() != hullSimple;
-       });
+       };
+       special_case |= nInsets == parSize && std::all_of(par->insetList().begin(), par->insetList().end(), isEquationSpecialCase);
 
        // Things that should not get into their own paragraph. (Only valid for DocBook.)
        static std::set<InsetCode> lyxCodeSpecialCases = {
                        TABULAR_CODE,
                        FLOAT_CODE,
                        BIBTEX_CODE, // Bibliographies cannot be in paragraphs. Bibitems should still be handled as paragraphs,
-                       // though (see makeParagraphBibliography).
+                       // though (see makeBibliography).
                        ERT_CODE, // ERTs are in comments, not paragraphs.
                        LISTINGS_CODE,
                        BOX_CODE,
@@ -420,6 +431,12 @@ void makeParagraph(
        };
        special_case |= nInsets == parSize && std::all_of(par->insetList().begin(), par->insetList().end(), isFlexSpecialCase);
 
+       // If the insets should be rendered as images, enter the special case.
+       auto isRenderedAsImageSpecialCase = [](InsetList::Element inset) {
+               return inset.inset && inset.inset->getLayout().docbookrenderasimage();
+       };
+       special_case |= nInsets == parSize && std::all_of(par->insetList().begin(), par->insetList().end(), isRenderedAsImageSpecialCase);
+
        // Open a paragraph if it is allowed, we are not already within a paragraph, and the insets in the paragraph do
        // not forbid paragraphs (aka special cases).
        bool const open_par = runparams.docbook_make_pars
@@ -500,7 +517,9 @@ void makeEnvironment(Text const &text,
                std::vector<docstring> pars_prepend;
         std::vector<docstring> pars;
         std::vector<docstring> pars_append;
-        tie(pars_prepend, pars, pars_append) = par->simpleDocBookOnePar(buf, runparams, text.outerFont(std::distance(text.paragraphs().begin(), par)), 0, false, ignoreFonts);
+        tie(pars_prepend, pars, pars_append) =
+                               par->simpleDocBookOnePar(buf, runparams, text.outerFont(std::distance(text.paragraphs().begin(), par)),
+                                                                                0, false, ignoreFonts);
 
         for (docstring const & parXML : pars_prepend)
             xs << XMLStream::ESCAPE_NONE << parXML;
@@ -746,6 +765,8 @@ DocBookDocumentSectioning hasDocumentSectioning(ParagraphList const &paragraphs,
        bool documentHasSections = false;
 
        while (bpit < epit) {
+               LASSERT(static_cast<size_t>(bpit) < paragraphs.size(), return make_tuple(documentHasSections, bpit));
+
                Layout const &style = paragraphs[bpit].layout();
                documentHasSections |= isLayoutSectioningOrSimilar(style);
 
@@ -792,7 +813,7 @@ DocBookInfoTag getParagraphsWithInfo(ParagraphList const &paragraphs,
        set<pit_type> abstractWithLayout;
        set<pit_type> abstractNoLayout;
 
-       // Find the first non empty paragraph by mutating bpit.
+       // Find the first nonempty paragraph by mutating bpit.
        while (bpit < epit) {
                Paragraph const &par = paragraphs[bpit];
                if (par.empty() || hasOnlyNotes(par))
@@ -816,7 +837,7 @@ DocBookInfoTag getParagraphsWithInfo(ParagraphList const &paragraphs,
                // There should never be any section here, except for the first paragraph (a title can be part of <info>).
                // (Just a sanity check: if this fails, this function could end up processing the whole document.)
                if (cpit != bpit && isLayoutSectioningOrSimilar(par.layout())) {
-                       LYXERR0("Assertion failed: section found in potential <info> paragraphs.");
+                       LYXERR(Debug::OUTFILE, "Assertion failed: section found in potential <info> paragraphs.");
                        break;
                }
 
@@ -1010,12 +1031,20 @@ void outputDocBookInfo(
                        }
                }
 
-               // Actually output the abstract if there is something to do. Don't count line feeds or spaces in this,
-               // even though they must be properly output if there is some abstract.
+               // Actually output the abstract if there is something to do. Don't count line feeds, spaces, or comments
+               // in this -- even though line feeds and spaces must be properly output if there is some abstract.
                abstract = os2.str();
                docstring cleaned = abstract;
                cleaned.erase(std::remove_if(cleaned.begin(), cleaned.end(), lyx::isSpace), cleaned.end());
 
+               size_t beginComment;
+               size_t endComment;
+               while ((beginComment = cleaned.find(from_ascii("<!--"))) != lyx::docstring::npos) {
+                       if ((endComment = cleaned.find(from_ascii("-->"), beginComment)) != lyx::docstring::npos) {
+                               cleaned.erase(cleaned.begin() + beginComment, cleaned.begin() + endComment + 3);
+                       }
+               }
+
                // Nothing? Then there is no abstract!
                if (cleaned.empty())
                        hasAbstract = false;
@@ -1098,8 +1127,9 @@ void docbookSimpleAllParagraphs(
 
        // Then, the content. It starts where the <info> ends.
        auto par = paragraphs.iterator_at(info.epit);
-       auto end = paragraphs.iterator_at(epit);
-       while (par != end) {
+       auto par_epit = paragraphs.iterator_at(epit);
+       auto par_end = paragraphs.end();
+       while (par != par_epit && par != par_end) {
                if (!hasOnlyNotes(*par))
                        par = makeAny(text, buf, xs, runparams, par);
                else
@@ -1271,7 +1301,8 @@ void docbookParagraphs(Text const &text,
                }
 
                // Close all sections before the bibliography.
-               // TODO: Only close all when the bibliography is at the end of the document? Or force to output the bibliography at the end of the document? Or don't care (as allowed by DocBook)?
+               // TODO: Only close all when the bibliography is at the end of the document? Or force to output the bibliography
+               // at the end of the document? Or don't care (as allowed by DocBook)?
                if (!par->insetList().empty()) {
                        Inset const *firstInset = par->getInset(0);
                        if (firstInset && (firstInset->lyxCode() == BIBITEM_CODE || firstInset->lyxCode() == BIBTEX_CODE)) {
@@ -1297,7 +1328,8 @@ void docbookParagraphs(Text const &text,
                // Generate the <info> tag if a section was just opened.
                // Some sections may require abstracts (mostly parts, in books: DocBookForceAbstractTag will not be NONE),
                // others can still have an abstract (it must be detected so that it can be output at the right place).
-               // TODO: docbookforceabstracttag is a bit contrived here, but it does the job. Having another field just for this would be cleaner, but that's just for <part> and <partintro>, so it's probably not worth the effort.
+               // TODO: docbookforceabstracttag is a bit contrived here, but it does the job. Having another field just for
+               // this would be cleaner, but that's just for <part> and <partintro>, so it's probably not worth the effort.
                if (isLayoutSectioning(style)) {
                        // This abstract may be found between the next paragraph and the next title.
                        pit_type cpit = std::distance(text.paragraphs().begin(), par);