aboutsummaryrefslogtreecommitdiff
path: root/pandoc-lua-engine/src/Text/Pandoc/Lua/Module/Log.hs
diff options
context:
space:
mode:
Diffstat (limited to 'pandoc-lua-engine/src/Text/Pandoc/Lua/Module/Log.hs')
-rw-r--r--pandoc-lua-engine/src/Text/Pandoc/Lua/Module/Log.hs114
1 files changed, 114 insertions, 0 deletions
diff --git a/pandoc-lua-engine/src/Text/Pandoc/Lua/Module/Log.hs b/pandoc-lua-engine/src/Text/Pandoc/Lua/Module/Log.hs
new file mode 100644
index 000000000..6c5cd9ef5
--- /dev/null
+++ b/pandoc-lua-engine/src/Text/Pandoc/Lua/Module/Log.hs
@@ -0,0 +1,114 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TypeApplications #-}
+{- |
+ Module : Text.Pandoc.Lua.Module.Log
+ Copyright : © 2024 Albert Krewinkel
+ License : GPL-2.0-or-later
+ Maintainer : Albert Krewinkel <[email protected]>
+
+Logging module.
+-}
+module Text.Pandoc.Lua.Module.Log
+ ( documentedModule
+ ) where
+
+import Data.Version (makeVersion)
+import HsLua
+import Text.Pandoc.Class
+ ( CommonState (stVerbosity, stLog)
+ , PandocMonad (putCommonState, getCommonState)
+ , report )
+import Text.Pandoc.Error (PandocError)
+import Text.Pandoc.Logging
+ ( Verbosity (ERROR)
+ , LogMessage (ScriptingInfo, ScriptingWarning) )
+import Text.Pandoc.Lua.Marshal.List (pushPandocList)
+import Text.Pandoc.Lua.Marshal.LogMessage (pushLogMessage)
+import Text.Pandoc.Lua.PandocLua (liftPandocLua, unPandocLua)
+import Text.Pandoc.Lua.SourcePos (luaSourcePos)
+import qualified Data.Text as T
+import qualified HsLua.Core.Utf8 as UTF8
+
+-- | Push the pandoc.log module on the Lua stack.
+documentedModule :: Module PandocError
+documentedModule = Module
+ { moduleName = "pandoc.log"
+ , moduleDescription =
+ "Access to pandoc's logging system."
+ , moduleFields = []
+ , moduleFunctions =
+ [ defun "info"
+ ### (\msg -> do
+ -- reporting levels:
+ -- 0: this function,
+ -- 1: userdata wrapper function for the function,
+ -- 2: function calling warn.
+ pos <- luaSourcePos 2
+ unPandocLua $ report $ ScriptingInfo (UTF8.toText msg) pos)
+ <#> parameter peekByteString "string" "message" "the info message"
+ =#> []
+ #? "Reports a ScriptingInfo message to pandoc's logging system."
+ `since` makeVersion [3, 2]
+
+ , defun "silence"
+ ### const silence
+ <#> parameter pure "function" "fn"
+ "function to be silenced"
+ =?> ("List of log messages triggered during the function call, " <>
+ "and any value returned by the function.")
+ #? T.unlines
+ [ "Applies the function to the given arguments while"
+ , "preventing log messages from being added to the log."
+ , "The warnings and info messages reported during the function"
+ , "call are returned as the first return value, with the"
+ , "results of the function call following thereafter."
+ ]
+ `since` makeVersion [3, 2]
+
+ , defun "warn"
+ ### (\msg -> do
+ -- reporting levels:
+ -- 0: this function,
+ -- 1: userdata wrapper function for the function,
+ -- 2: function calling warn.
+ pos <- luaSourcePos 2
+ unPandocLua $ report $ ScriptingWarning (UTF8.toText msg) pos)
+ <#> parameter peekByteString "string" "message"
+ "the warning message"
+ =#> []
+ #? T.unlines
+ [ "Reports a ScriptingWarning to pandoc's logging system."
+ , "The warning will be printed to stderr unless logging"
+ , "verbosity has been set to *ERROR*."
+ ]
+ `since` makeVersion [3, 2]
+ ]
+ , moduleOperations = []
+ , moduleTypeInitializers = []
+ }
+
+-- | Calls the function given as the first argument, but suppresses logging.
+-- Returns the list of generated log messages as the first result, and the other
+-- results of the function call after that.
+silence :: LuaE PandocError NumResults
+silence = unPandocLua $ do
+ -- get current log messages
+ origState <- getCommonState
+ let origLog = stLog origState
+ let origVerbosity = stVerbosity origState
+ putCommonState (origState { stLog = [], stVerbosity = ERROR })
+
+ -- call function given as the first argument
+ liftPandocLua $ do
+ nargs <- (NumArgs . subtract 1 . fromStackIndex) <$> gettop
+ call @PandocError nargs multret
+
+ -- restore original log messages
+ newState <- getCommonState
+ let newLog = stLog newState
+ putCommonState (newState { stLog = origLog, stVerbosity = origVerbosity })
+
+ liftPandocLua $ do
+ pushPandocList pushLogMessage newLog
+ insert 1
+ (NumResults . fromStackIndex) <$> gettop