aboutsummaryrefslogtreecommitdiff
path: root/src/Text/Pandoc
diff options
context:
space:
mode:
authorAlbert Krewinkel <albert@zeitkraut.de>2017-08-13 14:55:33 +0200
committerAlbert Krewinkel <albert@zeitkraut.de>2017-08-13 17:24:17 +0200
commit6e6cee454eab678b8ad3b15edcee6e07945157ba (patch)
treebf4caf90424b39215d72d8d151613b983ea30d7b /src/Text/Pandoc
parentb9c7adf02ee5da08e97746e9638ddcb162ff651d (diff)
downloadpandoc-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.hs48
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