aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2017-02-25 22:59:16 +0100
committerJohn MacFarlane <jgm@berkeley.edu>2017-02-25 22:59:16 +0100
commit03941ca9b0ce69140bb3ca1b4f0deef6d1c10ef3 (patch)
tree09fb0d40f4f626f87394ef3519cfcfa30aceb031 /src
parentbd5df466d7dbc093e717436993b409e9020f00c1 (diff)
downloadpandoc-03941ca9b0ce69140bb3ca1b4f0deef6d1c10ef3.tar.gz
Writers.Shared: Changed metaToJSON a bit.
Now we handle metadata first, then variables. This way, meta-json variable will not contain representations of variables, only proper metadata.
Diffstat (limited to 'src')
-rw-r--r--src/Text/Pandoc/Writers/Shared.hs21
1 files changed, 17 insertions, 4 deletions
diff --git a/src/Text/Pandoc/Writers/Shared.hs b/src/Text/Pandoc/Writers/Shared.hs
index 89a826269..34928e13e 100644
--- a/src/Text/Pandoc/Writers/Shared.hs
+++ b/src/Text/Pandoc/Writers/Shared.hs
@@ -32,6 +32,7 @@ module Text.Pandoc.Writers.Shared (
metaToJSON
, getField
, setField
+ , resetField
, defField
, tagWithAttrs
, fixDisplayMath
@@ -65,13 +66,13 @@ metaToJSON :: Monad m
-> m Value
metaToJSON opts blockWriter inlineWriter (Meta metamap)
| isJust (writerTemplate opts) = do
- let baseContext = foldl (\acc (x,y) -> setField x y acc) (Object H.empty)
- $ writerVariables opts
renderedMap <- Traversable.mapM
(metaValueToJSON blockWriter inlineWriter)
metamap
- let metadata = M.foldWithKey defField baseContext renderedMap
- return $ defField "meta-json" (toStringLazy $ encode metadata) metadata
+ let metadata = M.foldWithKey defField (Object H.empty) renderedMap
+ return $ foldl (\acc (x,y) -> resetField x y acc)
+ (defField "meta-json" (toStringLazy $ encode metadata) metadata)
+ (writerVariables opts)
| otherwise = return (Object H.empty)
metaValueToJSON :: Monad m
@@ -116,6 +117,18 @@ setField field val (Object hashmap) =
_ -> toJSON [oldval, newval]
setField _ _ x = x
+resetField :: ToJSON a
+ => String
+ -> a
+ -> Value
+ -> Value
+-- | Reset a field of a JSON object. If the field already has a value,
+-- the new value replaces it.
+-- This is a utility function to be used in preparing template contexts.
+resetField field val (Object hashmap) =
+ Object $ H.insert (T.pack field) (toJSON val) hashmap
+resetField _ _ x = x
+
defField :: ToJSON a
=> String
-> a