git.iko.soy/typeable/pandoc
on master help sign in
revealjs writer: fix some section nesting corner cases.

* Ensure that we don't get > 2 levels of section nesting, even with slide level > 2. * If slide level == N but there is no N-level header, make sure the next header with level > N gets treated as a slide and put in a section, rather than remaining loose. Closes #5168.

commitc1d058aeb1c6a331a2cc22786ffaab17f7118ccd authorJohn MacFarlane <jgm@berkeley.edu> dateMon 7 Jan 2019, 21:07 (8 years ago) parent710a22e
1 file changed+13−6
src/Text/Pandoc/Writers/HTML.hs+13−6
src/Text/Pandoc/Writers/HTML.hs+13−6
@@ -266,7 +266,7 @@ pandocToHtml opts (Pandoc meta blocks) = do
266266 then fmap renderHtml' <$> tableOfContents opts sects
267267 else return Nothing
268268 blocks' <- liftM (mconcat . intersperse (nl opts)) $
269− mapM (elementToHtml slideLevel opts) sects
269+ mapM (elementToHtml Nothing slideLevel opts) sects
270270 st <- get
271271 notes <- footnoteSection opts (reverse (stNotes st))
272272 let thebody = blocks' >> notes
@@ -435,12 +435,17 @@ deLink (Link _ ils _) = Span nullAttr ils
435435deLink x = x
436436
437437-- | Convert an Element to Html.
438−elementToHtml :: PandocMonad m => Int -> WriterOptions -> Element
438+elementToHtml :: PandocMonad m => Maybe Int -> Int -> WriterOptions -> Element
439439 -> StateT WriterState m Html
440−elementToHtml _slideLevel opts (Blk block) = blockToHtml opts block
441−elementToHtml slideLevel opts (Sec level num (id',classes,keyvals) title' elements) = do
440+elementToHtml _ _ opts (Blk block) = blockToHtml opts block
441+elementToHtml mbparentlevel slideLevel opts
442+ (Sec level num (id',classes,keyvals) title' elements)
443+ = do
442444 slideVariant <- gets stSlideVariant
443− let slide = slideVariant /= NoSlides && level <= slideLevel
445+ let slide = slideVariant /= NoSlides &&
446+ (level <= slideLevel ||
447+ -- we're missing a header at slide level (see #5168)
448+ maybe False (< slideLevel) mbparentlevel)
444449 let num' = zipWith (+) num (writerNumberOffset opts ++ repeat 0)
445450 modify $ \st -> st{stSecNum = num'} -- update section number
446451 html5 <- gets stHtml5
@@ -468,7 +473,7 @@ elementToHtml slideLevel opts (Sec level num (id',classes,keyvals) title' elemen
468473 let inDiv xs = Blk (RawBlock (Format "html") ("<div class=\""
469474 ++ fragmentClass ++ "\">")) :
470475 (xs ++ [Blk (RawBlock (Format "html") "</div>")])
471− innerContents <- mapM (elementToHtml slideLevel opts)
476+ innerContents <- mapM (elementToHtml (Just level) slideLevel opts)
472477 $ if titleSlide
473478 -- title slides have no content of their own
474479 then filter isSec elements
@@ -491,6 +496,8 @@ elementToHtml slideLevel opts (Sec level num (id',classes,keyvals) title' elemen
491496 secttag header'
492497 return $
493498 (if slideVariant == RevealJsSlides && not (null innerContents)
499+ -- revealjs doesn't like more than one level of section nesting:
500+ && isNothing mbparentlevel
494501 then H5.section
495502 else id) $ mconcat $ t : innerContents
496503 else if writerSectionDivs opts || slide