diff options
Diffstat (limited to 'src/Text/Pandoc/Lua/Init.hs')
-rw-r--r-- | src/Text/Pandoc/Lua/Init.hs | 83 |
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 |