aboutsummaryrefslogtreecommitdiff
path: root/pandoc-lua-engine
diff options
context:
space:
mode:
authorAlbert Krewinkel <[email protected]>2023-03-11 18:32:29 +0100
committerJohn MacFarlane <[email protected]>2023-06-22 10:48:33 -0700
commit5beb7a1b64448527d0a6e1c6adcb05c0edeee3d4 (patch)
tree685746055fd6741b5cdc73a5f32c378c7682048b /pandoc-lua-engine
parentb07552c23f7866acc08a3faddcddd5cfb61fd124 (diff)
Lua: report warnings from Lua scripts
Lua's warning system is plugged into pandoc's reporting architecture. Warnings that are raised with the Lua `warn` function are now reported together with other messages.
Diffstat (limited to 'pandoc-lua-engine')
-rw-r--r--pandoc-lua-engine/src/Text/Pandoc/Lua/Init.hs22
1 files changed, 21 insertions, 1 deletions
diff --git a/pandoc-lua-engine/src/Text/Pandoc/Lua/Init.hs b/pandoc-lua-engine/src/Text/Pandoc/Lua/Init.hs
index 60d39670a..2900fea27 100644
--- a/pandoc-lua-engine/src/Text/Pandoc/Lua/Init.hs
+++ b/pandoc-lua-engine/src/Text/Pandoc/Lua/Init.hs
@@ -23,12 +23,15 @@ import Control.Monad.Trans (MonadIO (..))
import Data.Maybe (catMaybes)
import Data.Version (makeVersion)
import HsLua as Lua hiding (status, try)
-import Text.Pandoc.Class (PandocMonad (..))
+import Text.Pandoc.Class (PandocMonad (..), report)
import Text.Pandoc.Data (readDataFile)
import Text.Pandoc.Error (PandocError (PandocLuaError))
+import Text.Pandoc.Logging (LogMessage (ScriptingWarning))
import Text.Pandoc.Lua.Global (Global (..), setGlobals)
import Text.Pandoc.Lua.Marshal.List (newListMetatable, pushListModule)
import Text.Pandoc.Lua.PandocLua (PandocLua (..), liftPandocLua)
+import Text.Parsec.Pos (newPos)
+import Text.Read (readMaybe)
import qualified Data.ByteString.Char8 as Char8
import qualified Data.Text as T
import qualified Lua.LPeg as LPeg
@@ -48,6 +51,7 @@ import qualified Text.Pandoc.Lua.Module.Template as Pandoc.Template
import qualified Text.Pandoc.Lua.Module.Text as Pandoc.Text
import qualified Text.Pandoc.Lua.Module.Types as Pandoc.Types
import qualified Text.Pandoc.Lua.Module.Utils as Pandoc.Utils
+import qualified Text.Pandoc.UTF8 as UTF8
-- | Run the Lua interpreter, using pandoc's default way of environment
-- initialization.
@@ -112,6 +116,7 @@ loadedModules =
initLuaState :: PandocLua ()
initLuaState = do
liftPandocLua Lua.openlibs
+ setWarnFunction
initJsonMetatable
initPandocModule
installLpegSearcher
@@ -232,3 +237,18 @@ defaultGlobals = do
, PANDOC_STATE commonState
, PANDOC_VERSION
]
+
+setWarnFunction :: PandocLua ()
+setWarnFunction = liftPandocLua . setwarnf' $ \msg -> do
+ -- reporting levels:
+ -- 0: this hook,
+ -- 1: userdata wrapper function for the hook,
+ -- 2: warn,
+ -- 3: function calling warn.
+ where' 3
+ loc <- UTF8.toText <$> tostring' top
+ unPandocLua . report $ ScriptingWarning (UTF8.toText msg) (toSourcePos loc)
+ where
+ toSourcePos loc = (T.breakOnEnd ":" <$> T.stripSuffix ": " loc)
+ >>= (\(prfx, sfx) -> (,) <$> T.unsnoc prfx <*> readMaybe (T.unpack sfx))
+ >>= \((source, _), line) -> Just $ newPos (T.unpack source) line 1