diff options
author | Albert Krewinkel <albert@zeitkraut.de> | 2017-08-13 14:55:33 +0200 |
---|---|---|
committer | Albert Krewinkel <albert@zeitkraut.de> | 2017-08-13 17:24:17 +0200 |
commit | 6e6cee454eab678b8ad3b15edcee6e07945157ba (patch) | |
tree | bf4caf90424b39215d72d8d151613b983ea30d7b /src/Text/Pandoc | |
parent | b9c7adf02ee5da08e97746e9638ddcb162ff651d (diff) | |
download | pandoc-6e6cee454eab678b8ad3b15edcee6e07945157ba.tar.gz |
Text.Pandoc.Lua: cleanup element walking code
WalkM is general enough to work in any monad, not just IO. Also get rid
of the LuaException type, sufficient to use the one defined in hslua.
Diffstat (limited to 'src/Text/Pandoc')
-rw-r--r-- | src/Text/Pandoc/Lua.hs | 48 |
1 files changed, 20 insertions, 28 deletions
diff --git a/src/Text/Pandoc/Lua.hs b/src/Text/Pandoc/Lua.hs index c5770a18b..264364006 100644 --- a/src/Text/Pandoc/Lua.hs +++ b/src/Text/Pandoc/Lua.hs @@ -30,33 +30,25 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Pandoc lua utils. -} -module Text.Pandoc.Lua ( LuaException(..), - runLuaFilter, - pushPandocModule ) where +module Text.Pandoc.Lua (LuaException (..), pushPandocModule, runLuaFilter) where -import Control.Exception import Control.Monad (unless, when, (>=>), mplus) import Control.Monad.Trans (MonadIO (..)) import Data.Data (toConstr, showConstr, dataTypeOf, dataTypeConstrs, Data) import Data.Map (Map) import Data.Maybe (isJust) -import Data.Typeable (Typeable) -import Foreign.Lua (Lua, FromLuaStack (..), ToLuaStack (..), runLua, - peekEither, getglobal', throwLuaError) -import Foreign.Lua.Types.Lua (runLuaWith, liftLua1) -import Foreign.Lua.Api +import Foreign.Lua (Lua, FromLuaStack (peek), LuaException (..), StackIndex, + Status(OK), ToLuaStack (push), call, isnil, dofile, + getglobal', gettop, isfunction, newtable, openlibs, pcall, + peekEither, pop, pushvalue, rawgeti, rawseti, ref, + registryindex, runLua, setglobal, throwLuaError) import Text.Pandoc.Definition import Text.Pandoc.Lua.PandocModule (pushPandocModule) import Text.Pandoc.Lua.StackInstances () -import Text.Pandoc.Walk +import Text.Pandoc.Walk (Walkable (walkM)) import qualified Data.Map as Map -newtype LuaException = LuaException String - deriving (Show, Typeable) - -instance Exception LuaException - runLuaFilter :: (MonadIO m) => Maybe FilePath -> FilePath -> [String] -> Pandoc -> m Pandoc runLuaFilter datadir filterPath args pd = liftIO . runLua $ do @@ -90,26 +82,26 @@ runAll :: [LuaFilter] -> Pandoc -> Lua Pandoc runAll = foldr ((>=>) . walkMWithLuaFilter) return walkMWithLuaFilter :: LuaFilter -> Pandoc -> Lua Pandoc -walkMWithLuaFilter (LuaFilter fnMap) = liftLua1 walkLua +walkMWithLuaFilter (LuaFilter fnMap) = walkLua where - walkLua :: LuaState -> Pandoc -> IO Pandoc - walkLua l = + walkLua :: Pandoc -> Lua Pandoc + walkLua = (if hasOneOf (constructorsFor (dataTypeOf (Str []))) - then walkM (runLuaWith l . (tryFilter fnMap :: Inline -> Lua Inline)) + then walkM (tryFilter fnMap :: Inline -> Lua Inline) else return) >=> (if hasOneOf (constructorsFor (dataTypeOf (Para []))) - then walkM ((runLuaWith l . (tryFilter fnMap :: Block -> Lua Block))) + then walkM (tryFilter fnMap :: Block -> Lua Block) else return) >=> (case Map.lookup "Meta" fnMap of - Just fn -> walkM ((\(Pandoc meta blocks) -> runLuaWith l $ do - meta' <- runFilterFunction fn meta - return $ Pandoc meta' blocks)) + Just fn -> walkM (\(Pandoc meta blocks) -> do + meta' <- runFilterFunction fn meta + return $ Pandoc meta' blocks) Nothing -> return) >=> (case Map.lookup "Pandoc" fnMap `mplus` Map.lookup "Doc" fnMap of - Just fn -> runLuaWith l . (runFilterFunction fn :: Pandoc -> Lua Pandoc) + Just fn -> runFilterFunction fn :: Pandoc -> Lua Pandoc Nothing -> return) hasOneOf = any (\k -> isJust (Map.lookup k fnMap)) constructorsFor x = map show (dataTypeConstrs x) @@ -146,10 +138,10 @@ runFilterFunction lf x = do let prefix = "Error while running filter function: " throwLuaError $ prefix ++ msg else do - resType <- ltype (-1) - case resType of - TypeNil -> pop 1 *> return x - _ -> do + noExplicitFilter <- isnil (-1) + if noExplicitFilter + then pop 1 *> return x + else do mbres <- peekEither (-1) case mbres of Left err -> throwLuaError |