diff --git a/src/output_xhtml.cpp b/src/output_xhtml.cpp index 99d425e4bc..f8cd53e478 100644 --- a/src/output_xhtml.cpp +++ b/src/output_xhtml.cpp @@ -590,6 +590,7 @@ void xhtmlParagraphs(Text const & text, ParagraphList::const_iterator const pend = (epit == (int) paragraphs.size()) ? paragraphs.end() : paragraphs.iterator_at(epit); + std::stack headerLevels; while (bpit < epit) { ParagraphList::const_iterator par = paragraphs.iterator_at(bpit); @@ -608,6 +609,33 @@ void xhtmlParagraphs(Text const & text, ParagraphList::const_iterator const lastpar = par; ParagraphList::const_iterator send; + // Think about adding
and/or
s. + if (style.category() == from_utf8("Sectioning")) { + int level = style.toclevel; + + // Need to close a previous section if it has the same level or a higher one (close
if opening a + //

after a

,

,

,

or
). More examples: + // - current: h2; back: h1; do not close any
+ // - current: h1; back: h2; close two
(first the

, then the

, so a new

can come) + while (!headerLevels.empty() && level <= headerLevels.top()) { + // Output the tag only if it corresponds to a legit section. + int stackLevel = headerLevels.top(); + if (stackLevel != Layout::NOT_IN_TOC && level > 1) { //

is the document title. + xs << xml::EndTag("section"); + xs << xml::CR(); + } + headerLevels.pop(); + } + + // Open the new section: first push it onto the stack, then output it in XHTML. + headerLevels.push(level); + // Some sectioning-like elements should not be output (such as FrontMatter). + if (level != Layout::NOT_IN_TOC && level > 1) { //

is the document title. + xs << xml::StartTag("section"); + xs << xml::CR(); + } + } + switch (style.latextype) { case LATEX_COMMAND: { // The files with which we are working never have more than @@ -644,6 +672,15 @@ void xhtmlParagraphs(Text const & text, } bpit += distance(lastpar, par); } + + // If need be, close
s, but only at the end of the document (otherwise, dealt with at the beginning + // of the loop). + while (!headerLevels.empty() && headerLevels.top() > Layout::NOT_IN_TOC) { + docstring tag = from_utf8("
"); + headerLevels.pop(); + xs << XMLStream::ESCAPE_NONE << tag; + xs << xml::CR(); + } }