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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
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
|