git.iko.soy/typeable/pandoc
on master help sign in
Powerpoint writer: Use more specific slide id names.
commit42e690d1b2da5f7111c6d7918e9311f5cdc7a335 authorJesse Rosenthal <jrosenthal@jhu.edu> dateWed 17 Jan 2018, 13:58 (9 years ago) parent0d53efe
1 file changed+33−3
src/Text/Pandoc/Writers/Powerpoint/Presentation.hs+33−3
src/Text/Pandoc/Writers/Powerpoint/Presentation.hs+33−3
@@ -69,6 +69,7 @@ import Text.Pandoc.Walk
6969import qualified Text.Pandoc.Shared as Shared -- so we don't overlap "Element"
7070import Text.Pandoc.Writers.Shared (metaValueToInlines)
7171import qualified Data.Map as M
72+import qualified Data.Set as S
7273import Data.Maybe (maybeToList)
7374
7475data WriterEnv = WriterEnv { envMetadata :: Meta
@@ -92,22 +93,46 @@ instance Default WriterEnv where
9293 , envSlideHasHeader = False
9394 , envInList = False
9495 , envInNoteSlide = False
95− , envCurSlideId = SlideId "1"
96+ , envCurSlideId = SlideId "Default"
9697 }
9798
9899
99100data WriterState = WriterState { stNoteIds :: M.Map Int [Block]
100101 -- associate anchors with slide id
101102 , stAnchorMap :: M.Map String SlideId
103+ , stSlideIdSet :: S.Set SlideId
102104 , stLog :: [LogMessage]
105+
103106 } deriving (Show, Eq)
104107
105108instance Default WriterState where
106109 def = WriterState { stNoteIds = mempty
107110 , stAnchorMap = mempty
111+ -- we reserve this s
112+ , stSlideIdSet = reservedSlideIds
108113 , stLog = []
109114 }
110115
116+reservedSlideIds :: S.Set SlideId
117+reservedSlideIds = S.fromList [SlideId "EndNotes"]
118+
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
124+ else SlideId s'
125+
126+uniqueSlideId :: S.Set SlideId -> String -> SlideId
127+uniqueSlideId = uniqueSlideId' 0
128+
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}
134+ return sldId
135+
111136addLogMessage :: LogMessage -> Pres ()
112137addLogMessage msg = modify $ \st -> st{stLog = msg : (stLog st)}
113138
@@ -778,9 +803,14 @@ blocksToPresentation blks = do
778803 let tocSlidesLength = if writerTableOfContents opts then 1 else 0
779804 let bodyStartNum = tocStartNum + tocSlidesLength
780805 blksLst <- splitBlocks blks
806+
807+ bodySlideIds <- mapM
808+ (\n -> runUniqueSlideId $ "BodySlide" ++ show n)
809+ ([1..] :: [Integer])
781810 bodyslides <- mapM
782− (\(bs, n) -> local (\st -> st{envCurSlideId = SlideId $ show n}) (blocksToSlide bs))
783− (zip blksLst [bodyStartNum..])
811+ (\(bs, ident) ->
812+ local (\st -> st{envCurSlideId = ident}) (blocksToSlide bs))
813+ (zip blksLst bodySlideIds)
784814 let endNoteStartNum = bodyStartNum + length bodyslides
785815 endNotesSlideBlocks <- makeEndNotesSlideBlocks
786816 -- now we come back and make the real toc...