From 8ef995cfc0f9f53444fedf517c05fe02cb6311e7 Mon Sep 17 00:00:00 2001 From: Albert Krewinkel Date: Sat, 27 Oct 2018 09:38:28 +0200 Subject: T.P.Filter: centralize filter path expansion --- src/Text/Pandoc/Filter.hs | 13 +++++++++++-- src/Text/Pandoc/Filter/JSON.hs | 5 +---- src/Text/Pandoc/Filter/Lua.hs | 10 ++++------ 3 files changed, 16 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/Text/Pandoc/Filter.hs b/src/Text/Pandoc/Filter.hs index 8fe93089a..1c25a5a6e 100644 --- a/src/Text/Pandoc/Filter.hs +++ b/src/Text/Pandoc/Filter.hs @@ -42,20 +42,29 @@ import Text.Pandoc.Definition (Pandoc) import Text.Pandoc.Options (ReaderOptions) import qualified Text.Pandoc.Filter.JSON as JSONFilter import qualified Text.Pandoc.Filter.Lua as LuaFilter +import qualified Text.Pandoc.Filter.Path as Path +-- | Type of filter and path to filter file. data Filter = LuaFilter FilePath | JSONFilter FilePath deriving (Show) +-- | Modify the given document using a filter. applyFilters :: ReaderOptions -> [Filter] -> [String] -> Pandoc -> PandocIO Pandoc -applyFilters ropts filters args d = - foldrM ($) d $ map applyFilter filters +applyFilters ropts filters args d = do + expandedFilters <- mapM expandFilterPath filters + foldrM ($) d $ map applyFilter expandedFilters where applyFilter (JSONFilter f) = JSONFilter.apply ropts args f applyFilter (LuaFilter f) = LuaFilter.apply ropts args f +-- | Expand paths of filters, searching the data directory. +expandFilterPath :: Filter -> PandocIO Filter +expandFilterPath (LuaFilter fp) = LuaFilter <$> Path.expandFilterPath fp +expandFilterPath (JSONFilter fp) = JSONFilter <$> Path.expandFilterPath fp + $(deriveJSON defaultOptions ''Filter) diff --git a/src/Text/Pandoc/Filter/JSON.hs b/src/Text/Pandoc/Filter/JSON.hs index 97b291603..2846e42e2 100644 --- a/src/Text/Pandoc/Filter/JSON.hs +++ b/src/Text/Pandoc/Filter/JSON.hs @@ -44,7 +44,6 @@ import System.FilePath ((), takeExtension) import Text.Pandoc.Class (PandocIO) import Text.Pandoc.Error (PandocError (PandocFilterError)) import Text.Pandoc.Definition (Pandoc) -import Text.Pandoc.Filter.Path (expandFilterPath) import Text.Pandoc.Options (ReaderOptions) import Text.Pandoc.Process (pipeProcess) import Text.Pandoc.Shared (pandocVersion) @@ -56,9 +55,7 @@ apply :: ReaderOptions -> FilePath -> Pandoc -> PandocIO Pandoc -apply ropts args f d = do - f' <- expandFilterPath f - liftIO $ externalFilter ropts f' args d +apply ropts args f = liftIO . externalFilter ropts f args externalFilter :: MonadIO m => ReaderOptions -> FilePath -> [String] -> Pandoc -> m Pandoc diff --git a/src/Text/Pandoc/Filter/Lua.hs b/src/Text/Pandoc/Filter/Lua.hs index a6dc7b6cc..e5c34c71c 100644 --- a/src/Text/Pandoc/Filter/Lua.hs +++ b/src/Text/Pandoc/Filter/Lua.hs @@ -36,7 +36,6 @@ import Control.Monad ((>=>)) import Text.Pandoc.Class (PandocIO) import Text.Pandoc.Definition (Pandoc) import Text.Pandoc.Error (PandocError (PandocFilterError)) -import Text.Pandoc.Filter.Path (expandFilterPath) import Text.Pandoc.Lua (Global (..), LuaException (..), runLua, runFilterFile, setGlobals) import Text.Pandoc.Options (ReaderOptions) @@ -49,17 +48,16 @@ apply :: ReaderOptions -> FilePath -> Pandoc -> PandocIO Pandoc -apply ropts args f doc = do - filterPath <- expandFilterPath f +apply ropts args fp doc = do let format = case args of (x:_) -> x _ -> error "Format not supplied for Lua filter" - runLua >=> forceResult filterPath $ do + runLua >=> forceResult fp $ do setGlobals [ FORMAT format , PANDOC_READER_OPTIONS ropts - , PANDOC_SCRIPT_FILE filterPath + , PANDOC_SCRIPT_FILE fp ] - runFilterFile filterPath doc + runFilterFile fp doc forceResult :: FilePath -> Either LuaException Pandoc -> PandocIO Pandoc forceResult fp eitherResult = case eitherResult of -- cgit v1.2.3