git.iko.soy/typeable/pandoc
on master help sign in
Fix regression with --metadata.

It should replace a metadata value set in the document itself, rather than creating a list including a new value. Closes #4054.

commitfef5770591e7d3a185dc8d7dc2b70594732b0367 authorJohn MacFarlane <jgm@berkeley.edu> dateWed 8 Nov 2017, 21:54 (9 years ago) parentc6338fa
2 files changed+24−4
src/Text/Pandoc/App.hs+10−4 test/command/4054.md+14
src/Text/Pandoc/App.hs+10−4
@@ -76,7 +76,7 @@ import qualified System.IO as IO (Newline (..))
7676import System.IO.Error (isDoesNotExistError)
7777import Text.Pandoc
7878import Text.Pandoc.BCP47 (Lang (..), parseBCP47)
79−import Text.Pandoc.Builder (setMeta)
79+import Text.Pandoc.Builder (setMeta, deleteMeta)
8080import Text.Pandoc.Highlighting (highlightingStyles)
8181import Text.Pandoc.Lua (LuaException (..), runLuaFilter)
8282import Text.Pandoc.PDF (makePDF)
@@ -494,7 +494,7 @@ convertWithOpts opts = do
494494 ( (if isJust (optExtractMedia opts)
495495 then fillMediaBag
496496 else return)
497− >=> return . flip (foldr addMetadata) metadata
497+ >=> return . addMetadata metadata
498498 >=> applyLuaFilters datadir (optLuaFilters opts) format
499499 >=> maybe return extractMedia (optExtractMedia opts)
500500 >=> applyTransforms transforms
@@ -722,8 +722,11 @@ defaultOpts = Opt
722722 , optStripComments = False
723723 }
724724
725−addMetadata :: (String, String) -> Pandoc -> Pandoc
726−addMetadata (k, v) (Pandoc meta bs) = Pandoc meta' bs
725+addMetadata :: [(String, String)] -> Pandoc -> Pandoc
726+addMetadata kvs pdc = foldr addMeta (removeMetaKeys kvs pdc) kvs
727+
728+addMeta :: (String, String) -> Pandoc -> Pandoc
729+addMeta (k, v) (Pandoc meta bs) = Pandoc meta' bs
727730 where meta' = case lookupMeta k meta of
728731 Nothing -> setMeta k v' meta
729732 Just (MetaList xs) ->
@@ -731,6 +734,9 @@ addMetadata (k, v) (Pandoc meta bs) = Pandoc meta' bs
731734 Just x -> setMeta k (MetaList [x, v']) meta
732735 v' = readMetaValue v
733736
737+removeMetaKeys :: [(String,String)] -> Pandoc -> Pandoc
738+removeMetaKeys kvs pdc = foldr (deleteMeta . fst) pdc kvs
739+
734740readMetaValue :: String -> MetaValue
735741readMetaValue s = case decode (UTF8.fromString s) of
736742 Just (Yaml.String t) -> MetaString $ T.unpack t
test/command/4054.mdnew file+14
@@ -0,0 +1,14 @@
1+```
2+% pandoc -t native -s -M title=New
3+% Old
4+^D
5+Pandoc (Meta {unMeta = fromList [("title",MetaString "New")]})
6+[]
7+```
8+
9+```
10+% pandoc -t native -s -M foo=1 -M foo=2
11+^D
12+Pandoc (Meta {unMeta = fromList [("foo",MetaList [MetaString "1",MetaString "2"])]})
13+[]
14+```