diff options
| author | Even Brenden <evenbrenden@gmail.com> | 2022-01-21 21:00:45 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-01-21 12:00:45 -0800 |
| commit | 7df29e495f17b239f0e4b239fda849a1f27d2cf2 (patch) | |
| tree | ccef8776c544d61ec5055e45f2713585c433c553 /src | |
| parent | 672b6dc7e6cd5e9a0b614a37d15564a45446d9cb (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.hs | 2 | ||||
| -rw-r--r-- | src/Text/Pandoc/Class/PandocMonad.hs | 20 | ||||
| -rw-r--r-- | src/Text/Pandoc/Error.hs | 4 |
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 |
