@@ -41,7 +41,7 @@ import Text.Pandoc.MIME
4141import qualified Data.ByteString.Lazy as BL
4242import Text.Pandoc.Writers.OOXML
4343import qualified Data.Map as M
44−import Data.Maybe (mapMaybe, listToMaybe, fromMaybe, maybeToList, catMaybes, isNothing)
44+import Data.Maybe (mapMaybe, listToMaybe, fromMaybe, maybeToList, catMaybes, isJust)
4545import Text.Pandoc.ImageSize
4646import Control.Applicative ((<|>))
4747import System.FilePath.Glob
@@ -254,7 +254,7 @@ presentationToArchiveP p@(Presentation docProps slides) = do
254254 (throwError $
255255 PandocSomeError $
256256 "The following required files are missing:\n" <>
257− (T.unlines $ map (T.pack . (" " <>)) missingFiles)
257+ T.unlines (map (T.pack . (" " <>)) missingFiles)
258258 )
259259
260260 newArch' <- foldM copyFileToArchive emptyArchive filePaths
@@ -291,11 +291,12 @@ presentationToArchiveP p@(Presentation docProps slides) = do
291291
292292makeSlideIdMap :: Presentation -> M.Map SlideId Int
293293makeSlideIdMap (Presentation _ slides) =
294− M.fromList $ (map slideId slides) `zip` [1..]
294+ M.fromList $ map slideId slides `zip` [1..]
295295
296296makeSpeakerNotesMap :: Presentation -> M.Map Int Int
297297makeSpeakerNotesMap (Presentation _ slides) =
298− M.fromList $ (mapMaybe f $ slides `zip` [1..]) `zip` [1..]
298+ M.fromList $
299+ mapMaybe f (slides `zip` [1..]) `zip` [1..]
299300 where f (Slide _ _ notes, n) = if notes == mempty
300301 then Nothing
301302 else Just n
@@ -350,10 +351,10 @@ curSlideHasSpeakerNotes =
350351getLayout :: PandocMonad m => Layout -> P m Element
351352getLayout layout = do
352353 let layoutpath = case layout of
353− (MetadataSlide _ _ _ _) -> "ppt/slideLayouts/slideLayout1.xml"
354+ (MetadataSlide{}) -> "ppt/slideLayouts/slideLayout1.xml"
354355 (TitleSlide _) -> "ppt/slideLayouts/slideLayout3.xml"
355356 (ContentSlide _ _) -> "ppt/slideLayouts/slideLayout2.xml"
356− (TwoColumnSlide _ _ _) -> "ppt/slideLayouts/slideLayout4.xml"
357+ (TwoColumnSlide{}) -> "ppt/slideLayouts/slideLayout4.xml"
357358 refArchive <- asks envRefArchive
358359 distArchive <- asks envDistArchive
359360 parseXml refArchive distArchive layoutpath
@@ -409,7 +410,7 @@ getMasterShapeDimensionsById ident master = do
409410 let ns = elemToNameSpaces master
410411 cSld <- findChild (elemName ns "p" "cSld") master
411412 spTree <- findChild (elemName ns "p" "spTree") cSld
412− sp <- filterChild (\e -> (isElem ns "p" "sp" e) && (shapeHasId ns ident e)) spTree
413+ sp <- filterChild (\e -> isElem ns "p" "sp" e && shapeHasId ns ident e) spTree
413414 getShapeDimensions ns sp
414415
415416getContentShapeSize :: PandocMonad m
@@ -457,7 +458,7 @@ replaceNamedChildren ns prefix name newKids element =
457458 where
458459 fun :: Bool -> [Content] -> [[Content]]
459460 fun _ [] = []
460− fun switch ((Elem e) : conts) | isElem ns prefix name e =
461+ fun switch (Elem e : conts) | isElem ns prefix name e =
461462 if switch
462463 then map Elem newKids : fun False conts
463464 else fun False conts
@@ -522,9 +523,7 @@ registerMedia fp caption = do
522523 Just Emf -> Just ".emf"
523524 Nothing -> Nothing
524525
525− let newGlobalId = case M.lookup fp globalIds of
526− Just ident -> ident
527− Nothing -> maxGlobalId + 1
526+ let newGlobalId = fromMaybe (maxGlobalId + 1) (M.lookup fp globalIds)
528527
529528 let newGlobalIds = M.insert fp newGlobalId globalIds
530529
@@ -550,10 +549,9 @@ makeMediaEntry :: PandocMonad m => MediaInfo -> P m Entry
550549makeMediaEntry mInfo = do
551550 epochtime <- (floor . utcTimeToPOSIXSeconds) <$> asks envUTCTime
552551 (imgBytes, _) <- P.fetchItem (T.pack $ mInfoFilePath mInfo)
553− let ext = case mInfoExt mInfo of
554− Just e -> e
555− Nothing -> ""
556− let fp = "ppt/media/image" <> (show $ mInfoGlobalId mInfo) <> T.unpack ext
552+ let ext = fromMaybe "" (mInfoExt mInfo)
553+ let fp = "ppt/media/image" <>
554+ show (mInfoGlobalId mInfo) <> T.unpack ext
557555 return $ toEntry fp epochtime $ BL.fromStrict imgBytes
558556
559557makeMediaEntries :: PandocMonad m => P m [Entry]
@@ -717,7 +715,8 @@ makePicElements layout picProps mInfo alt = do
717715 , cNvPicPr
718716 , mknode "p:nvPr" [] ()]
719717 let blipFill = mknode "p:blipFill" []
720− [ mknode "a:blip" [("r:embed", "rId" <> (show $ mInfoLocalId mInfo))] ()
718+ [ mknode "a:blip" [("r:embed", "rId" <>
719+ show (mInfoLocalId mInfo))] ()
721720 , mknode "a:stretch" [] $
722721 mknode "a:fillRect" [] () ]
723722 let xfrm = mknode "a:xfrm" []
@@ -750,9 +749,12 @@ paraElemToElements Break = return [mknode "a:br" [] ()]
750749paraElemToElements (Run rpr s) = do
751750 sizeAttrs <- fontSizeAttributes rpr
752751 let attrs = sizeAttrs <>
753− (if rPropBold rpr then [("b", "1")] else []) <>
754− (if rPropItalics rpr then [("i", "1")] else []) <>
755− (if rPropUnderline rpr then [("u", "sng")] else []) <>
752+ (
753+ [("b", "1") | rPropBold rpr]) <>
754+ (
755+ [("i", "1") | rPropItalics rpr]) <>
756+ (
757+ [("u", "sng") | rPropUnderline rpr]) <>
756758 (case rStrikethrough rpr of
757759 Just NoStrike -> [("strike", "noStrike")]
758760 Just SingleStrike -> [("strike", "sngStrike")]
@@ -796,9 +798,8 @@ paraElemToElements (Run rpr s) = do
796798 _ -> []
797799 Nothing -> []
798800 codeFont <- monospaceFont
799− let codeContents = if rPropCode rpr
800− then [mknode "a:latin" [("typeface", T.unpack codeFont)] ()]
801− else []
801+ let codeContents =
802+ [mknode "a:latin" [("typeface", T.unpack codeFont)] () | rPropCode rpr]
802803 let propContents = linkProps <> colorContents <> codeContents
803804 return [mknode "a:r" [] [ mknode "a:rPr" attrs propContents
804805 , mknode "a:t" [] $ T.unpack s
@@ -817,7 +818,7 @@ paraElemToElements (RawOOXMLParaElem str) = return [ x | Elem x <- parseXML str
817818-- step at a time.
818819addMathInfo :: Element -> Element
819820addMathInfo element =
820− let mathspace = Attr { attrKey = (QName "m" Nothing (Just "xmlns"))
821+ let mathspace = Attr { attrKey = QName "m" Nothing (Just "xmlns")
821822 , attrVal = "http://schemas.openxmlformats.org/officeDocument/2006/math"
822823 }
823824 in add_attr mathspace element
@@ -920,7 +921,7 @@ graphicFrameToElements layout tbls caption = do
920921 `catchError`
921922 (\_ -> return ((0, 0), (pageWidth, pageHeight)))
922923
923− let cy = if (not $ null caption) then cytmp - captionHeight else cytmp
924+ let cy = if not $ null caption then cytmp - captionHeight else cytmp
924925
925926 elements <- mapM (graphicToElement cx) tbls
926927 let graphicFrameElts =
@@ -938,7 +939,7 @@ graphicFrameToElements layout tbls caption = do
938939 ]
939940 ] <> elements
940941
941− if (not $ null caption)
942+ if not $ null caption
942943 then do capElt <- createCaption ((x, y), (cx, cytmp)) caption
943944 return [graphicFrameElts, capElt]
944945 else return [graphicFrameElts]
@@ -1079,9 +1080,7 @@ contentToElement layout hdrShape shapes
10791080 , Just cSld <- findChild (elemName ns "p" "cSld") layout
10801081 , Just spTree <- findChild (elemName ns "p" "spTree") cSld = do
10811082 element <- nonBodyTextToElement layout [PHType "title"] hdrShape
1082− let hdrShapeElements = if null hdrShape
1083− then []
1084− else [element]
1083+ let hdrShapeElements = [element | not (null hdrShape)]
10851084 contentElements <- local
10861085 (\env -> env {envContentType = NormalContent})
10871086 (shapesToElements layout shapes)
@@ -1094,9 +1093,7 @@ twoColumnToElement layout hdrShape shapesL shapesR
10941093 , Just cSld <- findChild (elemName ns "p" "cSld") layout
10951094 , Just spTree <- findChild (elemName ns "p" "spTree") cSld = do
10961095 element <- nonBodyTextToElement layout [PHType "title"] hdrShape
1097− let hdrShapeElements = if null hdrShape
1098− then []
1099− else [element]
1096+ let hdrShapeElements = [element | not (null hdrShape)]
11001097 contentElementsL <- local
11011098 (\env -> env {envContentType =TwoColumnLeftContent})
11021099 (shapesToElements layout shapesL)
@@ -1115,9 +1112,7 @@ titleToElement layout titleElems
11151112 , Just cSld <- findChild (elemName ns "p" "cSld") layout
11161113 , Just spTree <- findChild (elemName ns "p" "spTree") cSld = do
11171114 element <- nonBodyTextToElement layout [PHType "title", PHType "ctrTitle"] titleElems
1118− let titleShapeElements = if null titleElems
1119− then []
1120− else [element]
1115+ let titleShapeElements = [element | not (null titleElems)]
11211116 return $ buildSpTree ns spTree titleShapeElements
11221117titleToElement _ _ = return $ mknode "p:sp" [] ()
11231118
@@ -1395,12 +1390,10 @@ presentationToRels :: PandocMonad m => Presentation -> P m [Relationship]
13951390presentationToRels pres@(Presentation _ slides) = do
13961391 mySlideRels <- mapM slideToPresRel slides
13971392 let notesMasterRels =
1398− if presHasSpeakerNotes pres
1399− then [Relationship { relId = length mySlideRels + 2
1400− , relType = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster"
1401− , relTarget = "notesMasters/notesMaster1.xml"
1402− }]
1403− else []
1393+ [Relationship { relId = length mySlideRels + 2
1394+ , relType = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/notesMaster"
1395+ , relTarget = "notesMasters/notesMaster1.xml"
1396+ } | presHasSpeakerNotes pres]
14041397 insertedRels = mySlideRels <> notesMasterRels
14051398 rels <- getRels
14061399 -- we remove the slide rels and the notesmaster (if it's
@@ -1459,7 +1452,8 @@ topLevelRelsEntry :: PandocMonad m => P m Entry
14591452topLevelRelsEntry = elemToEntry "_rels/.rels" $ relsToElement topLevelRels
14601453
14611454relToElement :: Relationship -> Element
1462−relToElement rel = mknode "Relationship" [ ("Id", "rId" <> (show $ relId rel))
1455+relToElement rel = mknode "Relationship" [ ("Id", "rId" <>
1456+ show (relId rel))
14631457 , ("Type", T.unpack $ relType rel)
14641458 , ("Target", relTarget rel) ] ()
14651459
@@ -1502,7 +1496,8 @@ slideToSpeakerNotesEntry slide = do
15021496
15031497slideToSpeakerNotesRelElement :: PandocMonad m => Slide -> P m (Maybe Element)
15041498slideToSpeakerNotesRelElement (Slide _ _ (SpeakerNotes [])) = return Nothing
1505−slideToSpeakerNotesRelElement slide@(Slide _ _ _) = do
1499+slideToSpeakerNotesRelElement slide@(
1500+ Slide{}) = do
15061501 idNum <- slideNum slide
15071502 return $ Just $
15081503 mknode "Relationships"
@@ -1559,13 +1554,13 @@ linkRelElements mp = mapM linkRelElement (M.toList mp)
15591554
15601555mediaRelElement :: MediaInfo -> Element
15611556mediaRelElement mInfo =
1562− let ext = case mInfoExt mInfo of
1563− Just e -> e
1564− Nothing -> ""
1557+ let ext = fromMaybe "" (mInfoExt mInfo)
15651558 in
1566− mknode "Relationship" [ ("Id", "rId" <> (show $ mInfoLocalId mInfo))
1559+ mknode "Relationship" [ ("Id", "rId" <>
1560+ show (mInfoLocalId mInfo))
15671561 , ("Type", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image")
1568− , ("Target", "../media/image" <> (show $ mInfoGlobalId mInfo) <> T.unpack ext)
1562+ , ("Target", "../media/image" <>
1563+ show (mInfoGlobalId mInfo) <> T.unpack ext)
15691564 ] ()
15701565
15711566speakerNotesSlideRelElement :: PandocMonad m => Slide -> P m (Maybe Element)
@@ -1586,10 +1581,10 @@ slideToSlideRelElement :: PandocMonad m => Slide -> P m Element
15861581slideToSlideRelElement slide = do
15871582 idNum <- slideNum slide
15881583 let target = case slide of
1589− (Slide _ (MetadataSlide _ _ _ _) _) -> "../slideLayouts/slideLayout1.xml"
1584+ (Slide _ (MetadataSlide{}) _) -> "../slideLayouts/slideLayout1.xml"
15901585 (Slide _ (TitleSlide _) _) -> "../slideLayouts/slideLayout3.xml"
15911586 (Slide _ (ContentSlide _ _) _) -> "../slideLayouts/slideLayout2.xml"
1592− (Slide _ (TwoColumnSlide _ _ _) _) -> "../slideLayouts/slideLayout4.xml"
1587+ (Slide _ (TwoColumnSlide{}) _) -> "../slideLayouts/slideLayout4.xml"
15931588
15941589 speakerNotesRels <- maybeToList <$> speakerNotesSlideRelElement slide
15951590
@@ -1696,15 +1691,15 @@ docPropsElement docProps = do
16961691 ,("xmlns:dcterms","http://purl.org/dc/terms/")
16971692 ,("xmlns:dcmitype","http://purl.org/dc/dcmitype/")
16981693 ,("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance")]
1699− $ (mknode "dc:title" [] $ maybe "" T.unpack $ dcTitle docProps)
1700− : (mknode "dc:creator" [] $ maybe "" T.unpack $ dcCreator docProps)
1701− : (mknode "cp:keywords" [] $ T.unpack keywords)
1702− : (if isNothing (dcSubject docProps) then [] else
1703− [mknode "dc:subject" [] $ maybe "" T.unpack $ dcSubject docProps])
1704− <> (if isNothing (dcDescription docProps) then [] else
1705− [mknode "dc:description" [] $ maybe "" T.unpack $ dcDescription docProps])
1706− <> (if isNothing (cpCategory docProps) then [] else
1707− [mknode "cp:category" [] $ maybe "" T.unpack $ cpCategory docProps])
1694+ $
1695+ mknode "dc:title" [] (maybe "" T.unpack $ dcTitle docProps)
1696+ :
1697+ mknode "dc:creator" [] (maybe "" T.unpack $ dcCreator docProps)
1698+ :
1699+ mknode "cp:keywords" [] (T.unpack keywords)
1700+ : ( [mknode "dc:subject" [] $ maybe "" T.unpack $ dcSubject docProps | isJust (dcSubject docProps)])
1701+ <> ( [mknode "dc:description" [] $ maybe "" T.unpack $ dcDescription docProps | isJust (dcDescription docProps)])
1702+ <> ( [mknode "cp:category" [] $ maybe "" T.unpack $ cpCategory docProps | isJust (cpCategory docProps)])
17081703 <> (\x -> [ mknode "dcterms:created" [("xsi:type","dcterms:W3CDTF")] x
17091704 , mknode "dcterms:modified" [("xsi:type","dcterms:W3CDTF")] x
17101705 ]) (formatTime defaultTimeLocale "%FT%XZ" utctime)
@@ -1739,7 +1734,8 @@ viewPropsElement = do
17391734 viewPrElement <- parseXml refArchive distArchive "ppt/viewProps.xml"
17401735 -- remove "lastView" if it exists:
17411736 let notLastView :: Text.XML.Light.Attr -> Bool
1742− notLastView attr = (qName $ attrKey attr) /= "lastView"
1737+ notLastView attr =
1738+ qName (attrKey attr) /= "lastView"
17431739 return $
17441740 viewPrElement {elAttribs = filter notLastView (elAttribs viewPrElement)}
17451741
@@ -1765,8 +1761,9 @@ contentTypesToElement ct =
17651761 let ns = "http://schemas.openxmlformats.org/package/2006/content-types"
17661762 in
17671763 mknode "Types" [("xmlns", ns)] $
1768− (map defaultContentTypeToElem $ contentTypesDefaults ct) <>
1769− (map overrideContentTypeToElem $ contentTypesOverrides ct)
1764+
1765+ map defaultContentTypeToElem (contentTypesDefaults ct) <>
1766+ map overrideContentTypeToElem (contentTypesOverrides ct)
17701767
17711768data DefaultContentType = DefaultContentType
17721769 { defContentTypesExt :: T.Text
@@ -1789,16 +1786,14 @@ contentTypesToEntry :: PandocMonad m => ContentTypes -> P m Entry
17891786contentTypesToEntry ct = elemToEntry "[Content_Types].xml" $ contentTypesToElement ct
17901787
17911788pathToOverride :: FilePath -> Maybe OverrideContentType
1792−pathToOverride fp = OverrideContentType ("/" <> fp) <$> (getContentType fp)
1789+pathToOverride fp = OverrideContentType ("/" <> fp) <$> getContentType fp
17931790
17941791mediaFileContentType :: FilePath -> Maybe DefaultContentType
17951792mediaFileContentType fp = case takeExtension fp of
17961793 '.' : ext -> Just $
17971794 DefaultContentType { defContentTypesExt = T.pack ext
17981795 , defContentTypesType =
1799− case getMimeType fp of
1800− Just mt -> mt
1801− Nothing -> "application/octet-stream"
1796+ fromMaybe "application/octet-stream" (getMimeType fp)
18021797 }
18031798 _ -> Nothing
18041799
@@ -1808,9 +1803,7 @@ mediaContentType mInfo
18081803 , Just ('.', ext) <- T.uncons t =
18091804 Just $ DefaultContentType { defContentTypesExt = ext
18101805 , defContentTypesType =
1811− case mInfoMimeType mInfo of
1812− Just mt -> mt
1813− Nothing -> "application/octet-stream"
1806+ fromMaybe "application/octet-stream" (mInfoMimeType mInfo)
18141807 }
18151808 | otherwise = Nothing
18161809
@@ -1842,7 +1835,7 @@ presentationToContentTypes p@(Presentation _ slides) = do
18421835 let slideOverrides = mapMaybe
18431836 (\fp -> pathToOverride $ "ppt/slides/" <> fp)
18441837 relativePaths
1845− speakerNotesOverrides <- (mapMaybe pathToOverride) <$> getSpeakerNotesFilePaths
1838+ speakerNotesOverrides <- mapMaybe pathToOverride <$> getSpeakerNotesFilePaths
18461839 return $ ContentTypes
18471840 (defaults <> mediaDefaults)
18481841 (inheritedOverrides <> createdOverrides <> slideOverrides <> speakerNotesOverrides)
@@ -1862,22 +1855,22 @@ getContentType fp
18621855 | fp == "docProps/core.xml" = Just "application/vnd.openxmlformats-package.core-properties+xml"
18631856 | fp == "docProps/custom.xml" = Just "application/vnd.openxmlformats-officedocument.custom-properties+xml"
18641857 | fp == "docProps/app.xml" = Just $ noPresML <> ".extended-properties+xml"
1865− | "ppt" : "slideMasters" : f : [] <- splitDirectories fp
1858+ | ["ppt", "slideMasters", f] <- splitDirectories fp
18661859 , (_, ".xml") <- splitExtension f =
18671860 Just $ presML <> ".slideMaster+xml"
1868− | "ppt" : "slides" : f : [] <- splitDirectories fp
1861+ | ["ppt", "slides", f] <- splitDirectories fp
18691862 , (_, ".xml") <- splitExtension f =
18701863 Just $ presML <> ".slide+xml"
1871− | "ppt" : "notesMasters" : f : [] <- splitDirectories fp
1864+ | ["ppt", "notesMasters", f] <- splitDirectories fp
18721865 , (_, ".xml") <- splitExtension f =
18731866 Just $ presML <> ".notesMaster+xml"
1874− | "ppt" : "notesSlides" : f : [] <- splitDirectories fp
1867+ | ["ppt", "notesSlides", f] <- splitDirectories fp
18751868 , (_, ".xml") <- splitExtension f =
18761869 Just $ presML <> ".notesSlide+xml"
1877− | "ppt" : "theme" : f : [] <- splitDirectories fp
1870+ | ["ppt", "theme", f] <- splitDirectories fp
18781871 , (_, ".xml") <- splitExtension f =
18791872 Just $ noPresML <> ".theme+xml"
1880− | "ppt" : "slideLayouts" : _ : [] <- splitDirectories fp=
1873+ | ["ppt", "slideLayouts", _] <- splitDirectories fp=
18811874 Just $ presML <> ".slideLayout+xml"
18821875 | otherwise = Nothing
18831876
@@ -1886,9 +1879,7 @@ autoNumAttrs :: ListAttributes -> [(String, String)]
18861879autoNumAttrs (startNum, numStyle, numDelim) =
18871880 numAttr <> typeAttr
18881881 where
1889− numAttr = if startNum == 1
1890− then []
1891− else [("startAt", show startNum)]
1882+ numAttr = [("startAt", show startNum) | startNum /= 1]
18921883 typeAttr = [("type", typeString <> delimString)]
18931884 typeString = case numStyle of
18941885 Decimal -> "arabic"