git.iko.soy/typeable/pandoc
on master help sign in
Powerpoint writer: Check for required files

Since we now import from reference/dist file by glob, we need to make sure that we're getting the files we need to make a non-corrupt Powerpoint. This performs that check. (In the process, this change also cleaned up a lot of commented-out code left from the switch to the new reference-doc method.)

commit194f08d17a0ba695187f99e2494977fb9bca53ef authorJesse Rosenthal <jrosenthal@jhu.edu> dateSat 13 Jan 2018, 07:37 (9 years ago) parenta2870a1
1 file changed+30−71
src/Text/Pandoc/Writers/Powerpoint.hs+30−71
src/Text/Pandoc/Writers/Powerpoint.hs+30−71
@@ -784,22 +784,6 @@ copyFileToArchive arch fp = do
784784 Nothing -> fail $ fp ++ " missing in reference file"
785785 Just e -> return $ addEntryToArchive e arch
786786
787−-- getMediaFiles :: PandocMonad m => P m [FilePath]
788−-- getMediaFiles = do
789−-- refArchive <- asks envRefArchive
790−-- distArchive <- asks envDistArchive
791−-- let allEntries = nub $ filesInArchive refArchive ++ filesInArchive distArchive
792−-- return $ filter (isPrefixOf "ppt/media") allEntries
793−
794−
795−-- copyFileToArchiveIfExists :: PandocMonad m => Archive -> FilePath -> P m Archive
796−-- copyFileToArchiveIfExists arch fp = do
797−-- refArchive <- asks envRefArchive
798−-- distArchive <- asks envDistArchive
799−-- case findEntryByPath fp refArchive `mplus` findEntryByPath fp distArchive of
800−-- Nothing -> return $ arch
801−-- Just e -> return $ addEntryToArchive e arch
802−
803787inheritedPatterns :: [Pattern]
804788inheritedPatterns = map compile [ "_rels/.rels"
805789 , "docProps/app.xml"
@@ -827,68 +811,43 @@ patternToFilePaths pat = do
827811patternsToFilePaths :: PandocMonad m => [Pattern] -> P m [FilePath]
828812patternsToFilePaths pats = concat <$> mapM patternToFilePaths pats
829813
830−-- requiredFiles :: [FilePath]
831−-- requiredFiles = inheritedFiles
832−
833−-- inheritedFiles :: [FilePath]
834−-- inheritedFiles = [ "_rels/.rels"
835−-- , "docProps/app.xml"
836−-- , "docProps/core.xml"
837−-- , "ppt/slideLayouts/slideLayout4.xml"
838−-- , "ppt/slideLayouts/_rels/slideLayout9.xml.rels"
839−-- , "ppt/slideLayouts/_rels/slideLayout2.xml.rels"
840−-- , "ppt/slideLayouts/_rels/slideLayout10.xml.rels"
841−-- , "ppt/slideLayouts/_rels/slideLayout1.xml.rels"
842−-- , "ppt/slideLayouts/_rels/slideLayout3.xml.rels"
843−-- , "ppt/slideLayouts/_rels/slideLayout5.xml.rels"
844−-- , "ppt/slideLayouts/_rels/slideLayout7.xml.rels"
845−-- , "ppt/slideLayouts/_rels/slideLayout8.xml.rels"
846−-- , "ppt/slideLayouts/_rels/slideLayout11.xml.rels"
847−-- , "ppt/slideLayouts/_rels/slideLayout4.xml.rels"
848−-- , "ppt/slideLayouts/_rels/slideLayout6.xml.rels"
849−-- , "ppt/slideLayouts/slideLayout2.xml"
850−-- , "ppt/slideLayouts/slideLayout8.xml"
851−-- , "ppt/slideLayouts/slideLayout11.xml"
852−-- , "ppt/slideLayouts/slideLayout3.xml"
853−-- , "ppt/slideLayouts/slideLayout6.xml"
854−-- , "ppt/slideLayouts/slideLayout9.xml"
855−-- , "ppt/slideLayouts/slideLayout5.xml"
856−-- , "ppt/slideLayouts/slideLayout7.xml"
857−-- , "ppt/slideLayouts/slideLayout1.xml"
858−-- , "ppt/slideLayouts/slideLayout10.xml"
859−-- -- , "ppt/_rels/presentation.xml.rels"
860−-- , "ppt/theme/theme1.xml"
861−-- , "ppt/presProps.xml"
862−-- -- , "ppt/slides/_rels/slide1.xml.rels"
863−-- -- , "ppt/slides/_rels/slide2.xml.rels"
864−-- -- This is the one we're
865−-- -- going to build
866−-- -- , "ppt/slides/slide2.xml"
867−-- -- , "ppt/slides/slide1.xml"
868−-- , "ppt/viewProps.xml"
869−-- , "ppt/tableStyles.xml"
870−-- , "ppt/slideMasters/_rels/slideMaster1.xml.rels"
871−-- , "ppt/slideMasters/slideMaster1.xml"
872−-- -- , "ppt/presentation.xml"
873−-- -- , "[Content_Types].xml"
874−-- ]
875−
876−-- -- Here are some that might not be there. We won't fail if they're not
877−-- possibleInheritedFiles :: [FilePath]
878−-- possibleInheritedFiles = [ "ppt/theme/_rels/theme1.xml.rels" ]
814+-- Here are the files we'll require to make a Powerpoint document. If
815+-- any of these are missing, we should error out of our build.
816+requiredFiles :: [FilePath]
817+requiredFiles = [ "_rels/.rels"
818+ , "docProps/app.xml"
819+ , "docProps/core.xml"
820+ , "ppt/presProps.xml"
821+ , "ppt/slideLayouts/slideLayout1.xml"
822+ , "ppt/slideLayouts/_rels/slideLayout1.xml.rels"
823+ , "ppt/slideLayouts/slideLayout2.xml"
824+ , "ppt/slideLayouts/_rels/slideLayout2.xml.rels"
825+ , "ppt/slideLayouts/slideLayout3.xml"
826+ , "ppt/slideLayouts/_rels/slideLayout3.xml.rels"
827+ , "ppt/slideLayouts/slideLayout4.xml"
828+ , "ppt/slideLayouts/_rels/slideLayout4.xml.rels"
829+ , "ppt/slideMasters/slideMaster1.xml"
830+ , "ppt/slideMasters/_rels/slideMaster1.xml.rels"
831+ , "ppt/theme/theme1.xml"
832+ , "ppt/viewProps.xml"
833+ , "ppt/tableStyles.xml"
834+ ]
879835
880836
881837presentationToArchive :: PandocMonad m => Presentation -> P m Archive
882838presentationToArchive p@(Presentation _ slides) = do
883839 filePaths <- patternsToFilePaths inheritedPatterns
884− newArch' <- foldM copyFileToArchive emptyArchive filePaths
885840
886− -- set the template media to the relevant fps:
841+ -- make sure all required files are available:
842+ let missingFiles = filter (\fp -> not (fp `elem` filePaths)) requiredFiles
843+ unless (null missingFiles)
844+ (throwError $
845+ PandocSomeError $
846+ "The following required files are missing:\n" ++
847+ (unlines $ map (" " ++) missingFiles)
848+ )
887849
888− -- we register any media fp in the filepaths
889− -- mediaDir <- getMediaFiles
890− -- newArch' <- foldM copyFileToArchiveIfExists newArch $
891− -- possibleInheritedFiles ++ mediaDir
850+ newArch' <- foldM copyFileToArchive emptyArchive filePaths
892851 -- presentation entry and rels. We have to do the rels first to make
893852 -- sure we know the correct offset for the rIds.
894853 presEntry <- presentationToPresEntry p