@@ -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