git.iko.soy/typeable/pandoc
on master help sign in
Integrate DeferredMediaBag into CommonState

The DeferredMediaBag is now the object that is held in state. It should not be visible to users, who will still deal with MediaBag through exported getters and setters. We now have a function `fetchDeferredMedia` which returns () but downloads/reads in all of the deferred media. Note that getMediaBag first fetches all deferred media.

commit55dbc00d55a4136271cd4c4d7ff4ab73d186f4b6 authorJesse Rosenthal <jrosenthal@jhu.edu> dateTue 13 Dec 2016, 20:22 (10 years ago) parent5814096
1 file changed+17−10
src/Text/Pandoc/Class.hs+17−10
src/Text/Pandoc/Class.hs+17−10
@@ -135,15 +135,17 @@ getWarnings :: PandocMonad m => m [String]
135135getWarnings = getsCommonState stWarnings
136136
137137setMediaBag :: PandocMonad m => MediaBag -> m ()
138−setMediaBag mb = modifyCommonState $ \st -> st{stMediaBag = mb}
138+setMediaBag mb = modifyCommonState $
139+ \st -> st{stDeferredMediaBag = DeferredMediaBag mb mempty}
139140
140141getMediaBag :: PandocMonad m => m MediaBag
141−getMediaBag = getsCommonState stMediaBag
142+getMediaBag = fetchDeferredMedia >> (dropDeferredMedia <$> getsCommonState stDeferredMediaBag)
142143
143144insertMedia :: PandocMonad m => FilePath -> Maybe MimeType -> BL.ByteString -> m ()
144−insertMedia fp mime bs =
145− modifyCommonState $ \st ->
146− st{stMediaBag = MB.insertMedia fp mime bs (stMediaBag st) }
145+insertMedia fp mime bs = do
146+ (DeferredMediaBag mb dm) <- getsCommonState stDeferredMediaBag
147+ let mb' = MB.insertMedia fp mime bs mb
148+ modifyCommonState $ \st -> st{stDeferredMediaBag =DeferredMediaBag mb' dm }
147149
148150getInputFiles :: PandocMonad m => m (Maybe [FilePath])
149151getInputFiles = getsCommonState stInputFiles
@@ -179,8 +181,9 @@ instance Monoid DeferredMediaBag where
179181 mappend (DeferredMediaBag mb lst) (DeferredMediaBag mb' lst') =
180182 DeferredMediaBag (mb <> mb') (lst <> lst')
181183
182−getDeferredMedia :: PandocMonad m => DeferredMediaBag -> m MediaBag
183−getDeferredMedia (DeferredMediaBag mb defMedia) = do
184+fetchDeferredMedia' :: PandocMonad m => m MediaBag
185+fetchDeferredMedia' = do
186+ (DeferredMediaBag mb defMedia) <- getsCommonState stDeferredMediaBag
184187 fetchedMedia <- mapM (\dfp -> fetchItem Nothing (unDefer dfp)) defMedia
185188 return $ foldr
186189 (\(dfp, (bs, mbMime)) mb' ->
@@ -188,18 +191,22 @@ getDeferredMedia (DeferredMediaBag mb defMedia) = do
188191 mb
189192 (zip defMedia fetchedMedia)
190193
194+fetchDeferredMedia :: PandocMonad m => m ()
195+fetchDeferredMedia = fetchDeferredMedia' >>= setMediaBag
196+
191197dropDeferredMedia :: DeferredMediaBag -> MediaBag
192198dropDeferredMedia (DeferredMediaBag mb _) = mb
193199
200+
194201data CommonState = CommonState { stWarnings :: [String]
195− , stMediaBag :: MediaBag
202+ , stDeferredMediaBag :: DeferredMediaBag
196203 , stInputFiles :: Maybe [FilePath]
197204 , stOutputFile :: Maybe FilePath
198205 }
199206
200207instance Default CommonState where
201208 def = CommonState { stWarnings = []
202− , stMediaBag = mempty
209+ , stDeferredMediaBag = mempty
203210 , stInputFiles = Nothing
204211 , stOutputFile = Nothing
205212 }
@@ -284,7 +291,7 @@ fetchItem :: PandocMonad m
284291 -> String
285292 -> m (B.ByteString, Maybe MimeType)
286293fetchItem sourceURL s = do
287− mediabag <- getMediaBag
294+ mediabag <- dropDeferredMedia <$> getsCommonState stDeferredMediaBag
288295 case lookupMedia s mediabag of
289296 Just (mime, bs) -> return $ (BL.toStrict bs, Just mime)
290297 Nothing ->