@@ -27,43 +27,32 @@ Running pandoc Lua filters.
2727-}
2828module Text.Pandoc.Lua
2929 ( LuaException (..)
30− , LuaPackageParams (..)
31− , pushPandocModule
3230 , runLuaFilter
33− , initLuaState
34− , luaPackageParams
31+ , runPandocLua
32+ , pushPandocModule
3533 ) where
3634
3735import Control.Monad (when, (>=>))
38−import Control.Monad.Trans (MonadIO (..))
39−import Data.IORef (newIORef, readIORef)
4036import Foreign.Lua (FromLuaStack (peek), Lua, LuaException (..),
4137 Status (OK), ToLuaStack (push))
42−import Text.Pandoc.Class (PandocIO, getCommonState, getMediaBag, setMediaBag)
43−import Text.Pandoc.Definition
38+import Text.Pandoc.Class (PandocIO)
39+import Text.Pandoc.Definition (Pandoc)
4440import Text.Pandoc.Lua.Filter (LuaFilter, walkMWithLuaFilter)
45−import Text.Pandoc.Lua.Packages (LuaPackageParams (..),
46− installPandocPackageSearcher)
41+import Text.Pandoc.Lua.Init (runPandocLua)
4742import Text.Pandoc.Lua.PandocModule (pushPandocModule) -- TODO: remove
48−import Text.Pandoc.Lua.Util (loadScriptFromDataDir)
4943import qualified Foreign.Lua as Lua
50−import qualified Foreign.Lua.Module.Text as Lua
5144
52−runLuaFilter :: Maybe FilePath -> FilePath -> String
45+-- | Run the Lua filter in @filterPath@ for a transformation to target
46+-- format @format@. Pandoc uses Lua init files to setup the Lua
47+-- interpreter.
48+runLuaFilter :: FilePath -> String
5349 -> Pandoc -> PandocIO (Either LuaException Pandoc)
54−runLuaFilter datadir filterPath format pd = do
55− luaPkgParams <- luaPackageParams datadir
56− res <- liftIO . Lua.runLuaEither $
57− runLuaFilter' luaPkgParams filterPath format pd
58− newMediaBag <- liftIO (readIORef (luaPkgMediaBag luaPkgParams))
59− setMediaBag newMediaBag
60− return res
50+runLuaFilter filterPath format doc =
51+ runPandocLua (runLuaFilter' filterPath format doc)
6152
62−runLuaFilter' :: LuaPackageParams
63− -> FilePath -> String
53+runLuaFilter' :: FilePath -> String
6454 -> Pandoc -> Lua Pandoc
65−runLuaFilter' luaPkgOpts filterPath format pd = do
66− initLuaState luaPkgOpts
55+runLuaFilter' filterPath format pd = do
6756 -- store module in global "pandoc"
6857 registerFormat
6958 top <- Lua.gettop
@@ -83,24 +72,6 @@ runLuaFilter' luaPkgOpts filterPath format pd = do
8372 push format
8473 Lua.setglobal "FORMAT"
8574
86−luaPackageParams :: Maybe FilePath -> PandocIO LuaPackageParams
87−luaPackageParams datadir = do
88− commonState <- getCommonState
89− mbRef <- liftIO . newIORef =<< getMediaBag
90− return LuaPackageParams
91− { luaPkgCommonState = commonState
92− , luaPkgDataDir = datadir
93− , luaPkgMediaBag = mbRef
94− }
95−
96−-- Initialize the lua state with all required values
97−initLuaState :: LuaPackageParams -> Lua ()
98−initLuaState luaPkgParams = do
99− Lua.openlibs
100− Lua.preloadTextModule "text"
101− installPandocPackageSearcher luaPkgParams
102− loadScriptFromDataDir (luaPkgDataDir luaPkgParams) "init.lua"
103−
10475pushGlobalFilter :: Lua ()
10576pushGlobalFilter = do
10677 Lua.newtable