aboutsummaryrefslogtreecommitdiff
path: root/src/Text/Pandoc/Lua/Module/Types.hs
blob: 4a7d14d2f21f442f0902ed26ec44d0eeaab61137 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
{-# LANGUAGE OverloadedStrings #-}
{- |
   Module      : Text.Pandoc.Lua.Module.Types
   Copyright   : © 2019-2021 Albert Krewinkel
   License     : GNU GPL, version 2 or above

   Maintainer  : Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>
   Stability   : alpha

Pandoc data type constructors.
-}
module Text.Pandoc.Lua.Module.Types
  ( pushModule
  ) where

import HsLua (LuaE, NumResults, Peeker, Pusher)
import Text.Pandoc.Error (PandocError)
import Text.Pandoc.Lua.ErrorConversion ()
import Text.Pandoc.Lua.Marshaling.AST
import Text.Pandoc.Lua.Util (addFunction)

import qualified HsLua as Lua
import qualified HsLua.Module.Version as Version

-- | Push the pandoc.types module on the Lua stack.
pushModule :: LuaE PandocError NumResults
pushModule = do
  Lua.newtable
  Lua.pushName "Version" *> Lua.pushModule Version.documentedModule
    *> Lua.rawset (Lua.nth 3)
  pushCloneTable
  Lua.setfield (Lua.nth 2) "clone"
  return 1

pushCloneTable :: LuaE PandocError NumResults
pushCloneTable = do
  Lua.newtable
  addFunction "Attr"      $ cloneWith peekAttr pushAttr
  addFunction "Block"     $ cloneWith peekBlock pushBlock
  addFunction "Inline"    $ cloneWith peekInline pushInline
  addFunction "Meta"      $ cloneWith peekMeta Lua.push
  addFunction "MetaValue" $ cloneWith peekMetaValue pushMetaValue
  addFunction "ListAttributes" $ cloneWith peekListAttributes pushListAttributes
  addFunction "Pandoc"    $ cloneWith peekPandoc pushPandoc
  return 1

cloneWith :: Peeker PandocError a
          -> Pusher PandocError a
          -> LuaE PandocError NumResults
cloneWith peeker pusher = do
  x <- Lua.forcePeek $ peeker (Lua.nthBottom 1)
  pusher x
  return (Lua.NumResults 1)