Powerpoint writer: Use more specific slide id names.

This commit is contained in:
Jesse Rosenthal 2018-01-17 13:58:19 -05:00
parent 0d53efeddb
commit 42e690d1b2

View file

@ -69,6 +69,7 @@ import Text.Pandoc.Walk
import qualified Text.Pandoc.Shared as Shared -- so we don't overlap "Element" import qualified Text.Pandoc.Shared as Shared -- so we don't overlap "Element"
import Text.Pandoc.Writers.Shared (metaValueToInlines) import Text.Pandoc.Writers.Shared (metaValueToInlines)
import qualified Data.Map as M import qualified Data.Map as M
import qualified Data.Set as S
import Data.Maybe (maybeToList) import Data.Maybe (maybeToList)
data WriterEnv = WriterEnv { envMetadata :: Meta data WriterEnv = WriterEnv { envMetadata :: Meta
@ -92,22 +93,46 @@ instance Default WriterEnv where
, envSlideHasHeader = False , envSlideHasHeader = False
, envInList = False , envInList = False
, envInNoteSlide = False , envInNoteSlide = False
, envCurSlideId = SlideId "1" , envCurSlideId = SlideId "Default"
} }
data WriterState = WriterState { stNoteIds :: M.Map Int [Block] data WriterState = WriterState { stNoteIds :: M.Map Int [Block]
-- associate anchors with slide id -- associate anchors with slide id
, stAnchorMap :: M.Map String SlideId , stAnchorMap :: M.Map String SlideId
, stSlideIdSet :: S.Set SlideId
, stLog :: [LogMessage] , stLog :: [LogMessage]
} deriving (Show, Eq) } deriving (Show, Eq)
instance Default WriterState where instance Default WriterState where
def = WriterState { stNoteIds = mempty def = WriterState { stNoteIds = mempty
, stAnchorMap = mempty , stAnchorMap = mempty
-- we reserve this s
, stSlideIdSet = reservedSlideIds
, stLog = [] , stLog = []
} }
reservedSlideIds :: S.Set SlideId
reservedSlideIds = S.fromList [SlideId "EndNotes"]
uniqueSlideId' :: Integer -> S.Set SlideId -> String -> SlideId
uniqueSlideId' n idSet s =
let s' = if n == 0 then s else (s ++ "-" ++ show n)
in if SlideId s' `S.member` idSet
then uniqueSlideId' (n+1) idSet s
else SlideId s'
uniqueSlideId :: S.Set SlideId -> String -> SlideId
uniqueSlideId = uniqueSlideId' 0
runUniqueSlideId :: String -> Pres SlideId
runUniqueSlideId s = do
idSet <- gets stSlideIdSet
let sldId = uniqueSlideId idSet s
modify $ \st -> st{stSlideIdSet = S.insert sldId idSet}
return sldId
addLogMessage :: LogMessage -> Pres () addLogMessage :: LogMessage -> Pres ()
addLogMessage msg = modify $ \st -> st{stLog = msg : (stLog st)} addLogMessage msg = modify $ \st -> st{stLog = msg : (stLog st)}
@ -778,9 +803,14 @@ blocksToPresentation blks = do
let tocSlidesLength = if writerTableOfContents opts then 1 else 0 let tocSlidesLength = if writerTableOfContents opts then 1 else 0
let bodyStartNum = tocStartNum + tocSlidesLength let bodyStartNum = tocStartNum + tocSlidesLength
blksLst <- splitBlocks blks blksLst <- splitBlocks blks
bodySlideIds <- mapM
(\n -> runUniqueSlideId $ "BodySlide" ++ show n)
([1..] :: [Integer])
bodyslides <- mapM bodyslides <- mapM
(\(bs, n) -> local (\st -> st{envCurSlideId = SlideId $ show n}) (blocksToSlide bs)) (\(bs, ident) ->
(zip blksLst [bodyStartNum..]) local (\st -> st{envCurSlideId = ident}) (blocksToSlide bs))
(zip blksLst bodySlideIds)
let endNoteStartNum = bodyStartNum + length bodyslides let endNoteStartNum = bodyStartNum + length bodyslides
endNotesSlideBlocks <- makeEndNotesSlideBlocks endNotesSlideBlocks <- makeEndNotesSlideBlocks
-- now we come back and make the real toc... -- now we come back and make the real toc...