@@ -27,43 +27,32 @@ Running pandoc Lua filters.
28module Text.Pandoc.Lua
28module Text.Pandoc.Lua
29 ( LuaException (..)
29 ( LuaException (..)
30− , LuaPackageParams (..)
32 , runLuaFilter
30 , runLuaFilter
33− , initLuaState
31+ , runPandocLua
34− , luaPackageParams
32+ , pushPandocModule
37import Control.Monad (when, (>=>))
35import Control.Monad (when, (>=>))
38−import Control.Monad.Trans (MonadIO (..))
39−import Data.IORef (newIORef, readIORef)
40import Foreign.Lua (FromLuaStack (peek), Lua, LuaException (..),
36import Foreign.Lua (FromLuaStack (peek), Lua, LuaException (..),
41 Status (OK), ToLuaStack (push))
37 Status (OK), ToLuaStack (push))
42−import Text.Pandoc.Class (PandocIO, getCommonState, getMediaBag, setMediaBag)
38+import Text.Pandoc.Class (PandocIO)
43−import Text.Pandoc.Definition
39+import Text.Pandoc.Definition (Pandoc)
44import Text.Pandoc.Lua.Filter (LuaFilter, walkMWithLuaFilter)
40import Text.Pandoc.Lua.Filter (LuaFilter, walkMWithLuaFilter)
45−import Text.Pandoc.Lua.Packages (LuaPackageParams (..),
41+import Text.Pandoc.Lua.Init (runPandocLua)
46− installPandocPackageSearcher)
47import Text.Pandoc.Lua.PandocModule (pushPandocModule) -- TODO: remove
42import Text.Pandoc.Lua.PandocModule (pushPandocModule) -- TODO: remove
48−import Text.Pandoc.Lua.Util (loadScriptFromDataDir)
49import qualified Foreign.Lua as Lua
43import qualified Foreign.Lua as Lua
50−import qualified Foreign.Lua.Module.Text as Lua
45+-- | Run the Lua filter in @filterPath@ for a transformation to target
46+-- format @format@. Pandoc uses Lua init files to setup the Lua
52−runLuaFilter :: Maybe FilePath -> FilePath -> String
48+runLuaFilter :: FilePath -> String
53 -> Pandoc -> PandocIO (Either LuaException Pandoc)
49 -> Pandoc -> PandocIO (Either LuaException Pandoc)
54−runLuaFilter datadir filterPath format pd = do
50+runLuaFilter filterPath format doc =
55− luaPkgParams <- luaPackageParams datadir
56− res <- liftIO . Lua.runLuaEither $
57− runLuaFilter' luaPkgParams filterPath format pd
51+ runPandocLua (runLuaFilter' filterPath format doc)
58− newMediaBag <- liftIO (readIORef (luaPkgMediaBag luaPkgParams))
59− setMediaBag newMediaBag
62−runLuaFilter' :: LuaPackageParams
63− -> FilePath -> String
53+runLuaFilter' :: FilePath -> String
64 -> Pandoc -> Lua Pandoc
54 -> Pandoc -> Lua Pandoc
65−runLuaFilter' luaPkgOpts filterPath format pd = do
55+runLuaFilter' filterPath format pd = do
66− initLuaState luaPkgOpts
67 -- store module in global "pandoc"
56 -- store module in global "pandoc"
68 registerFormat
57 registerFormat
69 top <- Lua.gettop
58 top <- Lua.gettop
@@ -83,24 +72,6 @@ runLuaFilter' luaPkgOpts filterPath format pd = do
83 push format
72 push format
84 Lua.setglobal "FORMAT"
73 Lua.setglobal "FORMAT"
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
96−-- Initialize the lua state with all required values
97−initLuaState :: LuaPackageParams -> Lua ()
98−initLuaState luaPkgParams = do
100− Lua.preloadTextModule "text"
101− installPandocPackageSearcher luaPkgParams
102− loadScriptFromDataDir (luaPkgDataDir luaPkgParams) "init.lua"
104pushGlobalFilter :: Lua ()
75pushGlobalFilter :: Lua ()
105pushGlobalFilter = do
76pushGlobalFilter = do
106 Lua.newtable
77 Lua.newtable