git.iko.soy/typeable/pandoc
on master help sign in
Powerpoint writer: Remove `Maybe` from `SpeakerNotes` in `Slide`.

Previously, we had treated it as a `Maybe`. But there is no difference between not having speaker notes and having empty speaker notes. So we make the SpeakerNotes newtype into a monoid, and test for memptiness instead of testing for Just/Nothing.

commit59f3997069131abaf9f206604971cc980d69071a authorJesse Rosenthal <jrosenthal@jhu.edu> dateFri 23 Mar 2018, 13:00 (9 years ago) parent0987aa2
2 files changed+71−71
src/Text/Pandoc/Writers/Powerpoint/Output.hs+51−53 src/Text/Pandoc/Writers/Powerpoint/Presentation.hs+20−18
src/Text/Pandoc/Writers/Powerpoint/Output.hs+51−53
@@ -283,8 +283,9 @@ makeSlideIdMap (Presentation _ slides) =
283283makeSpeakerNotesMap :: Presentation -> M.Map Int Int
284284makeSpeakerNotesMap (Presentation _ slides) =
285285 M.fromList $ (mapMaybe f $ slides `zip` [1..]) `zip` [1..]
286− where f (Slide _ _ Nothing, _) = Nothing
287− f (Slide _ _ (Just _), n) = Just n
286+ where f (Slide _ _ notes, n) = if notes == mempty
287+ then Nothing
288+ else Just n
288289
289290presentationToArchive :: PandocMonad m => WriterOptions -> Presentation -> m Archive
290291presentationToArchive opts pres = do
@@ -324,7 +325,7 @@ presentationToArchive opts pres = do
324325-- Check to see if the presentation has speaker notes. This will
325326-- influence whether we import the notesMaster template.
326327presHasSpeakerNotes :: Presentation -> Bool
327−presHasSpeakerNotes (Presentation _ slides) = any isJust $ map slideSpeakerNotes slides
328+presHasSpeakerNotes (Presentation _ slides) = not $ all (mempty ==) $ map slideSpeakerNotes slides
328329
329330curSlideHasSpeakerNotes :: PandocMonad m => P m Bool
330331curSlideHasSpeakerNotes = do
@@ -1272,42 +1273,40 @@ speakerNotesSlideNumber pgNum fieldId =
12721273 ]
12731274
12741275slideToSpeakerNotesElement :: PandocMonad m => Slide -> P m (Maybe Element)
1275−slideToSpeakerNotesElement slide
1276− | Slide _ _ mbNotes <- slide
1277− , Just (SpeakerNotes paras) <- mbNotes = do
1278− master <- getNotesMaster
1279− fieldId <- getSlideNumberFieldId master
1280− num <- slideNum slide
1281− let imgShape = speakerNotesSlideImage
1282− sldNumShape = speakerNotesSlideNumber num fieldId
1283− bodyShape <- speakerNotesBody paras
1284− return $ Just $
1285− mknode "p:notes"
1286− [ ("xmlns:a", "http://schemas.openxmlformats.org/drawingml/2006/main")
1287− , ("xmlns:r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships")
1288− , ("xmlns:p", "http://schemas.openxmlformats.org/presentationml/2006/main")
1289− ] [ mknode "p:cSld" []
1290− [ mknode "p:spTree" []
1291− [ mknode "p:nvGrpSpPr" []
1292− [ mknode "p:cNvPr" [("id", "1"), ("name", "")] ()
1293− , mknode "p:cNvGrpSpPr" [] ()
1294− , mknode "p:nvPr" [] ()
1295− ]
1296− , mknode "p:grpSpPr" []
1297− [ mknode "a:xfrm" []
1298− [ mknode "a:off" [("x", "0"), ("y", "0")] ()
1299− , mknode "a:ext" [("cx", "0"), ("cy", "0")] ()
1300− , mknode "a:chOff" [("x", "0"), ("y", "0")] ()
1301− , mknode "a:chExt" [("cx", "0"), ("cy", "0")] ()
1302− ]
1303− ]
1304− , imgShape
1305− , bodyShape
1306− , sldNumShape
1276+slideToSpeakerNotesElement (Slide _ _ (SpeakerNotes [])) = return Nothing
1277+slideToSpeakerNotesElement slide@(Slide _ _ (SpeakerNotes paras)) = do
1278+ master <- getNotesMaster
1279+ fieldId <- getSlideNumberFieldId master
1280+ num <- slideNum slide
1281+ let imgShape = speakerNotesSlideImage
1282+ sldNumShape = speakerNotesSlideNumber num fieldId
1283+ bodyShape <- speakerNotesBody paras
1284+ return $ Just $
1285+ mknode "p:notes"
1286+ [ ("xmlns:a", "http://schemas.openxmlformats.org/drawingml/2006/main")
1287+ , ("xmlns:r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships")
1288+ , ("xmlns:p", "http://schemas.openxmlformats.org/presentationml/2006/main")
1289+ ] [ mknode "p:cSld" []
1290+ [ mknode "p:spTree" []
1291+ [ mknode "p:nvGrpSpPr" []
1292+ [ mknode "p:cNvPr" [("id", "1"), ("name", "")] ()
1293+ , mknode "p:cNvGrpSpPr" [] ()
1294+ , mknode "p:nvPr" [] ()
13071295 ]
1296+ , mknode "p:grpSpPr" []
1297+ [ mknode "a:xfrm" []
1298+ [ mknode "a:off" [("x", "0"), ("y", "0")] ()
1299+ , mknode "a:ext" [("cx", "0"), ("cy", "0")] ()
1300+ , mknode "a:chOff" [("x", "0"), ("y", "0")] ()
1301+ , mknode "a:chExt" [("cx", "0"), ("cy", "0")] ()
1302+ ]
13081303 ]
1304+ , imgShape
1305+ , bodyShape
1306+ , sldNumShape
13091307 ]
1310−slideToSpeakerNotesElement _ = return Nothing
1308+ ]
1309+ ]
13111310
13121311-----------------------------------------------------------------------
13131312
@@ -1482,23 +1481,22 @@ slideToSpeakerNotesEntry slide = do
14821481 _ -> return Nothing
14831482
14841483slideToSpeakerNotesRelElement :: PandocMonad m => Slide -> P m (Maybe Element)
1485−slideToSpeakerNotesRelElement slide
1486− | Slide _ _ mbNotes <- slide
1487− , Just _ <- mbNotes = do
1488− idNum <- slideNum slide
1489− return $ Just $
1490− mknode "Relationships"
1491− [("xmlns", "http://schemas.openxmlformats.org/package/2006/relationships")]
1492− [ mknode "Relationship" [ ("Id", "rId2")
1493− , ("Type", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide")
1494− , ("Target", "../slides/slide" ++ show idNum ++ ".xml")
1495− ] ()
1496− , mknode "Relationship" [ ("Id", "rId1")
1497− , ("Type", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster")
1498− , ("Target", "../notesMasters/notesMaster1.xml")
1499− ] ()
1500− ]
1501−slideToSpeakerNotesRelElement _ = return Nothing
1484+slideToSpeakerNotesRelElement (Slide _ _ (SpeakerNotes [])) = return Nothing
1485+slideToSpeakerNotesRelElement slide@(Slide _ _ _) = do
1486+ idNum <- slideNum slide
1487+ return $ Just $
1488+ mknode "Relationships"
1489+ [("xmlns", "http://schemas.openxmlformats.org/package/2006/relationships")]
1490+ [ mknode "Relationship" [ ("Id", "rId2")
1491+ , ("Type", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide")
1492+ , ("Target", "../slides/slide" ++ show idNum ++ ".xml")
1493+ ] ()
1494+ , mknode "Relationship" [ ("Id", "rId1")
1495+ , ("Type", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster")
1496+ , ("Target", "../notesMasters/notesMaster1.xml")
1497+ ] ()
1498+ ]
1499+
15021500
15031501slideToSpeakerNotesRelEntry :: PandocMonad m => Slide -> P m (Maybe Entry)
15041502slideToSpeakerNotesRelEntry slide = do
src/Text/Pandoc/Writers/Powerpoint/Presentation.hs+20−18
@@ -1,5 +1,6 @@
1−{-# LANGUAGE NoImplicitPrelude #-}
2−{-# LANGUAGE PatternGuards #-}
1+{-# LANGUAGE NoImplicitPrelude #-}
2+{-# LANGUAGE PatternGuards #-}
3+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
34
45{-
56Copyright (C) 2017-2018 Jesse Rosenthal <jrosenthal@jhu.edu>
@@ -185,7 +186,7 @@ data DocProps = DocProps { dcTitle :: Maybe String
185186
186187data Slide = Slide { slideId :: SlideId
187188 , slideLayout :: Layout
188− , slideSpeakerNotes :: Maybe SpeakerNotes
189+ , slideSpeakerNotes :: SpeakerNotes
189190 } deriving (Show, Eq)
190191
191192newtype SlideId = SlideId String
@@ -195,7 +196,7 @@ newtype SlideId = SlideId String
195196-- designed mainly for one textbox, so we'll just put in the contents
196197-- of that textbox, to avoid other shapes that won't work as well.
197198newtype SpeakerNotes = SpeakerNotes {fromSpeakerNotes :: [Paragraph]}
198− deriving (Show, Eq)
199+ deriving (Show, Eq, Monoid)
199200
200201data Layout = MetadataSlide { metadataSlideTitle :: [ParaElem]
201202 , metadataSlideSubtitle :: [ParaElem]
@@ -631,11 +632,12 @@ splitBlocks' cur acc (blk : blks) = splitBlocks' (cur ++ [blk]) acc blks
631632splitBlocks :: [Block] -> Pres [[Block]]
632633splitBlocks = splitBlocks' [] []
633634
634−getSpeakerNotes :: Pres (Maybe SpeakerNotes)
635+getSpeakerNotes :: Pres SpeakerNotes
635636getSpeakerNotes = do
636637 sldId <- asks envCurSlideId
637638 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
639641
640642blocksToSlide' :: Int -> [Block] -> Pres Slide
641643blocksToSlide' lvl (Header n (ident, _, _) ils : blks)
@@ -643,7 +645,7 @@ blocksToSlide' lvl (Header n (ident, _, _) ils : blks)
643645 registerAnchorId ident
644646 sldId <- asks envCurSlideId
645647 hdr <- inlinesToParElems ils
646− return $ Slide sldId TitleSlide {titleSlideHeader = hdr} Nothing
648+ return $ Slide sldId TitleSlide {titleSlideHeader = hdr} mempty
647649 | n == lvl = do
648650 registerAnchorId ident
649651 hdr <- inlinesToParElems ils
@@ -681,7 +683,7 @@ blocksToSlide' _ (blk : blks)
681683 , twoColumnSlideLeft = shapesL
682684 , twoColumnSlideRight = shapesR
683685 }
684− Nothing
686+ mempty
685687blocksToSlide' _ (blk : blks) = do
686688 inNoteSlide <- asks envInNoteSlide
687689 shapes <- if inNoteSlide
@@ -694,7 +696,7 @@ blocksToSlide' _ (blk : blks) = do
694696 ContentSlide { contentSlideHeader = []
695697 , contentSlideContent = shapes
696698 }
697− Nothing
699+ mempty
698700blocksToSlide' _ [] = do
699701 sldId <- asks envCurSlideId
700702 return $
@@ -703,7 +705,7 @@ blocksToSlide' _ [] = do
703705 ContentSlide { contentSlideHeader = []
704706 , contentSlideContent = []
705707 }
706− Nothing
708+ mempty
707709
708710blocksToSlide :: [Block] -> Pres Slide
709711blocksToSlide blks = do
@@ -771,7 +773,7 @@ getMetaSlide = do
771773 , metadataSlideAuthors = authors
772774 , metadataSlideDate = date
773775 }
774− Nothing
776+ mempty
775777
776778-- adapted from the markdown writer
777779elementToListItem :: Shared.Element -> Pres [Block]
@@ -853,11 +855,9 @@ applyToLayout f (TwoColumnSlide hdr contentL contentR) = do
853855applyToSlide :: Monad m => (ParaElem -> m ParaElem) -> Slide -> m Slide
854856applyToSlide f slide = do
855857 layout' <- applyToLayout f $ slideLayout slide
856− mbNotes' <- case slideSpeakerNotes slide of
857− Just (SpeakerNotes notes) -> (Just . SpeakerNotes) <$>
858− mapM (applyToParagraph f) notes
859− Nothing -> return Nothing
860− return slide{slideLayout = layout', slideSpeakerNotes = mbNotes'}
858+ let paras = fromSpeakerNotes $ slideSpeakerNotes slide
859+ notes' <- SpeakerNotes <$> mapM (applyToParagraph f) paras
860+ return slide{slideLayout = layout', slideSpeakerNotes = notes'}
861861
862862replaceAnchor :: ParaElem -> Pres ParaElem
863863replaceAnchor (Run rProps s)
@@ -903,8 +903,10 @@ emptyLayout layout = case layout of
903903 all emptyShape shapes2
904904
905905emptySlide :: Slide -> Bool
906−emptySlide (Slide _ layout Nothing) = emptyLayout layout
907−emptySlide _ = False
906+emptySlide (Slide _ layout notes) =
907+ if notes == mempty
908+ then emptyLayout layout
909+ else False
908910
909911blocksToPresentationSlides :: [Block] -> Pres [Slide]
910912blocksToPresentationSlides blks = do