From ab0fe676a8507ea1ff4e77b97f548a92b13b6317 Mon Sep 17 00:00:00 2001 From: Albert Krewinkel Date: Mon, 8 Nov 2021 12:14:44 +0100 Subject: Lua: ensure that 're' module is always available. The module is shipped with LPeg. --- pandoc.cabal | 2 +- src/Text/Pandoc/Lua/Init.hs | 8 ++++++++ test/Tests/Lua.hs | 10 +++++++++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/pandoc.cabal b/pandoc.cabal index 764b459ba..438ad3942 100644 --- a/pandoc.cabal +++ b/pandoc.cabal @@ -563,7 +563,7 @@ library http-types >= 0.8 && < 0.13, ipynb >= 0.1.0.2 && < 0.2, jira-wiki-markup >= 1.4 && < 1.5, - lpeg >= 1.0 && < 1.1, + lpeg >= 1.0.1 && < 1.1, mtl >= 2.2 && < 2.3, network >= 2.6, network-uri >= 2.6 && < 2.8, diff --git a/src/Text/Pandoc/Lua/Init.hs b/src/Text/Pandoc/Lua/Init.hs index 5b2a2f3e4..727c79d84 100644 --- a/src/Text/Pandoc/Lua/Init.hs +++ b/src/Text/Pandoc/Lua/Init.hs @@ -46,6 +46,7 @@ initLuaState :: PandocLua () initLuaState = do liftPandocLua Lua.openlibs installPandocPackageSearcher + installLpegSearcher initPandocModule requireGlobalModules loadInitScript "init.lua" @@ -99,6 +100,13 @@ initLuaState = do -- Module on top of stack. Register as global Lua.setglobal "lpeg" + installLpegSearcher :: PandocLua () + installLpegSearcher = liftPandocLua $ do + Lua.getglobal' "package.searchers" + Lua.pushHaskellFunction $ Lua.state >>= liftIO . LPeg.lpeg_searcher + Lua.rawseti (Lua.nth 2) . (+1) . fromIntegral =<< Lua.rawlen (Lua.nth 2) + Lua.pop 1 -- remove 'package.searchers' from stack + -- | AST elements are marshaled via normal constructor functions in the -- @pandoc@ module. However, accessing Lua globals from Haskell is -- expensive (due to error handling). Accessing the Lua registry is much diff --git a/test/Tests/Lua.hs b/test/Tests/Lua.hs index d3694d8a9..6ee07f8fa 100644 --- a/test/Tests/Lua.hs +++ b/test/Tests/Lua.hs @@ -18,7 +18,7 @@ import Control.Monad (when) import HsLua as Lua hiding (Operation (Div), error) import System.FilePath (()) import Test.Tasty (TestTree, localOption) -import Test.Tasty.HUnit (Assertion, HasCallStack, assertEqual, testCase) +import Test.Tasty.HUnit ((@=?), Assertion, HasCallStack, assertEqual, testCase) import Test.Tasty.QuickCheck (QuickCheckTests (..), ioProperty, testProperty) import Text.Pandoc.Arbitrary () import Text.Pandoc.Builder (bulletList, definitionList, displayMath, divWith, @@ -211,6 +211,14 @@ tests = map (localOption (QuickCheckTests 20)) ty <- Lua.ltype Lua.top Lua.liftIO $ assertEqual "module should be a table" Lua.TypeTable ty + , testCase "module 'lpeg' is loaded into a global" . runLuaTest $ do + s <- Lua.dostring "assert(type(lpeg)=='table');assert(lpeg==require'lpeg')" + Lua.liftIO $ Lua.OK @=? s + + , testCase "module 're' is available" . runLuaTest $ do + s <- Lua.dostring "require 're'" + Lua.liftIO $ Lua.OK @=? s + , testCase "informative error messages" . runLuaTest $ do Lua.pushboolean True -- Lua.newtable -- cgit v1.2.3