git.iko.soy/typeable/pandoc
on master help sign in
Lua filter: use destructured functions for block filters

Filtering functions take element components as arguments instead of the whole block elements. This resembles the way elements are handled in custom writers.

commit07f41a5515c0d753c8b3fa074132ba219db8360c authorAlbert Krewinkel <albert@zeitkraut.de> dateFri 14 Apr 2017, 11:21 (10 years ago) parent0516b51
3 files changed+26−21
src/Text/Pandoc/Lua.hs+23−17 test/lua/markdown-reader.lua+1−2 test/lua/plain-to-para.lua+2−2
src/Text/Pandoc/Lua.hs+23−17
@@ -107,24 +107,30 @@ execBlockLuaFilter :: LuaState
107107 -> Map String (LuaFilterFunction Block)
108108 -> Block -> IO Block
109109execBlockLuaFilter lua fnMap x = do
110− let filterOrId constr = case Map.lookup constr fnMap of
111− Nothing -> return x
112− Just fn -> runLuaFilterFunction lua fn x
110+ let runFn :: PushViaFilterFunction Block a => LuaFilterFunction Block -> a
111+ runFn fn = runLuaFilterFunction lua fn
112+ let tryFilter :: String -> (LuaFilterFunction Block -> IO Block) -> IO Block
113+ tryFilter fnName callFilterFn =
114+ case Map.lookup fnName fnMap of
115+ Nothing -> return x
116+ Just fn -> callFilterFn fn
113117 case x of
114− Plain _ -> filterOrId "Plain"
115− Para _ -> filterOrId "Para"
116− LineBlock _ -> filterOrId "LineBlock"
117− CodeBlock _ _ -> filterOrId "CodeBlock"
118− RawBlock _ _ -> filterOrId "RawBlock"
119− BlockQuote _ -> filterOrId "BlockQuote"
120− OrderedList _ _ -> filterOrId "OrderedList"
121− BulletList _ -> filterOrId "BulletList"
122− DefinitionList _ -> filterOrId "DefinitionList"
123− Header _ _ _ -> filterOrId "Header"
124− HorizontalRule -> filterOrId "HorizontalRule"
125− Table _ _ _ _ _ -> filterOrId "Table"
126− Div _ _ -> filterOrId "Div"
127− Null -> filterOrId "Null"
118+ HorizontalRule -> tryFilter "HorizontalRule" runFn
119+ Null -> tryFilter "Null" runFn
120+ BlockQuote blcks -> tryFilter "BlockQuote" $ \fn -> runFn fn blcks
121+ BulletList items -> tryFilter "BulletList" $ \fn -> runFn fn items
122+ CodeBlock attr code -> tryFilter "CodeBlock" $ \fn -> runFn fn attr code
123+ DefinitionList lst -> tryFilter "DefinitionList" $ \fn -> runFn fn lst
124+ Div attr content -> tryFilter "Div" $ \fn -> runFn fn content attr
125+ Header lvl attr inlns -> tryFilter "Header" $ \fn -> runFn fn lvl inlns attr
126+ LineBlock inlns -> tryFilter "LineBlock" $ \fn -> runFn fn inlns
127+ Para inlns -> tryFilter "Para" $ \fn -> runFn fn inlns
128+ Plain inlns -> tryFilter "Plain" $ \fn -> runFn fn inlns
129+ RawBlock format str -> tryFilter "RawBlock" $ \fn -> runFn fn format str
130+ OrderedList (num,sty,delim) items ->
131+ tryFilter "OrderedList" $ \fn -> runFn fn items (num,sty,delim)
132+ Table capt aligns widths headers rows ->
133+ tryFilter "Table" $ \fn -> runFn fn capt aligns widths headers rows
128134
129135execInlineLuaFilter :: LuaState
130136 -> Map String (LuaFilterFunction Inline)
test/lua/markdown-reader.lua+1−2
@@ -1,7 +1,6 @@
11return {
22 {
3− RawBlock = function (blk)
4− local format, content = unpack(blk.c)
3+ RawBlock = function (format, content)
54 if format == "markdown" then
65 return pandoc.reader.markdown.read_block(content)
76 else
test/lua/plain-to-para.lua+2−2
@@ -1,6 +1,6 @@
11return {
2− { Plain = function (blk)
3− return pandoc.Para(blk.c)
2+ { Plain = function (content)
3+ return pandoc.Para(content)
44 end,
55 }
66}