git.iko.soy/typeable/pandoc
on master help sign in
Lua filters: store constructors in registry
517f65aAlbert Krewinkel
src/Text/Pandoc/Lua/Init.hs+25
@@ -34,6 +34,7 @@ module Text.Pandoc.Lua.Init
34 ) where
34 ) where
35
35
36import Control.Monad.Trans (MonadIO (..))
36import Control.Monad.Trans (MonadIO (..))
37+import Data.Data (Data, dataTypeConstrs, dataTypeOf, showConstr)
37import Data.IORef (newIORef, readIORef)
38import Data.IORef (newIORef, readIORef)
38import Data.Version (Version (versionBranch))
39import Data.Version (Version (versionBranch))
39import Foreign.Lua (Lua, LuaException (..))
40import Foreign.Lua (Lua, LuaException (..))
@@ -48,6 +49,7 @@ import Text.Pandoc.Lua.Util (loadScriptFromDataDir)
48
49
49import qualified Foreign.Lua as Lua
50import qualified Foreign.Lua as Lua
50import qualified Foreign.Lua.Module.Text as Lua
51import qualified Foreign.Lua.Module.Text as Lua
52+import qualified Text.Pandoc.Definition as Pandoc
51
53
52-- | Run the lua interpreter, using pandoc's default way of environment
54-- | Run the lua interpreter, using pandoc's default way of environment
53-- initalization.
55-- initalization.
@@ -84,3 +86,26 @@ initLuaState luaPkgParams = do
84 Lua.setglobal "PANDOC_API_VERSION"
86 Lua.setglobal "PANDOC_API_VERSION"
85 installPandocPackageSearcher luaPkgParams
87 installPandocPackageSearcher luaPkgParams
86 loadScriptFromDataDir (luaPkgDataDir luaPkgParams) "init.lua"
88 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
src/Text/Pandoc/Lua/Module/Pandoc.hs+1−1
@@ -82,7 +82,7 @@ readDoc content formatSpecOrNil = do
82 res <- liftIO $ runIO $ r def{ readerExtensions = es } (pack content)
82 res <- liftIO $ runIO $ r def{ readerExtensions = es } (pack content)
83 case res of
83 case res of
84 Right pd -> (1 :: NumResults) <$ Lua.push pd -- success, push Pandoc
84 Right pd -> (1 :: NumResults) <$ Lua.push pd -- success, push Pandoc
85− Left s -> Lua.raiseError (show s) -- error while reading
85+ Left s -> Lua.raiseError (show s) -- error while reading
86 _ -> Lua.raiseError "Only string formats are supported at the moment."
86 _ -> Lua.raiseError "Only string formats are supported at the moment."
87
87
88-- | Pipes input through a command.
88-- | Pipes input through a command.
src/Text/Pandoc/Lua/Util.hs+3−2
@@ -50,7 +50,7 @@ import Control.Monad (when)
50import Control.Monad.Catch (finally)
50import Control.Monad.Catch (finally)
51import Data.ByteString.Char8 (unpack)
51import Data.ByteString.Char8 (unpack)
52import Foreign.Lua (FromLuaStack (..), NumResults, Lua, NumArgs, StackIndex,
52import Foreign.Lua (FromLuaStack (..), NumResults, Lua, NumArgs, StackIndex,
53− ToLuaStack (..), ToHaskellFunction, getglobal')
53+ ToLuaStack (..), ToHaskellFunction)
54import Foreign.Lua.Api (Status, call, pop, rawget, rawgeti, rawset, rawseti)
54import Foreign.Lua.Api (Status, call, pop, rawget, rawgeti, rawset, rawseti)
55import Text.Pandoc.Class (readDataFile, runIOorExplode, setUserDataDir)
55import Text.Pandoc.Class (readDataFile, runIOorExplode, setUserDataDir)
56
56
@@ -131,7 +131,8 @@ class PushViaCall a where
131
131
132instance PushViaCall (Lua ()) where
132instance PushViaCall (Lua ()) where
133 pushViaCall' fn pushArgs num = do
133 pushViaCall' fn pushArgs num = do
134− getglobal' fn
134+ Lua.push fn
135+ Lua.rawget (Lua.registryindex)
135 pushArgs
136 pushArgs
136 call num 1
137 call num 1
137
138