git.iko.soy/typeable/pandoc
on master help sign in
Text.Pandoc.Lua: more code simplification.
cb25326John MacFarlane
src/Text/Pandoc/Lua.hs+26−30
@@ -2,6 +2,7 @@
2{-# LANGUAGE FlexibleInstances #-}
2{-# LANGUAGE FlexibleInstances #-}
3{-# LANGUAGE MultiParamTypeClasses #-}
3{-# LANGUAGE MultiParamTypeClasses #-}
4{-# LANGUAGE DeriveDataTypeable #-}
4{-# LANGUAGE DeriveDataTypeable #-}
5+{-# LANGUAGE ScopedTypeVariables #-}
5{-
6{-
6Copyright © 2017 Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>
7Copyright © 2017 Albert Krewinkel <tarleb+pandoc@moltkeplatz.de>
7
8
@@ -34,10 +35,11 @@ module Text.Pandoc.Lua ( LuaException(..),
34 pushPandocModule ) where
35 pushPandocModule ) where
35
36
36import Control.Exception
37import Control.Exception
37−import Control.Monad (unless, when, (>=>))
38+import Control.Monad (unless, when, (>=>), mplus)
38import Control.Monad.Trans (MonadIO (..))
39import Control.Monad.Trans (MonadIO (..))
39−import Data.Data (toConstr)
40+import Data.Data (toConstr, showConstr, dataTypeOf, dataTypeConstrs, Data)
40import Data.Map (Map)
41import Data.Map (Map)
42+import Data.Maybe (isJust)
41import Data.Typeable (Typeable)
43import Data.Typeable (Typeable)
42import Scripting.Lua (LuaState, StackValue (..))
44import Scripting.Lua (LuaState, StackValue (..))
43import Text.Pandoc.Definition
45import Text.Pandoc.Definition
@@ -91,44 +93,38 @@ runAll = foldr ((>=>) . walkMWithLuaFilter) return
91
93
92walkMWithLuaFilter :: LuaFilter -> Pandoc -> IO Pandoc
94walkMWithLuaFilter :: LuaFilter -> Pandoc -> IO Pandoc
93walkMWithLuaFilter (LuaFilter lua fnMap) =
95walkMWithLuaFilter (LuaFilter lua fnMap) =
94− walkM (execInlineLuaFilter lua fnMap) >=>
96+ (if hasOneOf (constructorsFor (dataTypeOf (Str [])))
95− walkM (execBlockLuaFilter lua fnMap) >=>
97+ then walkM (tryFilter lua fnMap :: Inline -> IO Inline)
96− walkM (execMetaLuaFilter lua fnMap) >=>
98+ else return)
97− walkM (execDocLuaFilter lua fnMap)
99+ >=>
100+ (if hasOneOf (constructorsFor (dataTypeOf (Para [])))
101+ then walkM (tryFilter lua fnMap :: Block -> IO Block)
102+ else return)
103+ >=>
104+ (case Map.lookup "Meta" fnMap of
105+ Just fn -> walkM (\(Pandoc meta blocks) -> do
106+ meta' <- runFilterFunction lua fn meta
107+ return $ Pandoc meta' blocks)
108+ Nothing -> return)
109+ >=>
110+ (case Map.lookup "Pandoc" fnMap `mplus` Map.lookup "Doc" fnMap of
111+ Just fn -> (runFilterFunction lua fn) :: Pandoc -> IO Pandoc
112+ Nothing -> return)
113+ where hasOneOf = any (\k -> isJust (Map.lookup k fnMap))
114+ constructorsFor x = map show (dataTypeConstrs x)
98
115
99type FunctionMap = Map String LuaFilterFunction
116type FunctionMap = Map String LuaFilterFunction
100data LuaFilter = LuaFilter LuaState FunctionMap
117data LuaFilter = LuaFilter LuaState FunctionMap
101
118
102newtype LuaFilterFunction = LuaFilterFunction { functionIndex :: Int }
119newtype LuaFilterFunction = LuaFilterFunction { functionIndex :: Int }
103
120
104−tryFilter :: StackValue a => LuaState -> FunctionMap -> String -> a -> IO a
121+tryFilter :: (Data a, StackValue a) => LuaState -> FunctionMap -> a -> IO a
105−tryFilter lua fnMap filterFnName x =
122+tryFilter lua fnMap x =
123+ let filterFnName = showConstr (toConstr x) in
106 case Map.lookup filterFnName fnMap of
124 case Map.lookup filterFnName fnMap of
107 Nothing -> return x
125 Nothing -> return x
108 Just fn -> runFilterFunction lua fn x
126 Just fn -> runFilterFunction lua fn x
109
127
110−execDocLuaFilter :: LuaState
111− -> FunctionMap
112− -> Pandoc -> IO Pandoc
113−execDocLuaFilter lua fnMap = tryFilter lua fnMap "Doc"
114−
115−execMetaLuaFilter :: LuaState
116− -> FunctionMap
117− -> Pandoc -> IO Pandoc
118−execMetaLuaFilter lua fnMap (Pandoc meta blks) = do
119− meta' <- tryFilter lua fnMap "Meta" meta
120− return $ Pandoc meta' blks
121−
122−execBlockLuaFilter :: LuaState
123− -> FunctionMap
124− -> Block -> IO Block
125−execBlockLuaFilter lua fnMap x = tryFilter lua fnMap (show (toConstr x)) x
126−
127−execInlineLuaFilter :: LuaState
128− -> FunctionMap
129− -> Inline -> IO Inline
130−execInlineLuaFilter lua fnMap x = tryFilter lua fnMap (show (toConstr x)) x
131−
132instance StackValue LuaFilter where
128instance StackValue LuaFilter where
133 valuetype _ = Lua.TTABLE
129 valuetype _ = Lua.TTABLE
134 push = undefined
130 push = undefined