@@ -49,6 +49,7 @@ import Text.Pandoc.Lua.Util (loadScriptFromDataDir)
49import qualified Foreign.Lua as Lua
49import qualified Foreign.Lua as Lua
50import qualified Foreign.Lua.Module.Text as Lua
50import qualified Foreign.Lua.Module.Text as Lua
51import qualified Text.Pandoc.Definition as Pandoc
51import qualified Text.Pandoc.Definition as Pandoc
52+import qualified Text.Pandoc.Lua.Module.Pandoc as ModulePandoc
53-- | Lua error message
54-- | Lua error message
54newtype LuaException = LuaException String deriving (Show)
55newtype LuaException = LuaException String deriving (Show)
@@ -95,16 +96,37 @@ luaPackageParams = do
96-- | Initialize the lua state with all required values
97-- | Initialize the lua state with all required values
97initLuaState :: LuaPackageParams -> Lua ()
98initLuaState :: LuaPackageParams -> Lua ()
98−initLuaState luaPkgParams = do
99+initLuaState pkgParams = do
99 Lua.openlibs
100 Lua.openlibs
100 Lua.preloadTextModule "text"
101 Lua.preloadTextModule "text"
101− installPandocPackageSearcher luaPkgParams
102+ installPandocPackageSearcher pkgParams
102− loadScriptFromDataDir (luaPkgDataDir luaPkgParams) "init.lua"
104+ loadScriptFromDataDir (luaPkgDataDir pkgParams) "init.lua"
106+ initPandocModule :: Lua ()
107+ initPandocModule = do
108+ -- Push module table
109+ ModulePandoc.pushModule (luaPkgDataDir pkgParams)
110+ -- register as loaded module
111+ Lua.pushvalue Lua.stackTop
112+ Lua.getfield Lua.registryindex Lua.loadedTableRegistryField
113+ Lua.setfield (Lua.nthFromTop 2) "pandoc"
115+ -- copy constructors into registry
103− putConstructorsInRegistry
116+ putConstructorsInRegistry
117+ -- assign module to global variable
118+ Lua.setglobal "pandoc"
120+-- | AST elements are marshaled via normal constructor functions in the
121+-- @pandoc@ module. However, accessing Lua globals from Haskell is
122+-- expensive (due to error handling). Accessing the Lua registry is much
123+-- cheaper, which is why the constructor functions are copied into the
124+-- Lua registry and called from there.
126+-- This function expects the @pandoc@ module to be at the top of the
105putConstructorsInRegistry :: Lua ()
128putConstructorsInRegistry :: Lua ()
106putConstructorsInRegistry = do
129putConstructorsInRegistry = do
107− Lua.getglobal "pandoc"
108 constrsToReg $ Pandoc.Pandoc mempty mempty
130 constrsToReg $ Pandoc.Pandoc mempty mempty
109 constrsToReg $ Pandoc.Str mempty
131 constrsToReg $ Pandoc.Str mempty
110 constrsToReg $ Pandoc.Para mempty
132 constrsToReg $ Pandoc.Para mempty
@@ -113,7 +135,6 @@ putConstructorsInRegistry = do
113 constrsToReg $ Pandoc.Citation mempty mempty mempty Pandoc.AuthorInText 0 0
135 constrsToReg $ Pandoc.Citation mempty mempty mempty Pandoc.AuthorInText 0 0
114 putInReg "Attr" -- used for Attr type alias
136 putInReg "Attr" -- used for Attr type alias
115 putInReg "ListAttributes" -- used for ListAttributes type alias
137 putInReg "ListAttributes" -- used for ListAttributes type alias
118 constrsToReg :: Data a => a -> Lua ()
139 constrsToReg :: Data a => a -> Lua ()
119 constrsToReg = mapM_ (putInReg . showConstr) . dataTypeConstrs . dataTypeOf
140 constrsToReg = mapM_ (putInReg . showConstr) . dataTypeConstrs . dataTypeOf