From ac46456b288c35a05f716a9e3bbf022f60b2cd9f Mon Sep 17 00:00:00 2001 From: Thibaut Cuvelier Date: Tue, 18 Aug 2020 05:46:40 +0200 Subject: [PATCH] DocBook: simplify precooked bibliography code. --- src/output_docbook.cpp | 88 ++++++++++++++++++------------------------ 1 file changed, 38 insertions(+), 50 deletions(-) diff --git a/src/output_docbook.cpp b/src/output_docbook.cpp index 04818907c2..3f6a69287b 100644 --- a/src/output_docbook.cpp +++ b/src/output_docbook.cpp @@ -360,63 +360,59 @@ void closeItemTag(XMLStream & xs, Layout const & lay) } +void makeAny( + Text const &, + Buffer const &, + XMLStream &, + OutputParams const &, + ParagraphList::const_iterator); + + void makeParagraphBibliography( Buffer const & buf, XMLStream & xs, OutputParams const & runparams, Text const & text, - ParagraphList::const_iterator const & pbegin) + ParagraphList::const_iterator const & par) { - auto const begin = text.paragraphs().begin(); - auto const end = text.paragraphs().end(); - auto pend = pbegin; - ++pend; - - // Find the paragraph *before* pbegin. - ParagraphList::const_iterator pbegin_before = begin; - if (pbegin != begin) { - ParagraphList::const_iterator pbegin_before_next = begin; - ++pbegin_before_next; - - while (pbegin_before_next != pbegin) { - ++pbegin_before; - ++pbegin_before_next; - } - } - - ParagraphList::const_iterator par = pbegin; - // If this is the first paragraph in a bibliography, open the bibliography tag. - if (pbegin != begin && pbegin_before->layout().latextype != LATEX_BIB_ENVIRONMENT) { + auto pbegin_before = text.paragraphs().getParagraphBefore(par); + if (pbegin_before->layout().latextype != LATEX_BIB_ENVIRONMENT) { xs << xml::StartTag("bibliography"); xs << xml::CR(); } - // Generate the required paragraphs, but only if they are . - for (; par != pend; ++par) { - // Start the precooked bibliography entry. This is very much like opening a paragraph tag. - // Don't forget the citation ID! - docstring attr; - for (auto i = 0; i < par->size(); ++i) { - Inset const *ip = par->getInset(0); - if (ip != nullptr && ip->lyxCode() == BIBITEM_CODE) { - const auto * bibitem = dynamic_cast(par->getInset(i)); - attr = from_utf8("xml:id='") + bibitem->getParam("key") + from_utf8("'"); - break; - } + // Start the precooked bibliography entry. This is very much like opening a paragraph tag. + // Don't forget the citation ID! + docstring attr; + for (auto i = 0; i < par->size(); ++i) { + Inset const *ip = par->getInset(0); + if (ip != nullptr && ip->lyxCode() == BIBITEM_CODE) { + const auto * bibitem = dynamic_cast(par->getInset(i)); + attr = from_utf8("xml:id='") + bibitem->getParam("key") + from_utf8("'"); + break; } - xs << xml::StartTag(from_utf8("bibliomixed"), attr); - - // Generate the entry. - par->simpleDocBookOnePar(buf, xs, runparams, text.outerFont(distance(begin, par)), true, true, 0); - - // End the precooked bibliography entry. - xs << xml::EndTag("bibliomixed"); - xs << xml::CR(); } + xs << xml::StartTag(from_utf8("bibliomixed"), attr); + + // Generate the entry. + auto const begin = text.paragraphs().begin(); + par->simpleDocBookOnePar(buf, xs, runparams, text.outerFont(std::distance(begin, par)), true, true, 0); + + // End the precooked bibliography entry. + xs << xml::EndTag("bibliomixed"); + xs << xml::CR(); // If this is the last paragraph in a bibliography, close the bibliography tag. - if (par == end || par->layout().latextype != LATEX_BIB_ENVIRONMENT) { + auto const end = text.paragraphs().end(); + bool endBibliography = par == end; + if (!endBibliography) { + auto nextpar = par; + ++nextpar; + endBibliography = par->layout().latextype != LATEX_BIB_ENVIRONMENT; + } + + if (endBibliography) { xs << xml::EndTag("bibliography"); xs << xml::CR(); } @@ -524,14 +520,6 @@ void makeParagraph( } -void makeAny( - Text const &text, - Buffer const &buf, - XMLStream &xs, - OutputParams const &ourparams, - ParagraphList::const_iterator par); - - void makeEnvironment( Buffer const &buf, XMLStream &xs,