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