git.iko.soy/typeable/pandoc
on master help sign in
Introduce DeferredMediaBag.

This is a lazy MediaBag, that will only be evaluated (downloaded/read in) upon demand. Note that we use fetchItem in getDefferedMedia at the moment to read in/download. This means that we don't need to distinguish between URIs and FilePaths. But there is an inefficiency here: `fetchItem` will pull an item out of the mediaBag if it's already there, and then we'll reinsert it. We could separate out `fetchItem` into the function that checks the MediaBag and the underlying downloader/read-inner.

commit5814096d79770edabc2822ff66747e3559c61e76 authorJesse Rosenthal <jrosenthal@jhu.edu> dateTue 13 Dec 2016, 19:35 (10 years ago) parentadcd4c5
1 file changed+24
src/Text/Pandoc/Class.hs+24
src/Text/Pandoc/Class.hs+24
@@ -100,6 +100,7 @@ import Data.Default
100100import System.IO.Error
101101import qualified Data.Map as M
102102import Text.Pandoc.Error
103+import Data.Monoid
103104
104105class (Functor m, Applicative m, Monad m, MonadError PandocError m)
105106 => PandocMonad m where
@@ -167,6 +168,29 @@ warningWithPos pos msg = lift $ warning $ msg ++ " " ++ show pos
167168
168169--
169170
171+newtype DeferredMediaPath = DeferredMediaPath {unDefer :: String}
172+ deriving (Show, Eq)
173+
174+data DeferredMediaBag = DeferredMediaBag MediaBag [DeferredMediaPath]
175+ deriving (Show)
176+
177+instance Monoid DeferredMediaBag where
178+ mempty = DeferredMediaBag mempty mempty
179+ mappend (DeferredMediaBag mb lst) (DeferredMediaBag mb' lst') =
180+ DeferredMediaBag (mb <> mb') (lst <> lst')
181+
182+getDeferredMedia :: PandocMonad m => DeferredMediaBag -> m MediaBag
183+getDeferredMedia (DeferredMediaBag mb defMedia) = do
184+ fetchedMedia <- mapM (\dfp -> fetchItem Nothing (unDefer dfp)) defMedia
185+ return $ foldr
186+ (\(dfp, (bs, mbMime)) mb' ->
187+ MB.insertMedia (unDefer dfp) mbMime (BL.fromStrict bs) mb')
188+ mb
189+ (zip defMedia fetchedMedia)
190+
191+dropDeferredMedia :: DeferredMediaBag -> MediaBag
192+dropDeferredMedia (DeferredMediaBag mb _) = mb
193+
170194data CommonState = CommonState { stWarnings :: [String]
171195 , stMediaBag :: MediaBag
172196 , stInputFiles :: Maybe [FilePath]