1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RankNTypes #-}
{- |
Module : Text.Pandoc.Lua.Run
Copyright : Copyright © 2017-2024 Albert Krewinkel
License : GPL-2.0-or-later
Maintainer : Albert Krewinkel <[email protected]>
Run code in the Lua interpreter.
-}
module Text.Pandoc.Lua.Run
( runLua
, runLuaNoEnv
, runLuaWith
) where
import Control.Monad.Catch (try)
import Control.Monad.Trans (MonadIO (..))
import HsLua as Lua hiding (try)
import Text.Pandoc.Class (PandocMonad (..))
import Text.Pandoc.Error (PandocError)
import Text.Pandoc.Lua.Global (Global (..), setGlobals)
import Text.Pandoc.Lua.Init (initLua)
import Text.Pandoc.Lua.PandocLua (PandocLua (..), liftPandocLua)
-- | Run the Lua interpreter, using pandoc's default way of environment
-- initialization.
runLua :: (PandocMonad m, MonadIO m)
=> LuaE PandocError a -> m (Either PandocError a)
runLua action = do
runPandocLuaWith Lua.run . try $ do
initLua
liftPandocLua action
runLuaWith :: (PandocMonad m, MonadIO m)
=> GCManagedState -> LuaE PandocError a -> m (Either PandocError a)
runLuaWith luaState action = do
runPandocLuaWith (withGCManagedState luaState) . try $ do
initLua
liftPandocLua action
-- | Like 'runLua', but ignores all environment variables like @LUA_PATH@.
runLuaNoEnv :: (PandocMonad m, MonadIO m)
=> LuaE PandocError a -> m (Either PandocError a)
runLuaNoEnv action = do
runPandocLuaWith Lua.run . try $ do
liftPandocLua $ do
-- This is undocumented, but works -- the code is adapted from the
-- `lua.c` sources for the default interpreter.
Lua.pushboolean True
Lua.setfield Lua.registryindex "LUA_NOENV"
initLua
liftPandocLua action
-- | Evaluate a @'PandocLua'@ computation, running all contained Lua
-- operations.
runPandocLuaWith :: (PandocMonad m, MonadIO m)
=> (forall b. LuaE PandocError b -> IO b)
-> PandocLua a
-> m a
runPandocLuaWith runner pLua = do
origState <- getCommonState
globals <- defaultGlobals
(result, newState) <- liftIO . runner . unPandocLua $ do
putCommonState origState
liftPandocLua $ setGlobals globals
r <- pLua
c <- getCommonState
return (r, c)
putCommonState newState
return result
-- | Global variables which should always be set.
defaultGlobals :: PandocMonad m => m [Global]
defaultGlobals = do
commonState <- getCommonState
return
[ PANDOC_API_VERSION
, PANDOC_STATE commonState
, PANDOC_VERSION
]
|