git.iko.soy/typeable/pandoc
on master help sign in
Powerpoint writer: Add table of contents

This is triggered by the `--toc` flag. Note that in a long slide deck this risks overrunning the text box. The user can address this by setting `--toc-depth=1`.

commit021e5ac89d4423e844a741801d6dc59a3edafa51 authorJesse Rosenthal <jrosenthal@jhu.edu> dateFri 12 Jan 2018, 10:43 (9 years ago) parent4ce07c2
1 file changed+33−2
src/Text/Pandoc/Writers/Powerpoint.hs+33−2
src/Text/Pandoc/Writers/Powerpoint.hs+33−2
@@ -54,6 +54,7 @@ import Text.Pandoc.MIME
5454import Text.Pandoc.Logging
5555import qualified Data.ByteString.Lazy as BL
5656import Text.Pandoc.Walk
57+import qualified Text.Pandoc.Shared as Shared -- so we don't overlap "Element"
5758import Text.Pandoc.Writers.Shared (fixDisplayMath)
5859import Text.Pandoc.Writers.OOXML
5960import qualified Data.Map as M
@@ -677,10 +678,40 @@ getMetaSlide = do
677678 , metadataSlideDate = date
678679 }
679680
681+-- adapted from the markdown writer
682+elementToListItem :: PandocMonad m => Shared.Element -> P m [Block]
683+elementToListItem (Shared.Sec lev _nums (ident,_,_) headerText subsecs) = do
684+ opts <- asks envOpts
685+ let headerLink = if null ident
686+ then walk Shared.deNote headerText
687+ else [Link nullAttr (walk Shared.deNote headerText)
688+ ('#':ident, "")]
689+ listContents <- if null subsecs || lev >= writerTOCDepth opts
690+ then return []
691+ else mapM elementToListItem subsecs
692+ return [Plain headerLink, BulletList listContents]
693+elementToListItem (Shared.Blk _) = return []
694+
695+makeTOCSlide :: PandocMonad m => [Block] -> P m Slide
696+makeTOCSlide blks = do
697+ contents <- BulletList <$> mapM elementToListItem (Shared.hierarchicalize blks)
698+ slideLevel <- asks envSlideLevel
699+ let tocTitle = [Str "Table of Contents"]
700+ hdr = Header slideLevel nullAttr tocTitle
701+ sld <- blocksToSlide [hdr, contents]
702+ return sld
703+
680704blocksToPresentation :: PandocMonad m => [Block] -> P m Presentation
681705blocksToPresentation blks = do
706+ opts <- asks envOpts
707+ let metadataStartNum = 1
682708 metadataslides <- maybeToList <$> getMetaSlide
683− let bodyStartNum = length metadataslides + 1
709+ let tocStartNum = metadataStartNum + length metadataslides
710+ tocSlides <- if writerTableOfContents opts
711+ then do toc <- makeTOCSlide blks
712+ return [toc]
713+ else return []
714+ let bodyStartNum = tocStartNum + length tocSlides
684715 blksLst <- splitBlocks blks
685716 bodyslides <- mapM
686717 (\(bs, n) -> local (\st -> st{envCurSlideId = n}) (blocksToSlide bs))
@@ -690,7 +721,7 @@ blocksToPresentation blks = do
690721 presSize <- asks envPresentationSize
691722 return $
692723 Presentation presSize $
693− metadataslides ++ bodyslides ++ noteSlides
724+ metadataslides ++ tocSlides ++ bodyslides ++ noteSlides
694725
695726--------------------------------------------------------------------
696727