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`.
This commit is contained in:
parent
2abf56f508
commit
6d351df1ed
3 changed files with 12 additions and 3 deletions
|
@ -540,9 +540,10 @@ library
|
||||||
build-depends: template-haskell
|
build-depends: template-haskell
|
||||||
if flag(lua53)
|
if flag(lua53)
|
||||||
build-depends: hslua >= 2.1 && < 2.2,
|
build-depends: hslua >= 2.1 && < 2.2,
|
||||||
hslua-aeson >= 2.1 && < 2.3
|
hslua-aeson >= 2.2.1 && < 2.3
|
||||||
else
|
else
|
||||||
build-depends: hslua >= 2.2.1 && < 2.3
|
build-depends: hslua >= 2.2.1 && < 2.3
|
||||||
|
, hslua-aeson >= 2.2.1 && < 2.3
|
||||||
if flag(embed_data_files)
|
if flag(embed_data_files)
|
||||||
cpp-options: -DEMBED_DATA_FILES
|
cpp-options: -DEMBED_DATA_FILES
|
||||||
other-modules: Text.Pandoc.Data
|
other-modules: Text.Pandoc.Data
|
||||||
|
|
|
@ -21,11 +21,12 @@ import Data.Maybe (catMaybes)
|
||||||
import HsLua as Lua hiding (status, try)
|
import HsLua as Lua hiding (status, try)
|
||||||
import Text.Pandoc.Class.PandocMonad (PandocMonad, readDataFile)
|
import Text.Pandoc.Class.PandocMonad (PandocMonad, readDataFile)
|
||||||
import Text.Pandoc.Error (PandocError (PandocLuaError))
|
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 Text.Pandoc.Lua.PandocLua (PandocLua, liftPandocLua, runPandocLua)
|
||||||
import qualified Data.ByteString.Char8 as Char8
|
import qualified Data.ByteString.Char8 as Char8
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
import qualified Lua.LPeg as LPeg
|
import qualified Lua.LPeg as LPeg
|
||||||
|
import qualified HsLua.Aeson
|
||||||
import qualified HsLua.Module.DocLayout as Module.Layout
|
import qualified HsLua.Module.DocLayout as Module.Layout
|
||||||
import qualified HsLua.Module.Path as Module.Path
|
import qualified HsLua.Module.Path as Module.Path
|
||||||
import qualified HsLua.Module.Text as Module.Text
|
import qualified HsLua.Module.Text as Module.Text
|
||||||
|
@ -66,6 +67,7 @@ loadedModules =
|
||||||
initLuaState :: PandocLua ()
|
initLuaState :: PandocLua ()
|
||||||
initLuaState = do
|
initLuaState = do
|
||||||
liftPandocLua Lua.openlibs
|
liftPandocLua Lua.openlibs
|
||||||
|
initJsonMetatable
|
||||||
initPandocModule
|
initPandocModule
|
||||||
installLpegSearcher
|
installLpegSearcher
|
||||||
setGlobalModules
|
setGlobalModules
|
||||||
|
@ -143,3 +145,9 @@ initLuaState = do
|
||||||
Lua.pushHaskellFunction $ Lua.state >>= liftIO . LPeg.lpeg_searcher
|
Lua.pushHaskellFunction $ Lua.state >>= liftIO . LPeg.lpeg_searcher
|
||||||
Lua.rawseti (Lua.nth 2) . (+1) . fromIntegral =<< Lua.rawlen (Lua.nth 2)
|
Lua.rawseti (Lua.nth 2) . (+1) . fromIntegral =<< Lua.rawlen (Lua.nth 2)
|
||||||
Lua.pop 1 -- remove 'package.searchers' from stack
|
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 ())
|
||||||
|
|
|
@ -12,7 +12,7 @@ extra-deps:
|
||||||
- emojis-0.1.2
|
- emojis-0.1.2
|
||||||
- lpeg-1.0.3
|
- lpeg-1.0.3
|
||||||
- hslua-2.2.1
|
- hslua-2.2.1
|
||||||
- hslua-aeson-2.2.0
|
- hslua-aeson-2.2.1
|
||||||
- hslua-classes-2.2.0
|
- hslua-classes-2.2.0
|
||||||
- hslua-core-2.2.1
|
- hslua-core-2.2.1
|
||||||
- hslua-marshalling-2.2.1
|
- hslua-marshalling-2.2.1
|
||||||
|
|
Loading…
Reference in a new issue