aboutsummaryrefslogtreecommitdiff
path: root/src/Text/Pandoc/Lua/Module/Pandoc.hs
diff options
context:
space:
mode:
authorAlbert Krewinkel <albert@zeitkraut.de>2021-10-20 21:40:07 +0200
committerJohn MacFarlane <jgm@berkeley.edu>2021-10-22 11:16:51 -0700
commite4287e6c950745ad78954b791bc87f322cd05530 (patch)
tree967cf9866536e96b1656842e6b0792c01e2bc12f /src/Text/Pandoc/Lua/Module/Pandoc.hs
parent9e74826ba9ce4139bfdd3f057a79efa8b644e85a (diff)
downloadpandoc-e4287e6c950745ad78954b791bc87f322cd05530.tar.gz
Lua: marshal Pandoc values as userdata
Diffstat (limited to 'src/Text/Pandoc/Lua/Module/Pandoc.hs')
-rw-r--r--src/Text/Pandoc/Lua/Module/Pandoc.hs14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/Text/Pandoc/Lua/Module/Pandoc.hs b/src/Text/Pandoc/Lua/Module/Pandoc.hs
index 0a9ebaec5..84d6be360 100644
--- a/src/Text/Pandoc/Lua/Module/Pandoc.hs
+++ b/src/Text/Pandoc/Lua/Module/Pandoc.hs
@@ -15,6 +15,7 @@ module Text.Pandoc.Lua.Module.Pandoc
) where
import Prelude hiding (read)
+import Control.Applicative (optional)
import Control.Monad ((>=>), when)
import Control.Monad.Except (throwError)
import Data.Default (Default (..))
@@ -23,7 +24,7 @@ import HsLua as Lua hiding (pushModule)
import HsLua.Class.Peekable (PeekError)
import System.Exit (ExitCode (..))
import Text.Pandoc.Class.PandocIO (runIO)
-import Text.Pandoc.Definition (Block, Inline)
+import Text.Pandoc.Definition
import Text.Pandoc.Lua.Filter (SingletonsList (..), walkInlines,
walkInlineLists, walkBlocks, walkBlockLists)
import Text.Pandoc.Lua.Marshaling ()
@@ -51,6 +52,8 @@ pushModule = do
addFunction "pipe" pipe
addFunction "walk_block" (walkElement peekBlock pushBlock)
addFunction "walk_inline" (walkElement peekInline pushInline)
+ -- Constructors
+ addFunction "Pandoc" mkPandoc
return 1
walkElement :: (Walkable (SingletonsList Inline) a,
@@ -142,3 +145,12 @@ pushPipeError pipeErr = do
, if output == mempty then BSL.pack "<no output>" else output
]
return (NumResults 1)
+
+mkPandoc :: PandocLua NumResults
+mkPandoc = liftPandocLua $ do
+ doc <- forcePeek $ do
+ blks <- peekBlocks (nthBottom 1)
+ mMeta <- optional $ peekMeta (nthBottom 2)
+ pure $ Pandoc (fromMaybe nullMeta mMeta) blks
+ pushPandoc doc
+ return 1