git.iko.soy/typeable/pandoc
on master help sign in
Class: Warn instead or erroring if we can't fetch media

If deferred media can't be fetched, we catch the error and warn instead. We add an internal function for fetching which returns a Maybe value, and then run catMaybes to only keep the Just's.

commit5b3bfa28f4a093a1096f628b84180165bc4cff29 authorJesse Rosenthal <jrosenthal@jhu.edu> dateWed 14 Dec 2016, 06:34 (10 years ago) parent613588a
1 file changed+18−5
src/Text/Pandoc/Class.hs+18−5
src/Text/Pandoc/Class.hs+18−5
@@ -102,6 +102,7 @@ import System.IO.Error
102102import qualified Data.Map as M
103103import Text.Pandoc.Error
104104import Data.Monoid
105+import Data.Maybe (catMaybes)
105106
106107class (Functor m, Applicative m, Monad m, MonadError PandocError m)
107108 => PandocMonad m where
@@ -188,15 +189,27 @@ instance Monoid DeferredMediaBag where
188189 mappend (DeferredMediaBag mb lst) (DeferredMediaBag mb' lst') =
189190 DeferredMediaBag (mb <> mb') (lst <> lst')
190191
192+
193+-- the internal function for downloading individual items. We want to
194+-- catch errors and return a Nothing with a warning, so we can
195+-- continue without erroring out.
196+fetchMediaItem :: PandocMonad m
197+ => DeferredMediaPath
198+ -> m (Maybe (FilePath, B.ByteString, Maybe MimeType))
199+fetchMediaItem dfp =
200+ (do (bs, mbmime) <- downloadOrRead Nothing (unDefer dfp)
201+ return $ Just $ (unDefer dfp, bs, mbmime))
202+ `catchError`
203+ (const $ do warning ("Couldn't access media at " ++ unDefer dfp)
204+ return Nothing)
205+
191206fetchDeferredMedia' :: PandocMonad m => m MediaBag
192207fetchDeferredMedia' = do
193208 (DeferredMediaBag mb defMedia) <- getsCommonState stDeferredMediaBag
194− fetchedMedia <- mapM (\dfp -> downloadOrRead Nothing (unDefer dfp)) defMedia
209+ fetchedMedia <- catMaybes <$> mapM fetchMediaItem defMedia
195210 return $ foldr
196− (\(dfp, (bs, mbMime)) mb' ->
197− MB.insertMedia (unDefer dfp) mbMime (BL.fromStrict bs) mb')
198− mb
199− (zip defMedia fetchedMedia)
211+ (\(fp, bs, mbMime) mb' -> MB.insertMedia fp mbMime (BL.fromStrict bs) mb')
212+ mb fetchedMedia
200213
201214fetchDeferredMedia :: PandocMonad m => m ()
202215fetchDeferredMedia = fetchDeferredMedia' >>= setMediaBag