diff options
author | John MacFarlane <jgm@berkeley.edu> | 2017-02-25 22:59:16 +0100 |
---|---|---|
committer | John MacFarlane <jgm@berkeley.edu> | 2017-02-25 22:59:16 +0100 |
commit | 03941ca9b0ce69140bb3ca1b4f0deef6d1c10ef3 (patch) | |
tree | 09fb0d40f4f626f87394ef3519cfcfa30aceb031 /src/Text/Pandoc/Writers | |
parent | bd5df466d7dbc093e717436993b409e9020f00c1 (diff) | |
download | pandoc-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/Text/Pandoc/Writers')
-rw-r--r-- | src/Text/Pandoc/Writers/Shared.hs | 21 |
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 |