aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOwen McGrath <7798336+owm111@users.noreply.github.com>2019-08-24 11:41:25 -0500
committerJohn MacFarlane <jgm@berkeley.edu>2019-08-24 09:41:25 -0700
commit92debe4b9e4bd578290cb24375693d644acb1744 (patch)
treecd0dc6846c714b043b5bed4f3ad02813c7d27d7b
parent5b11ca03e11a99e5514800644e6f8dc761c68026 (diff)
downloadpandoc-92debe4b9e4bd578290cb24375693d644acb1744.tar.gz
Change optMetadataFile type from Maybe to List (#5702)
Changed optMetadataFile from `Maybe FilePath` to `[FilePath]`. This allows for multiple YAML metadata files to be added. The new default value has been changed from `Nothing` to `[]`. To account for this change in `Text.Pandoc.App`, `metaDataFromFile` now operates on two `mapM` calls (for `readFileLazy` and `yamlToMeta`) and a fold. Added a test (command/5700.md) which tests this functionality and updated MANUAL.txt, as per the contributing guidelines. With the current behavior, using `foldr1 (<>)`, values within files specified first will be used over those in later files. (If the reverse of this behavior would be preferred, it should be fixed by changing foldr1 to foldl1.)
-rw-r--r--MANUAL.txt15
-rw-r--r--pandoc.cabal2
-rw-r--r--src/Text/Pandoc/App.hs5
-rw-r--r--src/Text/Pandoc/App/CommandLineOptions.hs2
-rw-r--r--src/Text/Pandoc/App/Opt.hs4
-rw-r--r--test/command/5700-metadata-file-1.yml1
-rw-r--r--test/command/5700-metadata-file-2.yml2
-rw-r--r--test/command/5700.md6
8 files changed, 25 insertions, 12 deletions
diff --git a/MANUAL.txt b/MANUAL.txt
index 8959d3000..56823e4b3 100644
--- a/MANUAL.txt
+++ b/MANUAL.txt
@@ -597,13 +597,14 @@ Reader options {.options}
`--metadata-file=`*FILE*
-: Read metadata from the supplied YAML (or JSON) file.
- This option can be used with every input format, but string
- scalars in the YAML file will always be parsed as Markdown.
- Generally, the input will be handled the same as in
- [YAML metadata blocks][Extension: `yaml_metadata_block`].
- Metadata values specified inside the document, or by using `-M`,
- overwrite values specified with this option.
+: Read metadata from the supplied YAML (or JSON) file. This option can be used
+ with every input format, but string scalars in the YAML file will always be
+ parsed as Markdown. Generally, the input will be handled the same as in
+ [YAML metadata blocks][Extension: `yaml_metadata_block`]. This option can be
+ used repeatedly to include multiple metadata files; values in files specified
+ first will be preferred over those specified in later files. Metadata values
+ specified inside the document, or by using `-M`, overwrite values specified
+ with this option.
`-p`, `--preserve-tabs`
diff --git a/pandoc.cabal b/pandoc.cabal
index c3ec32a2c..f8aa07570 100644
--- a/pandoc.cabal
+++ b/pandoc.cabal
@@ -198,6 +198,8 @@ extra-source-files:
test/command/3533-rst-csv-tables.csv
test/command/3880.txt
test/command/5182.txt
+ test/command/5700-metadata-file-1.yml
+ test/command/5700-metadata-file-2.yml
test/command/abbrevs
test/command/SVG_logo-without-xml-declaration.svg
test/command/SVG_logo.svg
diff --git a/src/Text/Pandoc/App.hs b/src/Text/Pandoc/App.hs
index 737e43fd9..4897366c3 100644
--- a/src/Text/Pandoc/App.hs
+++ b/src/Text/Pandoc/App.hs
@@ -226,8 +226,9 @@ convertWithOpts opts = do
metadataFromFile <-
case optMetadataFile opts of
- Nothing -> return mempty
- Just file -> readFileLazy file >>= yamlToMeta readerOpts
+ [] -> return mempty
+ paths -> mapM readFileLazy paths >>= mapM (yamlToMeta readerOpts)
+ >>= return . (foldr1 (<>))
let transforms = (case optBaseHeaderLevel opts of
x | x > 1 -> (headerShift (x - 1) :)
diff --git a/src/Text/Pandoc/App/CommandLineOptions.hs b/src/Text/Pandoc/App/CommandLineOptions.hs
index 0757e77ff..7e3910aaa 100644
--- a/src/Text/Pandoc/App/CommandLineOptions.hs
+++ b/src/Text/Pandoc/App/CommandLineOptions.hs
@@ -181,7 +181,7 @@ options =
, Option "" ["metadata-file"]
(ReqArg
(\arg opt -> return opt{ optMetadataFile =
- Just (normalizePath arg) })
+ (optMetadataFile opt) <> [normalizePath arg] })
"FILE")
""
diff --git a/src/Text/Pandoc/App/Opt.hs b/src/Text/Pandoc/App/Opt.hs
index d2d86e960..0b7bb7f2c 100644
--- a/src/Text/Pandoc/App/Opt.hs
+++ b/src/Text/Pandoc/App/Opt.hs
@@ -54,7 +54,7 @@ data Opt = Opt
, optTemplate :: Maybe FilePath -- ^ Custom template
, optVariables :: [(String,String)] -- ^ Template variables to set
, optMetadata :: [(String, String)] -- ^ Metadata fields to set
- , optMetadataFile :: Maybe FilePath -- ^ Name of YAML metadata file
+ , optMetadataFile :: [FilePath] -- ^ Name of YAML metadata file
, optOutputFile :: Maybe FilePath -- ^ Name of output file
, optInputFiles :: [FilePath] -- ^ Names of input files
, optNumberSections :: Bool -- ^ Number sections in LaTeX
@@ -128,7 +128,7 @@ defaultOpts = Opt
, optTemplate = Nothing
, optVariables = []
, optMetadata = []
- , optMetadataFile = Nothing
+ , optMetadataFile = []
, optOutputFile = Nothing
, optInputFiles = []
, optNumberSections = False
diff --git a/test/command/5700-metadata-file-1.yml b/test/command/5700-metadata-file-1.yml
new file mode 100644
index 000000000..df64e99c5
--- /dev/null
+++ b/test/command/5700-metadata-file-1.yml
@@ -0,0 +1 @@
+title: Multiple metadata files test
diff --git a/test/command/5700-metadata-file-2.yml b/test/command/5700-metadata-file-2.yml
new file mode 100644
index 000000000..e865ed55d
--- /dev/null
+++ b/test/command/5700-metadata-file-2.yml
@@ -0,0 +1,2 @@
+title: This title should be overridden by 5700-metadta-file-2.yml
+desc: Both of these files should be loaded.
diff --git a/test/command/5700.md b/test/command/5700.md
new file mode 100644
index 000000000..64f99c862
--- /dev/null
+++ b/test/command/5700.md
@@ -0,0 +1,6 @@
+```
+% pandoc -t native -s --metadata-file command/5700-metadata-file-1.yml --metadata-file command/5700-metadata-file-2.yml
+^D
+Pandoc (Meta {unMeta = fromList [("desc",MetaInlines [Str "Both",Space,Str "of",Space,Str "these",Space,Str "files",Space,Str "should",Space,Str "be",Space,Str "loaded."]),("title",MetaInlines [Str "Multiple",Space,Str "metadata",Space,Str "files",Space,Str "test"])]})
+[]
+```