@@ -34,6 +34,7 @@ module Text.Pandoc.Lua.Init
3434 ) where
3535
3636import Control.Monad.Trans (MonadIO (..))
37+import Data.Data (Data, dataTypeConstrs, dataTypeOf, showConstr)
3738import Data.IORef (newIORef, readIORef)
3839import Data.Version (Version (versionBranch))
3940import Foreign.Lua (Lua, LuaException (..))
@@ -48,6 +49,7 @@ import Text.Pandoc.Lua.Util (loadScriptFromDataDir)
4849
4950import qualified Foreign.Lua as Lua
5051import qualified Foreign.Lua.Module.Text as Lua
52+import qualified Text.Pandoc.Definition as Pandoc
5153
5254-- | Run the lua interpreter, using pandoc's default way of environment
5355-- initalization.
@@ -84,3 +86,26 @@ initLuaState luaPkgParams = do
8486 Lua.setglobal "PANDOC_API_VERSION"
8587 installPandocPackageSearcher luaPkgParams
8688 loadScriptFromDataDir (luaPkgDataDir luaPkgParams) "init.lua"
89+ putConstructorsInRegistry
90+
91+putConstructorsInRegistry :: Lua ()
92+putConstructorsInRegistry = do
93+ Lua.getglobal "pandoc"
94+ constrsToReg $ Pandoc.Pandoc mempty mempty
95+ constrsToReg $ Pandoc.Str mempty
96+ constrsToReg $ Pandoc.Para mempty
97+ constrsToReg $ Pandoc.Meta mempty
98+ constrsToReg $ Pandoc.MetaList mempty
99+ constrsToReg $ Pandoc.Citation mempty mempty mempty Pandoc.AuthorInText 0 0
100+ putInReg "Attr" -- used for Attr type alias
101+ Lua.pop 1
102+ where
103+ constrsToReg :: Data a => a -> Lua ()
104+ constrsToReg = mapM_ putInReg . map showConstr . dataTypeConstrs . dataTypeOf
105+
106+ putInReg :: String -> Lua ()
107+ putInReg name = do
108+ Lua.push ("pandoc." ++ name) -- name in registry
109+ Lua.push name -- in pandoc module
110+ Lua.rawget (Lua.nthFromTop 3)
111+ Lua.rawset Lua.registryindex