aboutsummaryrefslogtreecommitdiff
path: root/src/Text/Pandoc/Lua/Init.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Text/Pandoc/Lua/Init.hs')
-rw-r--r--src/Text/Pandoc/Lua/Init.hs83
1 files changed, 23 insertions, 60 deletions
diff --git a/src/Text/Pandoc/Lua/Init.hs b/src/Text/Pandoc/Lua/Init.hs
index 76a7d0bdc..a5e513a1f 100644
--- a/src/Text/Pandoc/Lua/Init.hs
+++ b/src/Text/Pandoc/Lua/Init.hs
@@ -9,9 +9,7 @@
Functions to initialize the Lua interpreter.
-}
module Text.Pandoc.Lua.Init
- ( LuaPackageParams (..)
- , runLua
- , luaPackageParams
+ ( runLua
) where
import Control.Monad.Catch (try)
@@ -20,17 +18,12 @@ import Data.Data (Data, dataTypeConstrs, dataTypeOf, showConstr)
import Foreign.Lua (Lua)
import GHC.IO.Encoding (getForeignEncoding, setForeignEncoding, utf8)
import Text.Pandoc.Class.PandocIO (PandocIO)
-import Text.Pandoc.Class.PandocMonad (getCommonState, getUserDataDir,
- putCommonState)
import Text.Pandoc.Error (PandocError)
-import Text.Pandoc.Lua.ErrorConversion (errorConversion)
-import Text.Pandoc.Lua.Global (Global (..), setGlobals)
-import Text.Pandoc.Lua.Packages (LuaPackageParams (..),
- installPandocPackageSearcher)
-import Text.Pandoc.Lua.Util (loadScriptFromDataDir)
+import Text.Pandoc.Lua.Packages (installPandocPackageSearcher)
+import Text.Pandoc.Lua.PandocLua (PandocLua, liftPandocLua,
+ loadScriptFromDataDir, runPandocLua)
import qualified Foreign.Lua as Lua
-import qualified Foreign.Lua.Module.Text as Lua
import qualified Text.Pandoc.Definition as Pandoc
import qualified Text.Pandoc.Lua.Module.Pandoc as ModulePandoc
@@ -38,65 +31,35 @@ import qualified Text.Pandoc.Lua.Module.Pandoc as ModulePandoc
-- initialization.
runLua :: Lua a -> PandocIO (Either PandocError a)
runLua luaOp = do
- luaPkgParams <- luaPackageParams
- globals <- defaultGlobals
enc <- liftIO $ getForeignEncoding <* setForeignEncoding utf8
- res <- liftIO . try . Lua.run' errorConversion $ do
- setGlobals globals
- initLuaState luaPkgParams
- -- run the given Lua operation
- opResult <- luaOp
- -- get the (possibly modified) state back
- Lua.getglobal "PANDOC_STATE"
- st <- Lua.peek Lua.stackTop
- Lua.pop 1
- -- done
- return (opResult, st)
+ res <- runPandocLua . try $ do
+ initLuaState
+ liftPandocLua luaOp
liftIO $ setForeignEncoding enc
- case res of
- Left err -> return $ Left err
- Right (x, newState) -> do
- putCommonState newState
- return $ Right x
-
--- | Global variables which should always be set.
-defaultGlobals :: PandocIO [Global]
-defaultGlobals = do
- commonState <- getCommonState
- return
- [ PANDOC_API_VERSION
- , PANDOC_STATE commonState
- , PANDOC_VERSION
- ]
-
--- | Generate parameters required to setup pandoc's lua environment.
-luaPackageParams :: PandocIO LuaPackageParams
-luaPackageParams = do
- datadir <- getUserDataDir
- return LuaPackageParams { luaPkgDataDir = datadir }
+ return res
-- | Initialize the lua state with all required values
-initLuaState :: LuaPackageParams -> Lua ()
-initLuaState pkgParams = do
- Lua.openlibs
- Lua.preloadTextModule "text"
- installPandocPackageSearcher pkgParams
+initLuaState :: PandocLua ()
+initLuaState = do
+ liftPandocLua Lua.openlibs
+ installPandocPackageSearcher
initPandocModule
- loadScriptFromDataDir (luaPkgDataDir pkgParams) "init.lua"
+ loadScriptFromDataDir "init.lua"
where
- initPandocModule :: Lua ()
+ initPandocModule :: PandocLua ()
initPandocModule = do
-- Push module table
- ModulePandoc.pushModule (luaPkgDataDir pkgParams)
+ ModulePandoc.pushModule
-- register as loaded module
- Lua.pushvalue Lua.stackTop
- Lua.getfield Lua.registryindex Lua.loadedTableRegistryField
- Lua.setfield (Lua.nthFromTop 2) "pandoc"
- Lua.pop 1
+ liftPandocLua $ do
+ Lua.pushvalue Lua.stackTop
+ Lua.getfield Lua.registryindex Lua.loadedTableRegistryField
+ Lua.setfield (Lua.nthFromTop 2) "pandoc"
+ Lua.pop 1
-- copy constructors into registry
putConstructorsInRegistry
-- assign module to global variable
- Lua.setglobal "pandoc"
+ liftPandocLua $ Lua.setglobal "pandoc"
-- | AST elements are marshaled via normal constructor functions in the
-- @pandoc@ module. However, accessing Lua globals from Haskell is
@@ -106,8 +69,8 @@ initLuaState pkgParams = do
--
-- This function expects the @pandoc@ module to be at the top of the
-- stack.
-putConstructorsInRegistry :: Lua ()
-putConstructorsInRegistry = do
+putConstructorsInRegistry :: PandocLua ()
+putConstructorsInRegistry = liftPandocLua $ do
constrsToReg $ Pandoc.Pandoc mempty mempty
constrsToReg $ Pandoc.Str mempty
constrsToReg $ Pandoc.Para mempty