]> git.lyx.org Git - lyx.git/blobdiff - src/output_docbook.cpp
Limit the nopassthurchars case in beamer to URL
[lyx.git] / src / output_docbook.cpp
index 71d3b83f2997812232b8d175a7a674fd5474dc61..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());
@@ -373,7 +382,7 @@ void makeParagraph(
                        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,
@@ -508,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;
@@ -826,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;
                }
 
@@ -1020,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;
@@ -1108,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
@@ -1281,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)) {
@@ -1307,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);