git.iko.soy/typeable/pandoc
on master help sign in
Powerpoint writer: change notes state to a simpler per-slide value
3b7611aJesse Rosenthal
src/Text/Pandoc/Writers/Powerpoint/Presentation.hs+7−18
@@ -113,7 +113,7 @@ data WriterState = WriterState { stNoteIds :: M.Map Int [Block]
113 , stAnchorMap :: M.Map String SlideId
113 , stAnchorMap :: M.Map String SlideId
114 , stSlideIdSet :: S.Set SlideId
114 , stSlideIdSet :: S.Set SlideId
115 , stLog :: [LogMessage]
115 , stLog :: [LogMessage]
116− , stSpeakerNotesMap :: M.Map SlideId [[Paragraph]]
116+ , stSpeakerNotes :: SpeakerNotes
117 } deriving (Show, Eq)
117 } deriving (Show, Eq)
118
118
119instance Default WriterState where
119instance Default WriterState where
@@ -122,7 +122,7 @@ instance Default WriterState where
122 -- we reserve this s
122 -- we reserve this s
123 , stSlideIdSet = reservedSlideIds
123 , stSlideIdSet = reservedSlideIds
124 , stLog = []
124 , stLog = []
125− , stSpeakerNotesMap = mempty
125+ , stSpeakerNotes = mempty
126 }
126 }
127
127
128metadataSlideId :: SlideId
128metadataSlideId :: SlideId
@@ -196,7 +196,7 @@ newtype SlideId = SlideId String
196-- designed mainly for one textbox, so we'll just put in the contents
196-- designed mainly for one textbox, so we'll just put in the contents
197-- of that textbox, to avoid other shapes that won't work as well.
197-- of that textbox, to avoid other shapes that won't work as well.
198newtype SpeakerNotes = SpeakerNotes {fromSpeakerNotes :: [Paragraph]}
198newtype SpeakerNotes = SpeakerNotes {fromSpeakerNotes :: [Paragraph]}
199− deriving (Show, Eq, Monoid)
199+ deriving (Show, Eq, Monoid, Semigroup)
200
200
201data Layout = MetadataSlide { metadataSlideTitle :: [ParaElem]
201data Layout = MetadataSlide { metadataSlideTitle :: [ParaElem]
202 , metadataSlideSubtitle :: [ParaElem]
202 , metadataSlideSubtitle :: [ParaElem]
@@ -565,13 +565,8 @@ isNotesDiv _ = False
565handleNotes :: Block -> Pres ()
565handleNotes :: Block -> Pres ()
566handleNotes (Div (_, ["notes"], _) blks) =
566handleNotes (Div (_, ["notes"], _) blks) =
567 local (\env -> env{envInSpeakerNotes=True}) $ do
567 local (\env -> env{envInSpeakerNotes=True}) $ do
568− sldId <- asks envCurSlideId
569− spkNotesMap <- gets stSpeakerNotesMap
570− paras <- concatMapM blockToParagraphs blks
568+ spNotes <- SpeakerNotes <$> concatMapM blockToParagraphs blks
571− let spkNotesMap' = case M.lookup sldId spkNotesMap of
569+ modify $ \st -> st{stSpeakerNotes = (stSpeakerNotes st) <> spNotes}
572− Just lst -> M.insert sldId (paras : lst) spkNotesMap
573− Nothing -> M.insert sldId [paras] spkNotesMap
574− modify $ \st -> st{stSpeakerNotesMap = spkNotesMap'}
575handleNotes _ = return ()
570handleNotes _ = return ()
576
571
577handleAndFilterNotes :: [Block] -> Pres [Block]
572handleAndFilterNotes :: [Block] -> Pres [Block]
@@ -632,13 +627,6 @@ splitBlocks' cur acc (blk : blks) = splitBlocks' (cur ++ [blk]) acc blks
632splitBlocks :: [Block] -> Pres [[Block]]
627splitBlocks :: [Block] -> Pres [[Block]]
633splitBlocks = splitBlocks' [] []
628splitBlocks = splitBlocks' [] []
634
629
635−getSpeakerNotes :: Pres SpeakerNotes
636−getSpeakerNotes = do
637− sldId <- asks envCurSlideId
638− spkNtsMap <- gets stSpeakerNotesMap
639− let paras = fromMaybe [] (M.lookup sldId spkNtsMap)
640− return $ SpeakerNotes $ concat $ reverse paras
641−
642blocksToSlide' :: Int -> [Block] -> Pres Slide
630blocksToSlide' :: Int -> [Block] -> Pres Slide
643blocksToSlide' lvl (Header n (ident, _, _) ils : blks)
631blocksToSlide' lvl (Header n (ident, _, _) ils : blks)
644 | n < lvl = do
632 | n < lvl = do
@@ -710,9 +698,10 @@ blocksToSlide' _ [] = do
710blocksToSlide :: [Block] -> Pres Slide
698blocksToSlide :: [Block] -> Pres Slide
711blocksToSlide blks = do
699blocksToSlide blks = do
712 slideLevel <- asks envSlideLevel
700 slideLevel <- asks envSlideLevel
701+ modify $ \st -> st{stSpeakerNotes = mempty}
713 blks' <- walkM handleAndFilterNotes blks
702 blks' <- walkM handleAndFilterNotes blks
714 sld <- blocksToSlide' slideLevel blks'
703 sld <- blocksToSlide' slideLevel blks'
715− spkNotes <- getSpeakerNotes
704+ spkNotes <- gets stSpeakerNotes
716 return $ sld{slideSpeakerNotes = spkNotes}
705 return $ sld{slideSpeakerNotes = spkNotes}
717
706
718makeNoteEntry :: Int -> [Block] -> [Block]
707makeNoteEntry :: Int -> [Block] -> [Block]