commit 5f0720e9475daa2ce865fc641a4e97d94b4b36a1
Author: Thibaut Cuvelier <[email protected]>
Date:   Fri Sep 11 00:44:49 2020 +0200

    XHTML: fix generation of many useless </section>.
---
 src/output_xhtml.cpp |   28 ++++++++++++++++++----------
 1 files changed, 18 insertions(+), 10 deletions(-)

diff --git a/src/output_xhtml.cpp b/src/output_xhtml.cpp
index 7d9a69b..f8cd53e 100644
--- a/src/output_xhtml.cpp
+++ b/src/output_xhtml.cpp
@@ -611,20 +611,26 @@ void xhtmlParagraphs(Text const & text,
 
                // Think about adding <section> and/or </section>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 <section> if opening a
-                       // <h2> after a <h2>, <h3>, <h4>, <h5>, or <h6>). More 
examples:
+                       // <h2> after a <h2>, <h3>, <h4>, <h5> or <h6>). More 
examples:
                        //   - current: h2; back: h1; do not close any <section>
                        //   - current: h1; back: h2; close two <section> 
(first the <h2>, then the <h1>, so a new <h1> can come)
-                       // The level (h1, h2, etc.) corresponds to 
style.toclevel.
-                       while (! headerLevels.empty() && style.toclevel <= 
headerLevels.top()) {
+                       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) { // <h1> is the document title.
+                                       xs << xml::EndTag("section");
+                                       xs << xml::CR();
+                               }
                                headerLevels.pop();
-                               xs << xml::EndTag("section");
-                               xs << xml::CR();
                        }
 
-                       // Open the new one.
-                       headerLevels.push(style.toclevel);
-                       if (style.toclevel > 1) { // <h1> is the document title.
+                       // 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) { // <h1> 
is the document title.
                                xs << xml::StartTag("section");
                                xs << xml::CR();
                        }
@@ -669,9 +675,11 @@ void xhtmlParagraphs(Text const & text,
 
        // If need be, close <section>s, but only at the end of the document 
(otherwise, dealt with at the beginning
        // of the loop).
-       while (! headerLevels.empty() && headerLevels.top() > 1) {
+       while (!headerLevels.empty() && headerLevels.top() > 
Layout::NOT_IN_TOC) {
+               docstring tag = from_utf8("</section>");
                headerLevels.pop();
-               xs << xml::EndTag("section") << xml::CR();
+               xs << XMLStream::ESCAPE_NONE << tag;
+               xs << xml::CR();
        }
 }
 
-- 
lyx-cvs mailing list
[email protected]
http://lists.lyx.org/mailman/listinfo/lyx-cvs

Reply via email to