@@ -102,6 +102,7 @@ import System.IO.Error
102import qualified Data.Map as M
102import qualified Data.Map as M
103import Text.Pandoc.Error
103import Text.Pandoc.Error
104import Data.Monoid
104import Data.Monoid
105+import Data.Maybe (catMaybes)
106class (Functor m, Applicative m, Monad m, MonadError PandocError m)
107class (Functor m, Applicative m, Monad m, MonadError PandocError m)
107 => PandocMonad m where
108 => PandocMonad m where
@@ -188,15 +189,27 @@ instance Monoid DeferredMediaBag where
188 mappend (DeferredMediaBag mb lst) (DeferredMediaBag mb' lst') =
189 mappend (DeferredMediaBag mb lst) (DeferredMediaBag mb' lst') =
189 DeferredMediaBag (mb <> mb') (lst <> lst')
190 DeferredMediaBag (mb <> mb') (lst <> lst')
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))
200+ (do (bs, mbmime) <- downloadOrRead Nothing (unDefer dfp)
201+ return $ Just $ (unDefer dfp, bs, mbmime))
203+ (const $ do warning ("Couldn't access media at " ++ unDefer dfp)
191fetchDeferredMedia' :: PandocMonad m => m MediaBag
206fetchDeferredMedia' :: PandocMonad m => m MediaBag
192fetchDeferredMedia' = do
207fetchDeferredMedia' = do
193 (DeferredMediaBag mb defMedia) <- getsCommonState stDeferredMediaBag
208 (DeferredMediaBag mb defMedia) <- getsCommonState stDeferredMediaBag
194− fetchedMedia <- mapM (\dfp -> downloadOrRead Nothing (unDefer dfp)) defMedia
209+ fetchedMedia <- catMaybes <$> mapM fetchMediaItem defMedia
195 return $ foldr
210 return $ foldr
196− (\(dfp, (bs, mbMime)) mb' ->
197− MB.insertMedia (unDefer dfp) mbMime (BL.fromStrict bs) mb')
211+ (\(fp, bs, mbMime) mb' -> MB.insertMedia fp mbMime (BL.fromStrict bs) mb')
199− (zip defMedia fetchedMedia)
212+ mb fetchedMedia
201fetchDeferredMedia :: PandocMonad m => m ()
214fetchDeferredMedia :: PandocMonad m => m ()
202fetchDeferredMedia = fetchDeferredMedia' >>= setMediaBag
215fetchDeferredMedia = fetchDeferredMedia' >>= setMediaBag