Search for metadata files in $DATADIR/metadata ()

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 .
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 files specified later on the command line will be preferred
over those specified in earlier files. Metadata values over those specified in earlier files. Metadata values
specified inside the document, or by using `-M`, overwrite 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` `-p`, `--preserve-tabs`
@ -1512,6 +1514,7 @@ Nonzero exit codes have the following meanings:
93 PandocIpynbDecodingError 93 PandocIpynbDecodingError
94 PandocUnsupportedCharsetError 94 PandocUnsupportedCharsetError
97 PandocCouldNotFindDataFileError 97 PandocCouldNotFindDataFileError
98 PandocCouldNotFindMetadataFileError
99 PandocResourceNotFound 99 PandocResourceNotFound
----- ------------------------------------ ----- ------------------------------------

View file

@ -251,6 +251,9 @@ extra-source-files:
test/command/3510-export.latex test/command/3510-export.latex
test/command/3510-src.hs test/command/3510-src.hs
test/command/3971b.tex 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-chapter.docbook
test/docbook-reader.docbook test/docbook-reader.docbook
test/docbook-xref.docbook test/docbook-xref.docbook

View file

@ -219,7 +219,7 @@ convertWithOpts opts = do
case optMetadataFiles opts of case optMetadataFiles opts of
[] -> return mempty [] -> return mempty
paths -> mconcat <$> paths -> mconcat <$>
mapM (\path -> do raw <- readFileStrict path mapM (\path -> do raw <- readMetadataFile path
yamlToMeta readerOpts (Just path) raw) paths yamlToMeta readerOpts (Just path) raw) paths
let transforms = (case optShiftHeadingLevelBy opts of let transforms = (case optShiftHeadingLevelBy opts of

View file

@ -46,6 +46,7 @@ module Text.Pandoc.Class.PandocMonad
, getResourcePath , getResourcePath
, readDefaultDataFile , readDefaultDataFile
, readDataFile , readDataFile
, readMetadataFile
, fillMediaBag , fillMediaBag
, toLang , toLang
, setTranslations , setTranslations
@ -586,6 +587,25 @@ readDataFile fname = do
then readFileStrict (userDir </> fname) then readFileStrict (userDir </> fname)
else readDefaultDataFile 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. -- | Read file from from the default data files.
readDefaultDataFile :: PandocMonad m => FilePath -> m B.ByteString readDefaultDataFile :: PandocMonad m => FilePath -> m B.ByteString
readDefaultDataFile "reference.docx" = readDefaultDataFile "reference.docx" =

View file

@ -54,6 +54,7 @@ data PandocError = PandocIOError Text IOError
| PandocFilterError Text Text | PandocFilterError Text Text
| PandocLuaError Text | PandocLuaError Text
| PandocCouldNotFindDataFileError Text | PandocCouldNotFindDataFileError Text
| PandocCouldNotFindMetadataFileError Text
| PandocResourceNotFound Text | PandocResourceNotFound Text
| PandocTemplateError Text | PandocTemplateError Text
| PandocAppError Text | PandocAppError Text
@ -118,6 +119,8 @@ renderError e =
PandocLuaError msg -> "Error running Lua:\n" <> msg PandocLuaError msg -> "Error running Lua:\n" <> msg
PandocCouldNotFindDataFileError fn -> PandocCouldNotFindDataFileError fn ->
"Could not find data file " <> fn "Could not find data file " <> fn
PandocCouldNotFindMetadataFileError fn ->
"Could not find metadata file " <> fn
PandocResourceNotFound fn -> PandocResourceNotFound fn ->
"File " <> fn <> " not found in resource path" "File " <> fn <> " not found in resource path"
PandocTemplateError s -> "Error compiling template " <> s PandocTemplateError s -> "Error compiling template " <> s
@ -198,6 +201,7 @@ handleError (Left e) =
PandocIpynbDecodingError{} -> 93 PandocIpynbDecodingError{} -> 93
PandocUnsupportedCharsetError{} -> 94 PandocUnsupportedCharsetError{} -> 94
PandocCouldNotFindDataFileError{} -> 97 PandocCouldNotFindDataFileError{} -> 97
PandocCouldNotFindMetadataFileError{} -> 98
PandocResourceNotFound{} -> 99 PandocResourceNotFound{} -> 99
err :: Int -> Text -> IO a 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.
---