aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlbert Krewinkel <[email protected]>2022-06-23 22:49:32 +0200
committerAlbert Krewinkel <[email protected]>2022-06-23 22:53:11 +0200
commit6d351df1ed6a1ea4e36713d50951403121271742 (patch)
treea205e1f154f8926eba48e71090cdd1506b246594 /src
parent2abf56f508760a9a7711a00a4d3fd9fa83c6f61e (diff)
Lua: ensure that tables marshaled via JSON arrays behave like Lists.
This allows to invoke methods like `map` and `includes` on lists like `PANDOC_WRITER_OPTIONS.extensions`.
Diffstat (limited to 'src')
-rw-r--r--src/Text/Pandoc/Lua/Init.hs10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/Text/Pandoc/Lua/Init.hs b/src/Text/Pandoc/Lua/Init.hs
index ab03296ad..966f0a581 100644
--- a/src/Text/Pandoc/Lua/Init.hs
+++ b/src/Text/Pandoc/Lua/Init.hs
@@ -21,11 +21,12 @@ import Data.Maybe (catMaybes)
import HsLua as Lua hiding (status, try)
import Text.Pandoc.Class.PandocMonad (PandocMonad, readDataFile)
import Text.Pandoc.Error (PandocError (PandocLuaError))
-import Text.Pandoc.Lua.Marshal.List (pushListModule)
+import Text.Pandoc.Lua.Marshal.List (newListMetatable, pushListModule)
import Text.Pandoc.Lua.PandocLua (PandocLua, liftPandocLua, runPandocLua)
import qualified Data.ByteString.Char8 as Char8
import qualified Data.Text as T
import qualified Lua.LPeg as LPeg
+import qualified HsLua.Aeson
import qualified HsLua.Module.DocLayout as Module.Layout
import qualified HsLua.Module.Path as Module.Path
import qualified HsLua.Module.Text as Module.Text
@@ -66,6 +67,7 @@ loadedModules =
initLuaState :: PandocLua ()
initLuaState = do
liftPandocLua Lua.openlibs
+ initJsonMetatable
initPandocModule
installLpegSearcher
setGlobalModules
@@ -143,3 +145,9 @@ initLuaState = do
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
+
+-- | Setup the metatable that's assigned to Lua tables that were created
+-- from/via JSON arrays.
+initJsonMetatable :: PandocLua ()
+initJsonMetatable = liftPandocLua $ do
+ newListMetatable HsLua.Aeson.jsonarray (pure ())