git.iko.soy/typeable/pandoc
on master help sign in
Powerpoint writer: Read speaker note templates conditionally
eace235Jesse Rosenthal
src/Text/Pandoc/Writers/Powerpoint/Output.hs+38−18
@@ -56,7 +56,7 @@ import Text.Pandoc.MIME
56import qualified Data.ByteString.Lazy as BL
56import qualified Data.ByteString.Lazy as BL
57import Text.Pandoc.Writers.OOXML
57import Text.Pandoc.Writers.OOXML
58import qualified Data.Map as M
58import qualified Data.Map as M
59−import Data.Maybe (mapMaybe, listToMaybe, fromMaybe)
59+import Data.Maybe (mapMaybe, listToMaybe, fromMaybe, isJust)
60import Text.Pandoc.ImageSize
60import Text.Pandoc.ImageSize
61import Control.Applicative ((<|>))
61import Control.Applicative ((<|>))
62import System.FilePath.Glob
62import System.FilePath.Glob
@@ -167,19 +167,35 @@ copyFileToArchive arch fp = do
167 Nothing -> fail $ fp ++ " missing in reference file"
167 Nothing -> fail $ fp ++ " missing in reference file"
168 Just e -> return $ addEntryToArchive e arch
168 Just e -> return $ addEntryToArchive e arch
169
169
170−inheritedPatterns :: [Pattern]
170+alwaysInheritedPatterns :: [Pattern]
171+alwaysInheritedPatterns =
171−inheritedPatterns = map compile [ "docProps/app.xml"
172+ map compile [ "docProps/app.xml"
172− , "ppt/slideLayouts/slideLayout*.xml"
173+ , "ppt/slideLayouts/slideLayout*.xml"
173− , "ppt/slideLayouts/_rels/slideLayout*.xml.rels"
174+ , "ppt/slideLayouts/_rels/slideLayout*.xml.rels"
174− , "ppt/slideMasters/slideMaster1.xml"
175+ , "ppt/slideMasters/slideMaster1.xml"
175− , "ppt/slideMasters/_rels/slideMaster1.xml.rels"
176+ , "ppt/slideMasters/_rels/slideMaster1.xml.rels"
176− , "ppt/theme/theme1.xml"
177+ , "ppt/theme/theme1.xml"
177− , "ppt/theme/_rels/theme1.xml.rels"
178+ , "ppt/theme/_rels/theme1.xml.rels"
178− , "ppt/presProps.xml"
179+ , "ppt/presProps.xml"
179− , "ppt/viewProps.xml"
180+ , "ppt/viewProps.xml"
180− , "ppt/tableStyles.xml"
181+ , "ppt/tableStyles.xml"
181− , "ppt/media/image*"
182+ , "ppt/media/image*"
182− ]
183+ ]
184+
185+-- We only look for these under special conditions
186+contingentInheritedPatterns :: Presentation -> [Pattern]
187+contingentInheritedPatterns pres = [] ++
188+ if hasSpeakerNotes pres
189+ then map compile [ "ppt/notesMasters/notesMaster*.xml"
190+ , "ppt/notesMasters/_rels/notesMaster*.xml.rels"
191+ , "ppt/theme/theme2.xml"
192+ , "ppt/theme/_rels/theme2.xml.rels"
193+ ]
194+ else []
195+
196+inheritedPatterns :: Presentation -> [Pattern]
197+inheritedPatterns pres =
198+ alwaysInheritedPatterns ++ contingentInheritedPatterns pres
183
199
184patternToFilePaths :: PandocMonad m => Pattern -> P m [FilePath]
200patternToFilePaths :: PandocMonad m => Pattern -> P m [FilePath]
185patternToFilePaths pat = do
201patternToFilePaths pat = do
@@ -212,10 +228,9 @@ requiredFiles = [ "docProps/app.xml"
212 , "ppt/tableStyles.xml"
228 , "ppt/tableStyles.xml"
213 ]
229 ]
214
230
215−
216presentationToArchiveP :: PandocMonad m => Presentation -> P m Archive
231presentationToArchiveP :: PandocMonad m => Presentation -> P m Archive
217presentationToArchiveP p@(Presentation docProps slides) = do
232presentationToArchiveP p@(Presentation docProps slides) = do
218− filePaths <- patternsToFilePaths inheritedPatterns
233+ filePaths <- patternsToFilePaths $ inheritedPatterns p
219
234
220 -- make sure all required files are available:
235 -- make sure all required files are available:
221 let missingFiles = filter (\fp -> not (fp `elem` filePaths)) requiredFiles
236 let missingFiles = filter (\fp -> not (fp `elem` filePaths)) requiredFiles
@@ -287,6 +302,11 @@ presentationToArchive opts pres = do
287
302
288--------------------------------------------------
303--------------------------------------------------
289
304
305+-- Check to see if the presentation has speaker notes. This will
306+-- influence whether we import the notesMaster template.
307+hasSpeakerNotes :: Presentation -> Bool
308+hasSpeakerNotes (Presentation _ slides) = any isJust $ map slideSpeakerNotes slides
309+
290--------------------------------------------------
310--------------------------------------------------
291
311
292getLayout :: PandocMonad m => Layout -> P m Element
312getLayout :: PandocMonad m => Layout -> P m Element
@@ -1422,9 +1442,9 @@ mediaContentType mInfo
1422 | otherwise = Nothing
1442 | otherwise = Nothing
1423
1443
1424presentationToContentTypes :: PandocMonad m => Presentation -> P m ContentTypes
1444presentationToContentTypes :: PandocMonad m => Presentation -> P m ContentTypes
1425−presentationToContentTypes (Presentation _ slides) = do
1445+presentationToContentTypes p@(Presentation _ slides) = do
1426 mediaInfos <- (mconcat . M.elems) <$> gets stMediaIds
1446 mediaInfos <- (mconcat . M.elems) <$> gets stMediaIds
1427− filePaths <- patternsToFilePaths inheritedPatterns
1447+ filePaths <- patternsToFilePaths $ inheritedPatterns p
1428 let mediaFps = filter (match (compile "ppt/media/image*")) filePaths
1448 let mediaFps = filter (match (compile "ppt/media/image*")) filePaths
1429 let defaults = [ DefaultContentType "xml" "application/xml"
1449 let defaults = [ DefaultContentType "xml" "application/xml"
1430 , DefaultContentType "rels" "application/vnd.openxmlformats-package.relationships+xml"
1450 , DefaultContentType "rels" "application/vnd.openxmlformats-package.relationships+xml"