From 7df29e495f17b239f0e4b239fda849a1f27d2cf2 Mon Sep 17 00:00:00 2001 From: Even Brenden Date: Fri, 21 Jan 2022 21:00:45 +0100 Subject: 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. --- src/Text/Pandoc/App.hs | 2 +- src/Text/Pandoc/Class/PandocMonad.hs | 20 ++++++++++++++++++++ src/Text/Pandoc/Error.hs | 4 ++++ 3 files changed, 25 insertions(+), 1 deletion(-) (limited to 'src') 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 -- cgit v1.2.3