summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEven Brenden <evenbrenden@gmail.com>2022-01-21 21:00:45 +0100
committerGitHub <noreply@github.com>2022-01-21 12:00:45 -0800
commit7df29e495f17b239f0e4b239fda849a1f27d2cf2 (patch)
treeccef8776c544d61ec5055e45f2713585c433c553 /src
parent672b6dc7e6cd5e9a0b614a37d15564a45446d9cb (diff)
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.
Diffstat (limited to 'src')
-rw-r--r--src/Text/Pandoc/App.hs2
-rw-r--r--src/Text/Pandoc/Class/PandocMonad.hs20
-rw-r--r--src/Text/Pandoc/Error.hs4
3 files changed, 25 insertions, 1 deletions
diff --git a/src/Text/Pandoc/App.hs b/src/Text/Pandoc/App.hs
index 3ddc4c761..b17fdd178 100644
--- a/src/Text/Pandoc/App.hs
+++ b/src/Text/Pandoc/App.hs
@@ -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
diff --git a/src/Text/Pandoc/Class/PandocMonad.hs b/src/Text/Pandoc/Class/PandocMonad.hs
index c15ce6444..144a13ba4 100644
--- a/src/Text/Pandoc/Class/PandocMonad.hs
+++ b/src/Text/Pandoc/Class/PandocMonad.hs
@@ -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" =
diff --git a/src/Text/Pandoc/Error.hs b/src/Text/Pandoc/Error.hs
index 684a6a884..3e2479d61 100644
--- a/src/Text/Pandoc/Error.hs
+++ b/src/Text/Pandoc/Error.hs
@@ -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