Search for metadata files in $DATADIR/metadata (#7851)
If files specified with `--metadata-file` are not found in the working directory, look in `$DATADIR/metadata`. Expose new `readMetadataFile` function from Text.Pandoc.Class [API change]. Expose new `PandocCouldNotFindMetadataFileError` constructor for `PandocError` from Text.Pandoc.Error [API change]. Closes #5876.
This commit is contained in:
parent
672b6dc7e6
commit
7df29e495f
9 changed files with 99 additions and 2 deletions
|
@ -644,7 +644,9 @@ header when requesting a document from a URL:
|
|||
files specified later on the command line will be preferred
|
||||
over those specified in earlier files. Metadata values
|
||||
specified inside the document, or by using `-M`, overwrite
|
||||
values specified with this option.
|
||||
values specified with this option. The file will be searched
|
||||
for first in the working directory, and then in the `metadata`
|
||||
subdirectory of the user data directory (see `--data-dir`).
|
||||
|
||||
`-p`, `--preserve-tabs`
|
||||
|
||||
|
@ -1512,6 +1514,7 @@ Nonzero exit codes have the following meanings:
|
|||
93 PandocIpynbDecodingError
|
||||
94 PandocUnsupportedCharsetError
|
||||
97 PandocCouldNotFindDataFileError
|
||||
98 PandocCouldNotFindMetadataFileError
|
||||
99 PandocResourceNotFound
|
||||
----- ------------------------------------
|
||||
|
||||
|
|
|
@ -251,6 +251,9 @@ extra-source-files:
|
|||
test/command/3510-export.latex
|
||||
test/command/3510-src.hs
|
||||
test/command/3971b.tex
|
||||
test/command/5876.yaml
|
||||
test/command/5876/metadata/5876.yaml
|
||||
test/command/5876/metadata/command/5876.yaml
|
||||
test/docbook-chapter.docbook
|
||||
test/docbook-reader.docbook
|
||||
test/docbook-xref.docbook
|
||||
|
|
|
@ -219,7 +219,7 @@ convertWithOpts opts = do
|
|||
case optMetadataFiles opts of
|
||||
[] -> return mempty
|
||||
paths -> mconcat <$>
|
||||
mapM (\path -> do raw <- readFileStrict path
|
||||
mapM (\path -> do raw <- readMetadataFile path
|
||||
yamlToMeta readerOpts (Just path) raw) paths
|
||||
|
||||
let transforms = (case optShiftHeadingLevelBy opts of
|
||||
|
|
|
@ -46,6 +46,7 @@ module Text.Pandoc.Class.PandocMonad
|
|||
, getResourcePath
|
||||
, readDefaultDataFile
|
||||
, readDataFile
|
||||
, readMetadataFile
|
||||
, fillMediaBag
|
||||
, toLang
|
||||
, setTranslations
|
||||
|
@ -586,6 +587,25 @@ readDataFile fname = do
|
|||
then readFileStrict (userDir </> fname)
|
||||
else readDefaultDataFile fname
|
||||
|
||||
-- | Read metadata file from the working directory or, if not found there, from
|
||||
-- the metadata subdirectory of the user data directory.
|
||||
readMetadataFile :: PandocMonad m => FilePath -> m B.ByteString
|
||||
readMetadataFile fname = do
|
||||
existsInWorkingDir <- fileExists fname
|
||||
if existsInWorkingDir
|
||||
then readFileStrict fname
|
||||
else do
|
||||
dataDir <- getUserDataDir
|
||||
case dataDir of
|
||||
Nothing ->
|
||||
throwError $ PandocCouldNotFindMetadataFileError $ T.pack fname
|
||||
Just userDir -> do
|
||||
let path = userDir </> "metadata" </> fname
|
||||
existsInUserDir <- fileExists path
|
||||
if existsInUserDir
|
||||
then readFileStrict path
|
||||
else throwError $ PandocCouldNotFindMetadataFileError $ T.pack fname
|
||||
|
||||
-- | Read file from from the default data files.
|
||||
readDefaultDataFile :: PandocMonad m => FilePath -> m B.ByteString
|
||||
readDefaultDataFile "reference.docx" =
|
||||
|
|
|
@ -54,6 +54,7 @@ data PandocError = PandocIOError Text IOError
|
|||
| PandocFilterError Text Text
|
||||
| PandocLuaError Text
|
||||
| PandocCouldNotFindDataFileError Text
|
||||
| PandocCouldNotFindMetadataFileError Text
|
||||
| PandocResourceNotFound Text
|
||||
| PandocTemplateError Text
|
||||
| PandocAppError Text
|
||||
|
@ -118,6 +119,8 @@ renderError e =
|
|||
PandocLuaError msg -> "Error running Lua:\n" <> msg
|
||||
PandocCouldNotFindDataFileError fn ->
|
||||
"Could not find data file " <> fn
|
||||
PandocCouldNotFindMetadataFileError fn ->
|
||||
"Could not find metadata file " <> fn
|
||||
PandocResourceNotFound fn ->
|
||||
"File " <> fn <> " not found in resource path"
|
||||
PandocTemplateError s -> "Error compiling template " <> s
|
||||
|
@ -198,6 +201,7 @@ handleError (Left e) =
|
|||
PandocIpynbDecodingError{} -> 93
|
||||
PandocUnsupportedCharsetError{} -> 94
|
||||
PandocCouldNotFindDataFileError{} -> 97
|
||||
PandocCouldNotFindMetadataFileError{} -> 98
|
||||
PandocResourceNotFound{} -> 99
|
||||
|
||||
err :: Int -> Text -> IO a
|
||||
|
|
58
test/command/5876.md
Normal file
58
test/command/5876.md
Normal file
|
@ -0,0 +1,58 @@
|
|||
```
|
||||
% pandoc -s -t native --data-dir=command/5876 --metadata-file=5876.yaml
|
||||
Hello
|
||||
^D
|
||||
Pandoc
|
||||
Meta
|
||||
{ unMeta =
|
||||
fromList
|
||||
[ ( "desc"
|
||||
, MetaInlines
|
||||
[ Str "Found"
|
||||
, Space
|
||||
, Str "in"
|
||||
, Space
|
||||
, Str "metadata"
|
||||
, Space
|
||||
, Str "directory."
|
||||
]
|
||||
)
|
||||
]
|
||||
}
|
||||
[ Para [ Str "Hello" ] ]
|
||||
```
|
||||
```
|
||||
% pandoc -s -t native --data-dir=command/5876 --metadata-file=command/5876.yaml
|
||||
Hello
|
||||
^D
|
||||
Pandoc
|
||||
Meta
|
||||
{ unMeta =
|
||||
fromList
|
||||
[ ( "desc"
|
||||
, MetaInlines
|
||||
[ Str "Found"
|
||||
, Space
|
||||
, Str "in"
|
||||
, Space
|
||||
, Str "working"
|
||||
, Space
|
||||
, Str "directory."
|
||||
]
|
||||
)
|
||||
]
|
||||
}
|
||||
[ Para [ Str "Hello" ] ]
|
||||
```
|
||||
```
|
||||
% pandoc -s -t native --data-dir=command/5876 --metadata-file=does-not-exist.yaml
|
||||
Hello
|
||||
^D
|
||||
Could not find metadata file does-not-exist.yaml
|
||||
```
|
||||
```
|
||||
% pandoc -s -t native --metadata-file=does-not-exist.yaml
|
||||
Hello
|
||||
^D
|
||||
Could not find metadata file does-not-exist.yaml
|
||||
```
|
3
test/command/5876.yaml
Normal file
3
test/command/5876.yaml
Normal file
|
@ -0,0 +1,3 @@
|
|||
---
|
||||
desc: Found in working directory.
|
||||
---
|
3
test/command/5876/metadata/5876.yaml
Normal file
3
test/command/5876/metadata/5876.yaml
Normal file
|
@ -0,0 +1,3 @@
|
|||
---
|
||||
desc: Found in metadata directory.
|
||||
---
|
3
test/command/5876/metadata/command/5876.yaml
Normal file
3
test/command/5876/metadata/command/5876.yaml
Normal file
|
@ -0,0 +1,3 @@
|
|||
---
|
||||
desc: Should not be loaded.
|
||||
---
|
Loading…
Add table
Reference in a new issue