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:
Even Brenden 2022-01-21 21:00:45 +01:00 committed by GitHub
parent 672b6dc7e6
commit 7df29e495f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 99 additions and 2 deletions

View file

@ -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
----- ------------------------------------

View file

@ -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

View file

@ -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

View file

@ -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" =

View file

@ -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
View 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
View file

@ -0,0 +1,3 @@
---
desc: Found in working directory.
---

View file

@ -0,0 +1,3 @@
---
desc: Found in metadata directory.
---

View file

@ -0,0 +1,3 @@
---
desc: Should not be loaded.
---