git.iko.soy/typeable/pandoc
on master help sign in
Powerpoint writer: Remove `Maybe` from `SpeakerNotes` in `Slide`.
59f3997Jesse Rosenthal
src/Text/Pandoc/Writers/Powerpoint/Output.hs+51−53
@@ -283,8 +283,9 @@ makeSlideIdMap (Presentation _ slides) =
283makeSpeakerNotesMap :: Presentation -> M.Map Int Int
283makeSpeakerNotesMap :: Presentation -> M.Map Int Int
284makeSpeakerNotesMap (Presentation _ slides) =
284makeSpeakerNotesMap (Presentation _ slides) =
285 M.fromList $ (mapMaybe f $ slides `zip` [1..]) `zip` [1..]
285 M.fromList $ (mapMaybe f $ slides `zip` [1..]) `zip` [1..]
286− where f (Slide _ _ Nothing, _) = Nothing
286+ where f (Slide _ _ notes, n) = if notes == mempty
287− f (Slide _ _ (Just _), n) = Just n
287+ then Nothing
288+ else Just n
288
289
289presentationToArchive :: PandocMonad m => WriterOptions -> Presentation -> m Archive
290presentationToArchive :: PandocMonad m => WriterOptions -> Presentation -> m Archive
290presentationToArchive opts pres = do
291presentationToArchive opts pres = do
@@ -324,7 +325,7 @@ presentationToArchive opts pres = do
324-- Check to see if the presentation has speaker notes. This will
325-- Check to see if the presentation has speaker notes. This will
325-- influence whether we import the notesMaster template.
326-- influence whether we import the notesMaster template.
326presHasSpeakerNotes :: Presentation -> Bool
327presHasSpeakerNotes :: Presentation -> Bool
327−presHasSpeakerNotes (Presentation _ slides) = any isJust $ map slideSpeakerNotes slides
328+presHasSpeakerNotes (Presentation _ slides) = not $ all (mempty ==) $ map slideSpeakerNotes slides
328
329
329curSlideHasSpeakerNotes :: PandocMonad m => P m Bool
330curSlideHasSpeakerNotes :: PandocMonad m => P m Bool
330curSlideHasSpeakerNotes = do
331curSlideHasSpeakerNotes = do
@@ -1272,42 +1273,40 @@ speakerNotesSlideNumber pgNum fieldId =
1272 ]
1273 ]
1273
1274
1274slideToSpeakerNotesElement :: PandocMonad m => Slide -> P m (Maybe Element)
1275slideToSpeakerNotesElement :: PandocMonad m => Slide -> P m (Maybe Element)
1275−slideToSpeakerNotesElement slide
1276+slideToSpeakerNotesElement (Slide _ _ (SpeakerNotes [])) = return Nothing
1276− | Slide _ _ mbNotes <- slide
1277− , Just (SpeakerNotes paras) <- mbNotes = do
1277+slideToSpeakerNotesElement slide@(Slide _ _ (SpeakerNotes paras)) = do
1278− master <- getNotesMaster
1278+ master <- getNotesMaster
1279− fieldId <- getSlideNumberFieldId master
1279+ fieldId <- getSlideNumberFieldId master
1280− num <- slideNum slide
1280+ num <- slideNum slide
1281− let imgShape = speakerNotesSlideImage
1281+ let imgShape = speakerNotesSlideImage
1282− sldNumShape = speakerNotesSlideNumber num fieldId
1282+ sldNumShape = speakerNotesSlideNumber num fieldId
1283− bodyShape <- speakerNotesBody paras
1283+ bodyShape <- speakerNotesBody paras
1284− return $ Just $
1284+ return $ Just $
1285− mknode "p:notes"
1285+ mknode "p:notes"
1286− [ ("xmlns:a", "http://schemas.openxmlformats.org/drawingml/2006/main")
1286+ [ ("xmlns:a", "http://schemas.openxmlformats.org/drawingml/2006/main")
1287− , ("xmlns:r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships")
1287+ , ("xmlns:r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships")
1288− , ("xmlns:p", "http://schemas.openxmlformats.org/presentationml/2006/main")
1288+ , ("xmlns:p", "http://schemas.openxmlformats.org/presentationml/2006/main")
1289− ] [ mknode "p:cSld" []
1289+ ] [ mknode "p:cSld" []
1290− [ mknode "p:spTree" []
1290+ [ mknode "p:spTree" []
1291− [ mknode "p:nvGrpSpPr" []
1291+ [ mknode "p:nvGrpSpPr" []
1292− [ mknode "p:cNvPr" [("id", "1"), ("name", "")] ()
1292+ [ mknode "p:cNvPr" [("id", "1"), ("name", "")] ()
1293− , mknode "p:cNvGrpSpPr" [] ()
1293+ , mknode "p:cNvGrpSpPr" [] ()
1294− , mknode "p:nvPr" [] ()
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
1307 ]
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+ ]
1308 ]
1303 ]
1304+ , imgShape
1305+ , bodyShape
1306+ , sldNumShape
1309 ]
1307 ]
1310−slideToSpeakerNotesElement _ = return Nothing
1308+ ]
1309+ ]
1311
1310
1312-----------------------------------------------------------------------
1311-----------------------------------------------------------------------
1313
1312
@@ -1482,23 +1481,22 @@ slideToSpeakerNotesEntry slide = do
1482 _ -> return Nothing
1481 _ -> return Nothing
1483
1482
1484slideToSpeakerNotesRelElement :: PandocMonad m => Slide -> P m (Maybe Element)
1483slideToSpeakerNotesRelElement :: PandocMonad m => Slide -> P m (Maybe Element)
1485−slideToSpeakerNotesRelElement slide
1484+slideToSpeakerNotesRelElement (Slide _ _ (SpeakerNotes [])) = return Nothing
1486− | Slide _ _ mbNotes <- slide
1485+slideToSpeakerNotesRelElement slide@(Slide _ _ _) = do
1487− , Just _ <- mbNotes = do
1488− idNum <- slideNum slide
1486+ idNum <- slideNum slide
1489− return $ Just $
1487+ return $ Just $
1490− mknode "Relationships"
1488+ mknode "Relationships"
1491− [("xmlns", "http://schemas.openxmlformats.org/package/2006/relationships")]
1489+ [("xmlns", "http://schemas.openxmlformats.org/package/2006/relationships")]
1492− [ mknode "Relationship" [ ("Id", "rId2")
1490+ [ mknode "Relationship" [ ("Id", "rId2")
1493− , ("Type", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide")
1491+ , ("Type", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide")
1494− , ("Target", "../slides/slide" ++ show idNum ++ ".xml")
1492+ , ("Target", "../slides/slide" ++ show idNum ++ ".xml")
1495− ] ()
1493+ ] ()
1496− , mknode "Relationship" [ ("Id", "rId1")
1494+ , mknode "Relationship" [ ("Id", "rId1")
1497− , ("Type", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster")
1495+ , ("Type", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster")
1498− , ("Target", "../notesMasters/notesMaster1.xml")
1496+ , ("Target", "../notesMasters/notesMaster1.xml")
1499− ] ()
1497+ ] ()
1500− ]
1498+ ]
1501−slideToSpeakerNotesRelElement _ = return Nothing
1499+
1502
1500
1503slideToSpeakerNotesRelEntry :: PandocMonad m => Slide -> P m (Maybe Entry)
1501slideToSpeakerNotesRelEntry :: PandocMonad m => Slide -> P m (Maybe Entry)
1504slideToSpeakerNotesRelEntry slide = do
1502slideToSpeakerNotesRelEntry slide = do
src/Text/Pandoc/Writers/Powerpoint/Presentation.hs+20−18
@@ -1,5 +1,6 @@
1−{-# LANGUAGE NoImplicitPrelude #-}
1+{-# LANGUAGE NoImplicitPrelude #-}
2−{-# LANGUAGE PatternGuards #-}
2+{-# LANGUAGE PatternGuards #-}
3+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
3
4
4{-
5{-
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
185
186
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)
190
191
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)
199
200
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' [] []
633
634
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
639
641
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
683 }
685 }
684− Nothing
686+ mempty
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
696 }
698 }
697− Nothing
699+ mempty
698blocksToSlide' _ [] = do
700blocksToSlide' _ [] = do
699 sldId <- asks envCurSlideId
701 sldId <- asks envCurSlideId
700 return $
702 return $
@@ -703,7 +705,7 @@ blocksToSlide' _ [] = do
703 ContentSlide { contentSlideHeader = []
705 ContentSlide { contentSlideHeader = []
704 , contentSlideContent = []
706 , contentSlideContent = []
705 }
707 }
706− Nothing
708+ mempty
707
709
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
773 }
775 }
774− Nothing
776+ mempty
775
777
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'}
861
861
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
904
904
905emptySlide :: Slide -> Bool
905emptySlide :: Slide -> Bool
906−emptySlide (Slide _ layout Nothing) = emptyLayout layout
906+emptySlide (Slide _ layout notes) =
907+ if notes == mempty
908+ then emptyLayout layout
907−emptySlide _ = False
909+ else False
908
910
909blocksToPresentationSlides :: [Block] -> Pres [Slide]
911blocksToPresentationSlides :: [Block] -> Pres [Slide]
910blocksToPresentationSlides blks = do
912blocksToPresentationSlides blks = do