X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Foutput_xhtml.cpp;h=f1bcfb879b3cfba5b579fdde04d05b65bc9c41a8;hb=869247b6;hp=3f8c0a43b1c7e484ec4fb241dea12616abfba9dd;hpb=ebcaa5b1db605a3420c23a2e6b28a3b06ed4e180;p=features.git diff --git a/src/output_xhtml.cpp b/src/output_xhtml.cpp index 3f8c0a43b1..f1bcfb879b 100644 --- a/src/output_xhtml.cpp +++ b/src/output_xhtml.cpp @@ -3,7 +3,7 @@ * This file is part of LyX, the document processor. * Licence details can be found in the file COPYING. * - * \author Richard Heck + * \author Richard Kimberly Heck * * This code is based upon output_docbook.cpp * @@ -15,12 +15,10 @@ #include "output_xhtml.h" #include "Buffer.h" -#include "buffer_funcs.h" #include "BufferParams.h" #include "Counters.h" #include "Font.h" #include "Layout.h" -#include "OutputParams.h" #include "Paragraph.h" #include "ParagraphList.h" #include "ParagraphParameters.h" @@ -28,13 +26,10 @@ #include "Text.h" #include "TextClass.h" -#include "support/convert.h" -#include "support/debug.h" #include "support/lassert.h" -#include "support/lstrings.h" -#include "support/textutils.h" -#include +#include +#include // Uncomment to activate debugging code. // #define XHTML_DEBUG @@ -590,6 +585,8 @@ 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); if (par->params().startOfAppendix()) { @@ -607,6 +604,35 @@ void xhtmlParagraphs(Text const & text, ParagraphList::const_iterator const lastpar = par; ParagraphList::const_iterator send; + // Think about adding
and/or
s. + // Document title is not in Sectioning, but rather in FrontMatter, so that it does not need to be taken + // into account. + 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) { + 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 ) { + xs << xml::StartTag("section"); + xs << xml::CR(); + } + } + switch (style.latextype) { case LATEX_COMMAND: { // The files with which we are working never have more than @@ -643,6 +669,14 @@ 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) { + headerLevels.pop(); + xs << xml::EndTag("section"); + xs << xml::CR(); + } }