@@ -1,5 +1,6 @@
1−{-# LANGUAGE NoImplicitPrelude #-}
1+{-# LANGUAGE NoImplicitPrelude #-}
2−{-# LANGUAGE PatternGuards #-}
2+{-# LANGUAGE PatternGuards #-}
3+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
5Copyright (C) 2017-2018 Jesse Rosenthal <jrosenthal@jhu.edu>
6Copyright (C) 2017-2018 Jesse Rosenthal <jrosenthal@jhu.edu>
@@ -185,7 +186,7 @@ data DocProps = DocProps { dcTitle :: Maybe String
186data Slide = Slide { slideId :: SlideId
187data Slide = Slide { slideId :: SlideId
187 , slideLayout :: Layout
188 , slideLayout :: Layout
188− , slideSpeakerNotes :: Maybe SpeakerNotes
189+ , slideSpeakerNotes :: SpeakerNotes
189 } deriving (Show, Eq)
190 } deriving (Show, Eq)
191newtype SlideId = SlideId String
192newtype SlideId = SlideId String
@@ -195,7 +196,7 @@ newtype SlideId = SlideId String
195-- 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
196-- 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.
197newtype SpeakerNotes = SpeakerNotes {fromSpeakerNotes :: [Paragraph]}
198newtype SpeakerNotes = SpeakerNotes {fromSpeakerNotes :: [Paragraph]}
198− deriving (Show, Eq)
199+ deriving (Show, Eq, Monoid)
200data Layout = MetadataSlide { metadataSlideTitle :: [ParaElem]
201data Layout = MetadataSlide { metadataSlideTitle :: [ParaElem]
201 , metadataSlideSubtitle :: [ParaElem]
202 , metadataSlideSubtitle :: [ParaElem]
@@ -631,11 +632,12 @@ splitBlocks' cur acc (blk : blks) = splitBlocks' (cur ++ [blk]) acc blks
631splitBlocks :: [Block] -> Pres [[Block]]
632splitBlocks :: [Block] -> Pres [[Block]]
632splitBlocks = splitBlocks' [] []
633splitBlocks = splitBlocks' [] []
634−getSpeakerNotes :: Pres (Maybe SpeakerNotes)
635+getSpeakerNotes :: Pres SpeakerNotes
635getSpeakerNotes = do
636getSpeakerNotes = do
636 sldId <- asks envCurSlideId
637 sldId <- asks envCurSlideId
637 spkNtsMap <- gets stSpeakerNotesMap
638 spkNtsMap <- gets stSpeakerNotesMap
638− return $ (SpeakerNotes . concat . reverse) <$> M.lookup sldId spkNtsMap
639+ let paras = fromMaybe [] (M.lookup sldId spkNtsMap)
640+ return $ SpeakerNotes $ concat $ reverse paras
640blocksToSlide' :: Int -> [Block] -> Pres Slide
642blocksToSlide' :: Int -> [Block] -> Pres Slide
641blocksToSlide' lvl (Header n (ident, _, _) ils : blks)
643blocksToSlide' lvl (Header n (ident, _, _) ils : blks)
@@ -643,7 +645,7 @@ blocksToSlide' lvl (Header n (ident, _, _) ils : blks)
643 registerAnchorId ident
645 registerAnchorId ident
644 sldId <- asks envCurSlideId
646 sldId <- asks envCurSlideId
645 hdr <- inlinesToParElems ils
647 hdr <- inlinesToParElems ils
646− return $ Slide sldId TitleSlide {titleSlideHeader = hdr} Nothing
648+ return $ Slide sldId TitleSlide {titleSlideHeader = hdr} mempty
647 | n == lvl = do
649 | n == lvl = do
648 registerAnchorId ident
650 registerAnchorId ident
649 hdr <- inlinesToParElems ils
651 hdr <- inlinesToParElems ils
@@ -681,7 +683,7 @@ blocksToSlide' _ (blk : blks)
681 , twoColumnSlideLeft = shapesL
683 , twoColumnSlideLeft = shapesL
682 , twoColumnSlideRight = shapesR
684 , twoColumnSlideRight = shapesR
685blocksToSlide' _ (blk : blks) = do
687blocksToSlide' _ (blk : blks) = do
686 inNoteSlide <- asks envInNoteSlide
688 inNoteSlide <- asks envInNoteSlide
687 shapes <- if inNoteSlide
689 shapes <- if inNoteSlide
@@ -694,7 +696,7 @@ blocksToSlide' _ (blk : blks) = do
694 ContentSlide { contentSlideHeader = []
696 ContentSlide { contentSlideHeader = []
695 , contentSlideContent = shapes
697 , contentSlideContent = shapes
698blocksToSlide' _ [] = do
700blocksToSlide' _ [] = do
699 sldId <- asks envCurSlideId
701 sldId <- asks envCurSlideId
@@ -703,7 +705,7 @@ blocksToSlide' _ [] = do
703 ContentSlide { contentSlideHeader = []
705 ContentSlide { contentSlideHeader = []
704 , contentSlideContent = []
706 , contentSlideContent = []
708blocksToSlide :: [Block] -> Pres Slide
710blocksToSlide :: [Block] -> Pres Slide
709blocksToSlide blks = do
711blocksToSlide blks = do
@@ -771,7 +773,7 @@ getMetaSlide = do
771 , metadataSlideAuthors = authors
773 , metadataSlideAuthors = authors
772 , metadataSlideDate = date
774 , metadataSlideDate = date
776-- adapted from the markdown writer
778-- adapted from the markdown writer
777elementToListItem :: Shared.Element -> Pres [Block]
779elementToListItem :: Shared.Element -> Pres [Block]
@@ -853,11 +855,9 @@ applyToLayout f (TwoColumnSlide hdr contentL contentR) = do
853applyToSlide :: Monad m => (ParaElem -> m ParaElem) -> Slide -> m Slide
855applyToSlide :: Monad m => (ParaElem -> m ParaElem) -> Slide -> m Slide
854applyToSlide f slide = do
856applyToSlide f slide = do
855 layout' <- applyToLayout f $ slideLayout slide
857 layout' <- applyToLayout f $ slideLayout slide
856− mbNotes' <- case slideSpeakerNotes slide of
858+ let paras = fromSpeakerNotes $ slideSpeakerNotes slide
857− Just (SpeakerNotes notes) -> (Just . SpeakerNotes) <$>
858− mapM (applyToParagraph f) notes
859+ notes' <- SpeakerNotes <$> mapM (applyToParagraph f) paras
859− Nothing -> return Nothing
860− return slide{slideLayout = layout', slideSpeakerNotes = mbNotes'}
860+ return slide{slideLayout = layout', slideSpeakerNotes = notes'}
862replaceAnchor :: ParaElem -> Pres ParaElem
862replaceAnchor :: ParaElem -> Pres ParaElem
863replaceAnchor (Run rProps s)
863replaceAnchor (Run rProps s)
@@ -903,8 +903,10 @@ emptyLayout layout = case layout of
903 all emptyShape shapes2
903 all emptyShape shapes2
905emptySlide :: Slide -> Bool
905emptySlide :: Slide -> Bool
906−emptySlide (Slide _ layout Nothing) = emptyLayout layout
906+emptySlide (Slide _ layout notes) =
908+ then emptyLayout layout
907−emptySlide _ = False
909+ else False
909blocksToPresentationSlides :: [Block] -> Pres [Slide]
911blocksToPresentationSlides :: [Block] -> Pres [Slide]
910blocksToPresentationSlides blks = do
912blocksToPresentationSlides blks = do