@@ -32,7 +32,6 @@ module Text.Pandoc.Lua.Module.MediaBag
3232
3333import Prelude
3434import Control.Monad (zipWithM_)
35−import Data.IORef (IORef, modifyIORef', readIORef)
3635import Data.Maybe (fromMaybe)
3736import Foreign.Lua (Lua, NumResults, Optional, liftIO)
3837import Text.Pandoc.Class (CommonState (..), fetchItem, putCommonState,
@@ -48,30 +47,49 @@ import qualified Text.Pandoc.MediaBag as MB
4847--
4948-- MediaBag submodule
5049--
51−pushModule :: CommonState -> IORef MB.MediaBag -> Lua NumResults
52−pushModule commonState mediaBagRef = do
50+pushModule :: Lua NumResults
51+pushModule = do
5352 Lua.newtable
54− addFunction "insert" (insertMediaFn mediaBagRef)
55− addFunction "lookup" (lookupMediaFn mediaBagRef)
56− addFunction "list" (mediaDirectoryFn mediaBagRef)
57− addFunction "fetch" (fetch commonState mediaBagRef)
53+ addFunction "insert" insertMediaFn
54+ addFunction "lookup" lookupMediaFn
55+ addFunction "list" mediaDirectoryFn
56+ addFunction "fetch" fetch
5857 return 1
5958
60−insertMediaFn :: IORef MB.MediaBag
61− -> FilePath
59+--
60+-- Port functions from Text.Pandoc.Class to the Lua monad.
61+-- TODO: reuse existing functions.
62+
63+-- Get the current CommonState.
64+getCommonState :: Lua CommonState
65+getCommonState = do
66+ Lua.getglobal "PANDOC_STATE"
67+ Lua.peek Lua.stackTop
68+
69+-- Replace MediaBag in CommonState.
70+setCommonState :: CommonState -> Lua ()
71+setCommonState st = do
72+ Lua.push st
73+ Lua.setglobal "PANDOC_STATE"
74+
75+modifyCommonState :: (CommonState -> CommonState) -> Lua ()
76+modifyCommonState f = getCommonState >>= setCommonState . f
77+
78+insertMediaFn :: FilePath
6279 -> Optional MimeType
6380 -> BL.ByteString
6481 -> Lua NumResults
65−insertMediaFn mbRef fp optionalMime contents = do
66− liftIO . modifyIORef' mbRef $
67− MB.insertMedia fp (Lua.fromOptional optionalMime) contents
82+insertMediaFn fp optionalMime contents = do
83+ modifyCommonState $ \st ->
84+ let mb = MB.insertMedia fp (Lua.fromOptional optionalMime) contents
85+ (stMediaBag st)
86+ in st { stMediaBag = mb}
6887 return 0
6988
70−lookupMediaFn :: IORef MB.MediaBag
71− -> FilePath
89+lookupMediaFn :: FilePath
7290 -> Lua NumResults
73−lookupMediaFn mbRef fp = do
74− res <- MB.lookupMedia fp <$> liftIO (readIORef mbRef)
91+lookupMediaFn fp = do
92+ res <- MB.lookupMedia fp . stMediaBag <$> getCommonState
7593 case res of
7694 Nothing -> Lua.pushnil *> return 1
7795 Just (mimeType, contents) -> do
@@ -79,10 +97,9 @@ lookupMediaFn mbRef fp = do
7997 Lua.push contents
8098 return 2
8199
82−mediaDirectoryFn :: IORef MB.MediaBag
83− -> Lua NumResults
84−mediaDirectoryFn mbRef = do
85− dirContents <- MB.mediaDirectory <$> liftIO (readIORef mbRef)
100+mediaDirectoryFn :: Lua NumResults
101+mediaDirectoryFn = do
102+ dirContents <- MB.mediaDirectory . stMediaBag <$> getCommonState
86103 Lua.newtable
87104 zipWithM_ addEntry [1..] dirContents
88105 return 1
@@ -95,12 +112,11 @@ mediaDirectoryFn mbRef = do
95112 Lua.push "length" *> Lua.push contentLength *> Lua.rawset (-3)
96113 Lua.rawseti (-2) idx
97114
98−fetch :: CommonState
99− -> IORef MB.MediaBag
100− -> String
115+fetch :: String
101116 -> Lua NumResults
102−fetch commonState mbRef src = do
103− mediaBag <- liftIO $ readIORef mbRef
117+fetch src = do
118+ commonState <- getCommonState
119+ let mediaBag = stMediaBag commonState
104120 (bs, mimeType) <- liftIO . runIOorExplode $ do
105121 putCommonState commonState
106122 setMediaBag mediaBag