Changed resolution of filter paths.
- We now first treat the argument of `--filter` as a full (absolute or relative) path, looking for a program there. If it's found, we run it. - If not, and if it is a simple program name or a relative path, we try resolving it relative to `$DATADIR/filters`. - If this fails, then we treat it as a program name and look in the user's PATH. Previously if you did `--filter foo` and you had `foo` in your path and also an executable `foo` in your working directory, the one in the path would be used. Now the one in the working directory is used. In addition, when you do `--filter foo/bar.hs`, pandoc will now find a filter `$DATADIR/filters/foo/bar.hs` -- assuming there isn't a `foo/bar.hs` relative to the working directory. @jkr note the slight revision of what we had before. This was motivated by the idea that one might clone filter repositories into the filters subdirectory; it is nice to be able to run them as `reponame/filtername`.
This commit is contained in:
parent
8d7ecc27a1
commit
ac6dfe0b4e
2 changed files with 16 additions and 19 deletions
|
@ -426,7 +426,7 @@ Reader options
|
|||
footnotes and links will not work across files. Reading binary
|
||||
files (docx, odt, epub) implies `--file-scope`.
|
||||
|
||||
`--filter=`*EXECUTABLE*
|
||||
`--filter=`*PROGRAM*
|
||||
|
||||
: Specify an executable to be used as a filter transforming the
|
||||
pandoc AST after the input is parsed and before the output is
|
||||
|
@ -450,12 +450,6 @@ Reader options
|
|||
pandoc filter libraries in [PHP], [perl], and
|
||||
[javascript/node.js].
|
||||
|
||||
If no directory is provided pandoc will look for executable or
|
||||
non-executable filters in the director `$DATADIR/filters`, and
|
||||
then for executable filters in the user's `PATH`. If you want to
|
||||
run a script in the working directory, preface the filename with
|
||||
`./`.
|
||||
|
||||
In order of preference, pandoc will look for filters in
|
||||
|
||||
1. a specified full or relative path (executable or
|
||||
|
|
27
pandoc.hs
27
pandoc.hs
|
@ -1111,19 +1111,22 @@ adjustMetadata metadata d = return $ M.foldWithKey setMeta d metadata
|
|||
applyTransforms :: [Transform] -> Pandoc -> IO Pandoc
|
||||
applyTransforms transforms d = return $ foldr ($) d transforms
|
||||
|
||||
-- First we check to see if a filter is a path. If it isn't, we
|
||||
-- check to see whether it's in `userdir/filters`. If not, we leave
|
||||
-- it unchanged.
|
||||
-- First we check to see if a filter is found. If not, and if it's
|
||||
-- not an absolute path, we check to see whether it's in `userdir/filters`.
|
||||
-- If not, we leave it unchanged.
|
||||
expandFilterPath :: Maybe FilePath -> FilePath -> IO FilePath
|
||||
expandFilterPath mbDatadir fp
|
||||
| '/' `elem` fp = return fp
|
||||
| Just datadir <- mbDatadir = do
|
||||
let filterPath = (datadir </> "filters" </> fp)
|
||||
filterPathExists <- doesFileExist filterPath
|
||||
if filterPathExists
|
||||
then return filterPath
|
||||
else return fp
|
||||
| otherwise = return fp
|
||||
expandFilterPath mbDatadir fp = do
|
||||
fpExists <- doesFileExist fp
|
||||
if fpExists
|
||||
then return fp
|
||||
else case mbDatadir of
|
||||
Just datadir | isRelative fp -> do
|
||||
let filterPath = (datadir </> "filters" </> fp)
|
||||
filterPathExists <- doesFileExist filterPath
|
||||
if filterPathExists
|
||||
then return filterPath
|
||||
else return fp
|
||||
_ -> return fp
|
||||
|
||||
applyFilters :: Maybe FilePath -> [FilePath] -> [String] -> Pandoc -> IO Pandoc
|
||||
applyFilters mbDatadir filters args d = do
|
||||
|
|
Loading…
Add table
Reference in a new issue