diff options
author | Jesse Rosenthal <jrosenthal@jhu.edu> | 2018-01-12 10:43:02 -0500 |
---|---|---|
committer | Jesse Rosenthal <jrosenthal@jhu.edu> | 2018-01-12 10:43:02 -0500 |
commit | 021e5ac89d4423e844a741801d6dc59a3edafa51 (patch) | |
tree | 163019cda09c93203a7a7bbe1ae947d0afbb3258 /src | |
parent | 4ce07c20d7f06da3519fa601b9d3df94a16d507e (diff) | |
download | pandoc-021e5ac89d4423e844a741801d6dc59a3edafa51.tar.gz |
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`.
Diffstat (limited to 'src')
-rw-r--r-- | src/Text/Pandoc/Writers/Powerpoint.hs | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/src/Text/Pandoc/Writers/Powerpoint.hs b/src/Text/Pandoc/Writers/Powerpoint.hs index ef9bfedff..c3f743c5f 100644 --- a/src/Text/Pandoc/Writers/Powerpoint.hs +++ b/src/Text/Pandoc/Writers/Powerpoint.hs @@ -54,6 +54,7 @@ import Text.Pandoc.MIME import Text.Pandoc.Logging import qualified Data.ByteString.Lazy as BL import Text.Pandoc.Walk +import qualified Text.Pandoc.Shared as Shared -- so we don't overlap "Element" import Text.Pandoc.Writers.Shared (fixDisplayMath) import Text.Pandoc.Writers.OOXML import qualified Data.Map as M @@ -677,10 +678,40 @@ getMetaSlide = do , metadataSlideDate = date } +-- adapted from the markdown writer +elementToListItem :: PandocMonad m => Shared.Element -> P m [Block] +elementToListItem (Shared.Sec lev _nums (ident,_,_) headerText subsecs) = do + opts <- asks envOpts + let headerLink = if null ident + then walk Shared.deNote headerText + else [Link nullAttr (walk Shared.deNote headerText) + ('#':ident, "")] + listContents <- if null subsecs || lev >= writerTOCDepth opts + then return [] + else mapM elementToListItem subsecs + return [Plain headerLink, BulletList listContents] +elementToListItem (Shared.Blk _) = return [] + +makeTOCSlide :: PandocMonad m => [Block] -> P m Slide +makeTOCSlide blks = do + contents <- BulletList <$> mapM elementToListItem (Shared.hierarchicalize blks) + slideLevel <- asks envSlideLevel + let tocTitle = [Str "Table of Contents"] + hdr = Header slideLevel nullAttr tocTitle + sld <- blocksToSlide [hdr, contents] + return sld + blocksToPresentation :: PandocMonad m => [Block] -> P m Presentation blocksToPresentation blks = do + opts <- asks envOpts + let metadataStartNum = 1 metadataslides <- maybeToList <$> getMetaSlide - let bodyStartNum = length metadataslides + 1 + let tocStartNum = metadataStartNum + length metadataslides + tocSlides <- if writerTableOfContents opts + then do toc <- makeTOCSlide blks + return [toc] + else return [] + let bodyStartNum = tocStartNum + length tocSlides blksLst <- splitBlocks blks bodyslides <- mapM (\(bs, n) -> local (\st -> st{envCurSlideId = n}) (blocksToSlide bs)) @@ -690,7 +721,7 @@ blocksToPresentation blks = do presSize <- asks envPresentationSize return $ Presentation presSize $ - metadataslides ++ bodyslides ++ noteSlides + metadataslides ++ tocSlides ++ bodyslides ++ noteSlides -------------------------------------------------------------------- |