git.iko.soy/typeable/pandoc
on master help sign in
Lua filters: make sure whole CommonState is passed through...
896c288John MacFarlane
src/Text/Pandoc/Lua.hs+8−5
@@ -44,7 +44,8 @@ import Data.Map (Map)
44import Data.Maybe (isJust)
44import Data.Maybe (isJust)
45import Foreign.Lua (Lua, FromLuaStack (peek), LuaException (..), StackIndex,
45import Foreign.Lua (Lua, FromLuaStack (peek), LuaException (..), StackIndex,
46 Status (OK), ToLuaStack (push))
46 Status (OK), ToLuaStack (push))
47−import Text.Pandoc.Class (PandocIO, getMediaBag, setMediaBag)
47+import Text.Pandoc.Class (PandocIO, getMediaBag, setMediaBag,
48+ getCommonState, CommonState)
48import Text.Pandoc.MediaBag (MediaBag)
49import Text.Pandoc.MediaBag (MediaBag)
49import Text.Pandoc.Definition
50import Text.Pandoc.Definition
50import Text.Pandoc.Lua.PandocModule (pushPandocModule, pushMediaBagModule)
51import Text.Pandoc.Lua.PandocModule (pushPandocModule, pushMediaBagModule)
@@ -56,17 +57,19 @@ import qualified Foreign.Lua as Lua
56runLuaFilter :: Maybe FilePath -> FilePath -> String
57runLuaFilter :: Maybe FilePath -> FilePath -> String
57 -> Pandoc -> PandocIO (Either LuaException Pandoc)
58 -> Pandoc -> PandocIO (Either LuaException Pandoc)
58runLuaFilter datadir filterPath format pd = do
59runLuaFilter datadir filterPath format pd = do
60+ commonState <- getCommonState
59 mediaBag <- getMediaBag
61 mediaBag <- getMediaBag
60 mediaBagRef <- liftIO (newIORef mediaBag)
62 mediaBagRef <- liftIO (newIORef mediaBag)
61 res <- liftIO . Lua.runLuaEither $
63 res <- liftIO . Lua.runLuaEither $
62− runLuaFilter' datadir filterPath format mediaBagRef pd
64+ runLuaFilter' commonState datadir filterPath format mediaBagRef pd
63 newMediaBag <- liftIO (readIORef mediaBagRef)
65 newMediaBag <- liftIO (readIORef mediaBagRef)
64 setMediaBag newMediaBag
66 setMediaBag newMediaBag
65 return res
67 return res
66
68
69+runLuaFilter' :: CommonState
67−runLuaFilter' :: Maybe FilePath -> FilePath -> String -> IORef MediaBag
70+ -> Maybe FilePath -> FilePath -> String -> IORef MediaBag
68 -> Pandoc -> Lua Pandoc
71 -> Pandoc -> Lua Pandoc
69−runLuaFilter' datadir filterPath format mbRef pd = do
72+runLuaFilter' commonState datadir filterPath format mbRef pd = do
70 Lua.openlibs
73 Lua.openlibs
71 -- store module in global "pandoc"
74 -- store module in global "pandoc"
72 pushPandocModule datadir
75 pushPandocModule datadir
@@ -89,7 +92,7 @@ runLuaFilter' datadir filterPath format mbRef pd = do
89 addMediaBagModule = do
92 addMediaBagModule = do
90 Lua.getglobal "pandoc"
93 Lua.getglobal "pandoc"
91 push "mediabag"
94 push "mediabag"
92− pushMediaBagModule mbRef
95+ pushMediaBagModule commonState mbRef
93 Lua.rawset (-3)
96 Lua.rawset (-3)
94 registerFormat = do
97 registerFormat = do
95 push format
98 push format
src/Text/Pandoc/Lua/PandocModule.hs+14−9
@@ -41,7 +41,8 @@ import Data.IORef
41import Data.Text (pack)
41import Data.Text (pack)
42import Foreign.Lua (Lua, FromLuaStack, ToLuaStack, NumResults, liftIO)
42import Foreign.Lua (Lua, FromLuaStack, ToLuaStack, NumResults, liftIO)
43import Text.Pandoc.Class (fetchMediaResource, readDataFile, runIO,
43import Text.Pandoc.Class (fetchMediaResource, readDataFile, runIO,
44− runIOorExplode, setUserDataDir)
44+ runIOorExplode, setUserDataDir, CommonState(..),
45+ putCommonState)
45import Text.Pandoc.Options (ReaderOptions(readerExtensions))
46import Text.Pandoc.Options (ReaderOptions(readerExtensions))
46import Text.Pandoc.Lua.StackInstances ()
47import Text.Pandoc.Lua.StackInstances ()
47import Text.Pandoc.Readers (Reader (..), getReader)
48import Text.Pandoc.Readers (Reader (..), getReader)
@@ -83,13 +84,13 @@ readDoc formatSpec content = do
83--
84--
84-- MediaBag submodule
85-- MediaBag submodule
85--
86--
86−pushMediaBagModule :: IORef MB.MediaBag -> Lua ()
87+pushMediaBagModule :: CommonState -> IORef MB.MediaBag -> Lua ()
87−pushMediaBagModule mediaBagRef = do
88+pushMediaBagModule commonState mediaBagRef = do
88 Lua.newtable
89 Lua.newtable
89 addFunction "insert" (insertMediaFn mediaBagRef)
90 addFunction "insert" (insertMediaFn mediaBagRef)
90 addFunction "lookup" (lookupMediaFn mediaBagRef)
91 addFunction "lookup" (lookupMediaFn mediaBagRef)
91 addFunction "list" (mediaDirectoryFn mediaBagRef)
92 addFunction "list" (mediaDirectoryFn mediaBagRef)
92− addFunction "fetch" (insertResource mediaBagRef)
93+ addFunction "fetch" (insertResource commonState mediaBagRef)
93 return ()
94 return ()
94 where
95 where
95 addFunction name fn = do
96 addFunction name fn = do
@@ -103,7 +104,8 @@ insertMediaFn :: IORef MB.MediaBag
103 -> BL.ByteString
104 -> BL.ByteString
104 -> Lua NumResults
105 -> Lua NumResults
105insertMediaFn mbRef fp nilOrMime contents = do
106insertMediaFn mbRef fp nilOrMime contents = do
107+ liftIO . modifyIORef' mbRef $
106− liftIO . modifyIORef' mbRef $ MB.insertMedia fp (toMaybe nilOrMime) contents
108+ MB.insertMedia fp (toMaybe nilOrMime) contents
107 return 0
109 return 0
108
110
109lookupMediaFn :: IORef MB.MediaBag
111lookupMediaFn :: IORef MB.MediaBag
@@ -134,12 +136,15 @@ mediaDirectoryFn mbRef = do
134 Lua.push "length" *> Lua.push contentLength *> Lua.rawset (-3)
136 Lua.push "length" *> Lua.push contentLength *> Lua.rawset (-3)
135 Lua.rawseti (-2) idx
137 Lua.rawseti (-2) idx
136
138
139+insertResource :: CommonState
137−insertResource :: IORef MB.MediaBag
140+ -> IORef MB.MediaBag
138 -> String
141 -> String
139 -> Lua NumResults
142 -> Lua NumResults
140−insertResource mbRef src = do
143+insertResource commonState mbRef src = do
141− (fp, mimeType, bs) <- liftIO . runIOorExplode $ fetchMediaResource src
144+ (fp, mimeType, bs) <- liftIO . runIOorExplode $ do
145+ putCommonState commonState
146+ fetchMediaResource src
142− liftIO $ print (fp, mimeType)
147+ liftIO $ print (fp, mimeType) -- TODO DEBUG
143 insertMediaFn mbRef fp (OrNil mimeType) bs
148 insertMediaFn mbRef fp (OrNil mimeType) bs
144
149
145--
150--