git.iko.soy/typeable/pandoc
on master help sign in
Text.Pandoc.Lua: support Inline and Block catch-alls
41baaffAlbert Krewinkel
data/pandoc.lua+2−1
@@ -808,7 +808,8 @@ function M.global_filter()
808 function is_filter_function(k)
808 function is_filter_function(k)
809 return M.Inline.constructor[k] or
809 return M.Inline.constructor[k] or
810 M.Block.constructor[k] or
810 M.Block.constructor[k] or
811− k == "Meta" or k == "Doc" or k == "Pandoc"
811+ k == "Meta" or k == "Doc" or k == "Pandoc" or
812+ k == "Block" or k == "Inline"
812 end
813 end
813 for k, v in pairs(_G) do
814 for k, v in pairs(_G) do
814 if is_filter_function(k) then
815 if is_filter_function(k) then
src/Text/Pandoc/Lua.hs+8−6
@@ -35,7 +35,7 @@ module Text.Pandoc.Lua (LuaException (..), pushPandocModule, runLuaFilter) where
35import Control.Monad (mplus, unless, when, (>=>))
35import Control.Monad (mplus, unless, when, (>=>))
36import Control.Monad.Trans (MonadIO (..))
36import Control.Monad.Trans (MonadIO (..))
37import Data.Data (DataType, Data, toConstr, showConstr, dataTypeOf,
37import Data.Data (DataType, Data, toConstr, showConstr, dataTypeOf,
38− dataTypeConstrs)
38+ dataTypeConstrs, dataTypeName)
39import Data.Foldable (foldrM)
39import Data.Foldable (foldrM)
40import Data.Map (Map)
40import Data.Map (Map)
41import Data.Maybe (isJust)
41import Data.Maybe (isJust)
@@ -108,10 +108,10 @@ constructorsFor :: DataType -> [String]
108constructorsFor x = map show (dataTypeConstrs x)
108constructorsFor x = map show (dataTypeConstrs x)
109
109
110inlineFilterNames :: [String]
110inlineFilterNames :: [String]
111−inlineFilterNames = constructorsFor (dataTypeOf (Str []))
111+inlineFilterNames = "Inline" : constructorsFor (dataTypeOf (Str []))
112
112
113blockFilterNames :: [String]
113blockFilterNames :: [String]
114−blockFilterNames = constructorsFor (dataTypeOf (Para []))
114+blockFilterNames = "Block" : constructorsFor (dataTypeOf (Para []))
115
115
116metaFilterName :: String
116metaFilterName :: String
117metaFilterName = "Meta"
117metaFilterName = "Meta"
@@ -126,10 +126,12 @@ newtype LuaFilterFunction = LuaFilterFunction { functionIndex :: Int }
126-- | Try running a filter for the given element
126-- | Try running a filter for the given element
127tryFilter :: (Data a, FromLuaStack a, ToLuaStack a) => FunctionMap -> a -> Lua a
127tryFilter :: (Data a, FromLuaStack a, ToLuaStack a) => FunctionMap -> a -> Lua a
128tryFilter fnMap x =
128tryFilter fnMap x =
129− let filterFnName = showConstr (toConstr x) in
129+ let filterFnName = showConstr (toConstr x)
130+ catchAllName = dataTypeName (dataTypeOf x)
131+ in
130− case Map.lookup filterFnName fnMap of
132+ case Map.lookup filterFnName fnMap `mplus` Map.lookup catchAllName fnMap of
131− Nothing -> return x
132 Just fn -> runFilterFunction fn x
133 Just fn -> runFilterFunction fn x
134+ Nothing -> return x
133
135
134instance FromLuaStack LuaFilter where
136instance FromLuaStack LuaFilter where
135 peek idx =
137 peek idx =
test/Tests/Lua.hs+6
@@ -70,6 +70,12 @@ tests = map (localOption (QuickCheckTests 20))
70 "metatable-catch-all.lua"
70 "metatable-catch-all.lua"
71 (doc . para $ "four words, three spaces")
71 (doc . para $ "four words, three spaces")
72 (doc . para $ str "7")
72 (doc . para $ str "7")
73+
74+ , testCase "Count blocks via Block-specific catch-all" $
75+ assertFilterConversion "filtering with Block catch-all failed"
76+ "block-count.lua"
77+ (doc $ para "one" <> para "two")
78+ (doc $ para "2")
73 ]
79 ]
74
80
75assertFilterConversion :: String -> FilePath -> Pandoc -> Pandoc -> Assertion
81assertFilterConversion :: String -> FilePath -> Pandoc -> Pandoc -> Assertion
test/lua/block-count.luanew file+11
@@ -0,0 +1,11 @@
1+local num_blocks = 0
2+
3+function Block(el)
4+ num_blocks = num_blocks + 1
5+end
6+
7+function Pandoc(blocks, meta)
8+ return pandoc.Pandoc {
9+ pandoc.Para{pandoc.Str(num_blocks)}
10+ }
11+end