@@ -69,6 +69,7 @@ import Text.Pandoc.Walk
69import qualified Text.Pandoc.Shared as Shared -- so we don't overlap "Element"
69import qualified Text.Pandoc.Shared as Shared -- so we don't overlap "Element"
70import Text.Pandoc.Writers.Shared (metaValueToInlines)
70import Text.Pandoc.Writers.Shared (metaValueToInlines)
71import qualified Data.Map as M
71import qualified Data.Map as M
72+import qualified Data.Set as S
72import Data.Maybe (maybeToList)
73import Data.Maybe (maybeToList)
74data WriterEnv = WriterEnv { envMetadata :: Meta
75data WriterEnv = WriterEnv { envMetadata :: Meta
@@ -92,22 +93,46 @@ instance Default WriterEnv where
92 , envSlideHasHeader = False
93 , envSlideHasHeader = False
93 , envInList = False
94 , envInList = False
94 , envInNoteSlide = False
95 , envInNoteSlide = False
95− , envCurSlideId = SlideId "1"
96+ , envCurSlideId = SlideId "Default"
99data WriterState = WriterState { stNoteIds :: M.Map Int [Block]
100data WriterState = WriterState { stNoteIds :: M.Map Int [Block]
100 -- associate anchors with slide id
101 -- associate anchors with slide id
101 , stAnchorMap :: M.Map String SlideId
102 , stAnchorMap :: M.Map String SlideId
103+ , stSlideIdSet :: S.Set SlideId
102 , stLog :: [LogMessage]
104 , stLog :: [LogMessage]
103 } deriving (Show, Eq)
106 } deriving (Show, Eq)
105instance Default WriterState where
108instance Default WriterState where
106 def = WriterState { stNoteIds = mempty
109 def = WriterState { stNoteIds = mempty
107 , stAnchorMap = mempty
110 , stAnchorMap = mempty
111+ -- we reserve this s
112+ , stSlideIdSet = reservedSlideIds
108 , stLog = []
113 , stLog = []
116+reservedSlideIds :: S.Set SlideId
117+reservedSlideIds = S.fromList [SlideId "EndNotes"]
119+uniqueSlideId' :: Integer -> S.Set SlideId -> String -> SlideId
120+uniqueSlideId' n idSet s =
121+ let s' = if n == 0 then s else (s ++ "-" ++ show n)
122+ in if SlideId s' `S.member` idSet
123+ then uniqueSlideId' (n+1) idSet s
126+uniqueSlideId :: S.Set SlideId -> String -> SlideId
127+uniqueSlideId = uniqueSlideId' 0
129+runUniqueSlideId :: String -> Pres SlideId
130+runUniqueSlideId s = do
131+ idSet <- gets stSlideIdSet
132+ let sldId = uniqueSlideId idSet s
133+ modify $ \st -> st{stSlideIdSet = S.insert sldId idSet}
111addLogMessage :: LogMessage -> Pres ()
136addLogMessage :: LogMessage -> Pres ()
112addLogMessage msg = modify $ \st -> st{stLog = msg : (stLog st)}
137addLogMessage msg = modify $ \st -> st{stLog = msg : (stLog st)}
@@ -778,9 +803,14 @@ blocksToPresentation blks = do
778 let tocSlidesLength = if writerTableOfContents opts then 1 else 0
803 let tocSlidesLength = if writerTableOfContents opts then 1 else 0
779 let bodyStartNum = tocStartNum + tocSlidesLength
804 let bodyStartNum = tocStartNum + tocSlidesLength
780 blksLst <- splitBlocks blks
805 blksLst <- splitBlocks blks
807+ bodySlideIds <- mapM
808+ (\n -> runUniqueSlideId $ "BodySlide" ++ show n)
809+ ([1..] :: [Integer])
781 bodyslides <- mapM
810 bodyslides <- mapM
782− (\(bs, n) -> local (\st -> st{envCurSlideId = SlideId $ show n}) (blocksToSlide bs))
812+ local (\st -> st{envCurSlideId = ident}) (blocksToSlide bs))
783− (zip blksLst [bodyStartNum..])
813+ (zip blksLst bodySlideIds)
784 let endNoteStartNum = bodyStartNum + length bodyslides
814 let endNoteStartNum = bodyStartNum + length bodyslides
785 endNotesSlideBlocks <- makeEndNotesSlideBlocks
815 endNotesSlideBlocks <- makeEndNotesSlideBlocks
786 -- now we come back and make the real toc...
816 -- now we come back and make the real toc...