aboutsummaryrefslogtreecommitdiff
path: root/src/Text/Pandoc/Lua
diff options
context:
space:
mode:
authorAlbert Krewinkel <albert@zeitkraut.de>2021-10-24 22:49:34 +0200
committerAlbert Krewinkel <albert@zeitkraut.de>2021-10-25 09:08:58 +0200
commit230b133db53e8ef2677fe13304e1e03276ca6448 (patch)
treebada7875937f7d4f7d2c98d6ea4c0d169dc37dcd /src/Text/Pandoc/Lua
parent113a66bd08fa4921157d95873c18c46431e565f9 (diff)
downloadpandoc-230b133db53e8ef2677fe13304e1e03276ca6448.tar.gz
Lua: marshal Citation values as userdata objects
Diffstat (limited to 'src/Text/Pandoc/Lua')
-rw-r--r--src/Text/Pandoc/Lua/Marshaling/AST.hs45
-rw-r--r--src/Text/Pandoc/Lua/Module/Pandoc.hs23
-rw-r--r--src/Text/Pandoc/Lua/Module/Types.hs1
3 files changed, 53 insertions, 16 deletions
diff --git a/src/Text/Pandoc/Lua/Marshaling/AST.hs b/src/Text/Pandoc/Lua/Marshaling/AST.hs
index 5791b39c1..e436ffffc 100644
--- a/src/Text/Pandoc/Lua/Marshaling/AST.hs
+++ b/src/Text/Pandoc/Lua/Marshaling/AST.hs
@@ -37,6 +37,7 @@ module Text.Pandoc.Lua.Marshaling.AST
, pushAttr
, pushBlock
+ , pushCitation
, pushInline
, pushListAttributes
, pushMetaValue
@@ -109,24 +110,35 @@ instance Pushable Inline where
instance Pushable Citation where
push = pushCitation
-pushCitation :: LuaError e => Pusher e Citation
-pushCitation (Citation cid prefix suffix mode noteNum hash) =
- pushViaConstr' "Citation"
- [ push cid, push mode, push prefix, push suffix, push noteNum, push hash
+typeCitation :: LuaError e => DocumentedType e Citation
+typeCitation = deftype "Citation" []
+ [ property "id" "citation ID / key"
+ (pushText, citationId)
+ (peekText, \citation cid -> citation{ citationId = cid })
+ , property "mode" "citation mode"
+ (pushString . show, citationMode)
+ (peekRead, \citation mode -> citation{ citationMode = mode })
+ , property "prefix" "citation prefix"
+ (pushInlines, citationPrefix)
+ (peekInlines, \citation prefix -> citation{ citationPrefix = prefix })
+ , property "suffix" "citation suffix"
+ (pushInlines, citationSuffix)
+ (peekInlines, \citation suffix -> citation{ citationPrefix = suffix })
+ , property "note_num" "note number"
+ (pushIntegral, citationNoteNum)
+ (peekIntegral, \citation noteNum -> citation{ citationNoteNum = noteNum })
+ , property "hash" "hash number"
+ (pushIntegral, citationHash)
+ (peekIntegral, \citation hash -> citation{ citationHash = hash })
+ , method $ defun "clone" ### return <#> udparam typeCitation "obj" ""
+ =#> functionResult pushCitation "Citation" "copy of obj"
]
-peekCitation :: LuaError e => Peeker e Citation
-peekCitation = fmap (retrieving "Citation")
- . typeChecked "table" Lua.istable $ \idx -> do
- idx' <- liftLua $ absindex idx
- Citation
- <$!> peekFieldRaw peekText "id" idx'
- <*> peekFieldRaw (peekList peekInline) "prefix" idx'
- <*> peekFieldRaw (peekList peekInline) "suffix" idx'
- <*> peekFieldRaw peekRead "mode" idx'
- <*> peekFieldRaw peekIntegral "note_num" idx'
- <*> peekFieldRaw peekIntegral "hash" idx'
+pushCitation :: LuaError e => Pusher e Citation
+pushCitation = pushUD typeCitation
+peekCitation :: LuaError e => Peeker e Citation
+peekCitation = peekUD typeCitation
instance Pushable Alignment where
push = Lua.pushString . show
@@ -289,6 +301,9 @@ peekBlocks = peekList peekBlock
peekInlines :: LuaError e => Peeker e [Inline]
peekInlines = peekList peekInline
+pushInlines :: LuaError e => Pusher e [Inline]
+pushInlines = pushPandocList pushInline
+
-- | Push Caption element
pushCaption :: LuaError e => Caption -> LuaE e ()
pushCaption (Caption shortCaption longCaption) = do
diff --git a/src/Text/Pandoc/Lua/Module/Pandoc.hs b/src/Text/Pandoc/Lua/Module/Pandoc.hs
index eeadfa340..bc9ddc5e5 100644
--- a/src/Text/Pandoc/Lua/Module/Pandoc.hs
+++ b/src/Text/Pandoc/Lua/Module/Pandoc.hs
@@ -64,6 +64,7 @@ pushModule = do
pushName (functionName fn)
pushDocumentedFunction fn
rawset (nth 3)
+ forM_ otherConstructors addConstr
forM_ inlineConstructors addConstr
-- add constructors to Inlines.constructor
newtable -- constructor
@@ -165,6 +166,28 @@ mkInlinesConstr name constr = defun name
<#> parameter peekFuzzyInlines "content" "Inlines" ""
=#> functionResult pushInline "Inline" "new object"
+otherConstructors :: LuaError e => [DocumentedFunction e]
+otherConstructors =
+ [ defun "Citation"
+ ### (\cid mode mprefix msuffix mnote_num mhash ->
+ cid `seq` mode `seq` mprefix `seq` msuffix `seq`
+ mnote_num `seq` mhash `seq` return $! Citation
+ { citationId = cid
+ , citationMode = mode
+ , citationPrefix = fromMaybe mempty mprefix
+ , citationSuffix = fromMaybe mempty msuffix
+ , citationNoteNum = fromMaybe 0 mnote_num
+ , citationHash = fromMaybe 0 mhash
+ })
+ <#> parameter peekText "string" "cid" "citation ID (e.g. bibtex key)"
+ <#> parameter peekRead "citation mode" "mode" "citation rendering mode"
+ <#> optionalParameter peekFuzzyInlines "prefix" "Inlines" ""
+ <#> optionalParameter peekFuzzyInlines "suffix" "Inlines" ""
+ <#> optionalParameter peekIntegral "note_num" "integer" "note number"
+ <#> optionalParameter peekIntegral "hash" "integer" "hash number"
+ =#> functionResult pushCitation "Citation" "new citation object"
+ #? "Creates a single citation."
+ ]
walkElement :: (Walkable (SingletonsList Inline) a,
Walkable (SingletonsList Block) a,
diff --git a/src/Text/Pandoc/Lua/Module/Types.hs b/src/Text/Pandoc/Lua/Module/Types.hs
index 7307c6e88..4a7d14d2f 100644
--- a/src/Text/Pandoc/Lua/Module/Types.hs
+++ b/src/Text/Pandoc/Lua/Module/Types.hs
@@ -37,7 +37,6 @@ pushCloneTable = do
Lua.newtable
addFunction "Attr" $ cloneWith peekAttr pushAttr
addFunction "Block" $ cloneWith peekBlock pushBlock
- addFunction "Citation" $ cloneWith peekCitation Lua.push
addFunction "Inline" $ cloneWith peekInline pushInline
addFunction "Meta" $ cloneWith peekMeta Lua.push
addFunction "MetaValue" $ cloneWith peekMetaValue pushMetaValue