@@ -54,6 +54,7 @@ import Text.Pandoc.MIME
54import Text.Pandoc.Logging
54import Text.Pandoc.Logging
55import qualified Data.ByteString.Lazy as BL
55import qualified Data.ByteString.Lazy as BL
56import Text.Pandoc.Walk
56import Text.Pandoc.Walk
57+import qualified Text.Pandoc.Shared as Shared -- so we don't overlap "Element"
57import Text.Pandoc.Writers.Shared (fixDisplayMath)
58import Text.Pandoc.Writers.Shared (fixDisplayMath)
58import Text.Pandoc.Writers.OOXML
59import Text.Pandoc.Writers.OOXML
59import qualified Data.Map as M
60import qualified Data.Map as M
@@ -677,10 +678,40 @@ getMetaSlide = do
677 , metadataSlideDate = date
678 , metadataSlideDate = date
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)
689+ listContents <- if null subsecs || lev >= writerTOCDepth opts
691+ else mapM elementToListItem subsecs
692+ return [Plain headerLink, BulletList listContents]
693+elementToListItem (Shared.Blk _) = return []
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]
680blocksToPresentation :: PandocMonad m => [Block] -> P m Presentation
704blocksToPresentation :: PandocMonad m => [Block] -> P m Presentation
681blocksToPresentation blks = do
705blocksToPresentation blks = do
706+ opts <- asks envOpts
707+ let metadataStartNum = 1
682 metadataslides <- maybeToList <$> getMetaSlide
708 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
714+ let bodyStartNum = tocStartNum + length tocSlides
684 blksLst <- splitBlocks blks
715 blksLst <- splitBlocks blks
685 bodyslides <- mapM
716 bodyslides <- mapM
686 (\(bs, n) -> local (\st -> st{envCurSlideId = n}) (blocksToSlide bs))
717 (\(bs, n) -> local (\st -> st{envCurSlideId = n}) (blocksToSlide bs))
@@ -690,7 +721,7 @@ blocksToPresentation blks = do
690 presSize <- asks envPresentationSize
721 presSize <- asks envPresentationSize
692 Presentation presSize $
723 Presentation presSize $
693− metadataslides ++ bodyslides ++ noteSlides
724+ metadataslides ++ tocSlides ++ bodyslides ++ noteSlides
695--------------------------------------------------------------------
726--------------------------------------------------------------------