From a23d14079c056af3c63d7903dfd17b30c1e1b8d6 Mon Sep 17 00:00:00 2001 From: Albert Krewinkel Date: Wed, 15 Mar 2023 18:25:17 +0100 Subject: pandoc-cli: add a Lua REPL --- pandoc-cli/lua/PandocCLI/Lua.hs | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) (limited to 'pandoc-cli/lua') diff --git a/pandoc-cli/lua/PandocCLI/Lua.hs b/pandoc-cli/lua/PandocCLI/Lua.hs index 368f9cf49..07259af04 100644 --- a/pandoc-cli/lua/PandocCLI/Lua.hs +++ b/pandoc-cli/lua/PandocCLI/Lua.hs @@ -11,6 +11,9 @@ module PandocCLI.Lua (runLuaInterpreter, getEngine) where import Control.Monad ((<=<)) import HsLua.CLI (EnvBehavior (..), Settings (..), runStandalone) +import System.Environment (lookupEnv) +import System.IO.Temp (withSystemTempFile) +import System.IO (hClose) import Text.Pandoc.Class (runIOorExplode) import Text.Pandoc.Error (handleError) import Text.Pandoc.Lua (runLua, runLuaNoEnv, getEngine) @@ -18,16 +21,32 @@ import Text.Pandoc.Version (pandocVersionText) -- | Runs pandoc as a Lua interpreter that is (mostly) compatible with -- the default @lua@ program shipping with Lua. +-- +-- The filename for the history of the REPL is taken from the +-- @PANDOC_REPL_HISTORY@ environment variable if possible. Otherwise a +-- new temporary file is used; it is removed after the REPL finishes. runLuaInterpreter :: String -- ^ Program name -> [String] -- ^ Command line arguments -> IO () runLuaInterpreter progName args = do - let settings = Settings - { settingsVersionInfo = "\nEmbedded in pandoc " <> pandocVersionText - , settingsRunner = runner - } - runStandalone settings progName args + -- We need some kind of temp + mbhistfile <- lookupEnv "PANDOC_REPL_HISTORY" + case mbhistfile of + Just histfile -> runStandaloneWithHistory histfile + Nothing -> withSystemTempFile "pandoc-hist" $ \fp handle -> do + -- We cannot pass a handle to the repl; the file will be re-opened + -- there. + hClose handle + runStandaloneWithHistory fp where + runStandaloneWithHistory histfile = do + let settings = Settings + { settingsVersionInfo = "\nEmbedded in pandoc " <> + pandocVersionText + , settingsRunner = runner + , settingsHistory = Just histfile + } + runStandalone settings progName args runner envBehavior = let runLua' = case envBehavior of IgnoreEnvVars -> runLuaNoEnv -- cgit v1.2.3