git.iko.soy/typeable/pandoc
on master help sign in
T.P.Filter: centralize filter path expansion
8ef995cAlbert Krewinkel
src/Text/Pandoc/Filter.hs+11−2
@@ -42,20 +42,29 @@ import Text.Pandoc.Definition (Pandoc)
42import Text.Pandoc.Options (ReaderOptions)
42import Text.Pandoc.Options (ReaderOptions)
43import qualified Text.Pandoc.Filter.JSON as JSONFilter
43import qualified Text.Pandoc.Filter.JSON as JSONFilter
44import qualified Text.Pandoc.Filter.Lua as LuaFilter
44import qualified Text.Pandoc.Filter.Lua as LuaFilter
45+import qualified Text.Pandoc.Filter.Path as Path
45
46
47+-- | Type of filter and path to filter file.
46data Filter = LuaFilter FilePath
48data Filter = LuaFilter FilePath
47 | JSONFilter FilePath
49 | JSONFilter FilePath
48 deriving (Show)
50 deriving (Show)
49
51
52+-- | Modify the given document using a filter.
50applyFilters :: ReaderOptions
53applyFilters :: ReaderOptions
51 -> [Filter]
54 -> [Filter]
52 -> [String]
55 -> [String]
53 -> Pandoc
56 -> Pandoc
54 -> PandocIO Pandoc
57 -> PandocIO Pandoc
55−applyFilters ropts filters args d =
58+applyFilters ropts filters args d = do
59+ expandedFilters <- mapM expandFilterPath filters
56− foldrM ($) d $ map applyFilter filters
60+ foldrM ($) d $ map applyFilter expandedFilters
57 where
61 where
58 applyFilter (JSONFilter f) = JSONFilter.apply ropts args f
62 applyFilter (JSONFilter f) = JSONFilter.apply ropts args f
59 applyFilter (LuaFilter f) = LuaFilter.apply ropts args f
63 applyFilter (LuaFilter f) = LuaFilter.apply ropts args f
60
64
65+-- | Expand paths of filters, searching the data directory.
66+expandFilterPath :: Filter -> PandocIO Filter
67+expandFilterPath (LuaFilter fp) = LuaFilter <$> Path.expandFilterPath fp
68+expandFilterPath (JSONFilter fp) = JSONFilter <$> Path.expandFilterPath fp
69+
61$(deriveJSON defaultOptions ''Filter)
70$(deriveJSON defaultOptions ''Filter)
src/Text/Pandoc/Filter/JSON.hs+1−4
@@ -44,7 +44,6 @@ import System.FilePath ((</>), takeExtension)
44import Text.Pandoc.Class (PandocIO)
44import Text.Pandoc.Class (PandocIO)
45import Text.Pandoc.Error (PandocError (PandocFilterError))
45import Text.Pandoc.Error (PandocError (PandocFilterError))
46import Text.Pandoc.Definition (Pandoc)
46import Text.Pandoc.Definition (Pandoc)
47−import Text.Pandoc.Filter.Path (expandFilterPath)
48import Text.Pandoc.Options (ReaderOptions)
47import Text.Pandoc.Options (ReaderOptions)
49import Text.Pandoc.Process (pipeProcess)
48import Text.Pandoc.Process (pipeProcess)
50import Text.Pandoc.Shared (pandocVersion)
49import Text.Pandoc.Shared (pandocVersion)
@@ -56,9 +55,7 @@ apply :: ReaderOptions
56 -> FilePath
55 -> FilePath
57 -> Pandoc
56 -> Pandoc
58 -> PandocIO Pandoc
57 -> PandocIO Pandoc
59−apply ropts args f d = do
60− f' <- expandFilterPath f
61− liftIO $ externalFilter ropts f' args d
58+apply ropts args f = liftIO . externalFilter ropts f args
62
59
63externalFilter :: MonadIO m
60externalFilter :: MonadIO m
64 => ReaderOptions -> FilePath -> [String] -> Pandoc -> m Pandoc
61 => ReaderOptions -> FilePath -> [String] -> Pandoc -> m Pandoc
src/Text/Pandoc/Filter/Lua.hs+4−6
@@ -36,7 +36,6 @@ import Control.Monad ((>=>))
36import Text.Pandoc.Class (PandocIO)
36import Text.Pandoc.Class (PandocIO)
37import Text.Pandoc.Definition (Pandoc)
37import Text.Pandoc.Definition (Pandoc)
38import Text.Pandoc.Error (PandocError (PandocFilterError))
38import Text.Pandoc.Error (PandocError (PandocFilterError))
39−import Text.Pandoc.Filter.Path (expandFilterPath)
40import Text.Pandoc.Lua (Global (..), LuaException (..),
39import Text.Pandoc.Lua (Global (..), LuaException (..),
41 runLua, runFilterFile, setGlobals)
40 runLua, runFilterFile, setGlobals)
42import Text.Pandoc.Options (ReaderOptions)
41import Text.Pandoc.Options (ReaderOptions)
@@ -49,17 +48,16 @@ apply :: ReaderOptions
49 -> FilePath
48 -> FilePath
50 -> Pandoc
49 -> Pandoc
51 -> PandocIO Pandoc
50 -> PandocIO Pandoc
52−apply ropts args f doc = do
51+apply ropts args fp doc = do
53− filterPath <- expandFilterPath f
54 let format = case args of
52 let format = case args of
55 (x:_) -> x
53 (x:_) -> x
56 _ -> error "Format not supplied for Lua filter"
54 _ -> error "Format not supplied for Lua filter"
57− runLua >=> forceResult filterPath $ do
55+ runLua >=> forceResult fp $ do
58 setGlobals [ FORMAT format
56 setGlobals [ FORMAT format
59 , PANDOC_READER_OPTIONS ropts
57 , PANDOC_READER_OPTIONS ropts
60− , PANDOC_SCRIPT_FILE filterPath
58+ , PANDOC_SCRIPT_FILE fp
61 ]
59 ]
62− runFilterFile filterPath doc
60+ runFilterFile fp doc
63
61
64forceResult :: FilePath -> Either LuaException Pandoc -> PandocIO Pandoc
62forceResult :: FilePath -> Either LuaException Pandoc -> PandocIO Pandoc
65forceResult fp eitherResult = case eitherResult of
63forceResult fp eitherResult = case eitherResult of