aboutsummaryrefslogtreecommitdiff
path: root/src/Text/Pandoc/Class.hs
diff options
context:
space:
mode:
authorFrancesco Occhipinti <focchi.pinti@gmail.com>2018-05-04 19:31:02 +0200
committerJohn MacFarlane <jgm@berkeley.edu>2018-05-04 10:31:02 -0700
commit59f0c1d83bb573341f8ca0bf796ae41c82afd044 (patch)
treedb3f12a0c722dee2beebb640b6eb84486b644039 /src/Text/Pandoc/Class.hs
parent8cd3f19dc54124ec033069bc2f7018dc34866745 (diff)
downloadpandoc-59f0c1d83bb573341f8ca0bf796ae41c82afd044.tar.gz
catch IO errors when writing media files, closes #4559 (#4619)
If we do not catch these errors, any malformed entry in a media bag could cause the loss of a whole document output. An example of malformed entry is an entry with an empty file path.
Diffstat (limited to 'src/Text/Pandoc/Class.hs')
-rw-r--r--src/Text/Pandoc/Class.hs10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/Text/Pandoc/Class.hs b/src/Text/Pandoc/Class.hs
index 3529054e6..911ba98b5 100644
--- a/src/Text/Pandoc/Class.hs
+++ b/src/Text/Pandoc/Class.hs
@@ -477,6 +477,14 @@ liftIOError f u = do
Left e -> throwError $ PandocIOError u e
Right r -> return r
+-- | Show potential IO errors to the user continuing execution anyway
+logIOError :: IO () -> PandocIO ()
+logIOError f = do
+ res <- liftIO $ tryIOError f
+ case res of
+ Left e -> report $ IgnoredIOError (E.displayException e)
+ Right _ -> pure ()
+
instance PandocMonad PandocIO where
lookupEnv = liftIO . IO.lookupEnv
getCurrentTime = liftIO IO.getCurrentTime
@@ -862,7 +870,7 @@ writeMedia dir mediabag subpath = do
Just (_, bs) -> do
report $ Extracting fullpath
liftIOError (createDirectoryIfMissing True) (takeDirectory fullpath)
- liftIOError (\p -> BL.writeFile p bs) fullpath
+ logIOError $ BL.writeFile fullpath bs
adjustImagePath :: FilePath -> [FilePath] -> Inline -> Inline
adjustImagePath dir paths (Image attr lab (src, tit))