@@ -32,6 +32,7 @@ module Text.Pandoc.Writers.Shared (
32 metaToJSON
32 metaToJSON
33 , getField
33 , getField
34 , setField
34 , setField
35 , defField
36 , defField
36 , tagWithAttrs
37 , tagWithAttrs
37 , fixDisplayMath
38 , fixDisplayMath
@@ -65,13 +66,13 @@ metaToJSON :: Monad m
65 -> m Value
66 -> m Value
66metaToJSON opts blockWriter inlineWriter (Meta metamap)
67metaToJSON opts blockWriter inlineWriter (Meta metamap)
67 | isJust (writerTemplate opts) = do
68 | isJust (writerTemplate opts) = do
68− let baseContext = foldl (\acc (x,y) -> setField x y acc) (Object H.empty)
69− $ writerVariables opts
70 renderedMap <- Traversable.mapM
69 renderedMap <- Traversable.mapM
71 (metaValueToJSON blockWriter inlineWriter)
70 (metaValueToJSON blockWriter inlineWriter)
73− let metadata = M.foldWithKey defField baseContext renderedMap
72+ let metadata = M.foldWithKey defField (Object H.empty) renderedMap
73+ return $ foldl (\acc (x,y) -> resetField x y acc)
74− return $ defField "meta-json" (toStringLazy $ encode metadata) metadata
74+ (defField "meta-json" (toStringLazy $ encode metadata) metadata)
75+ (writerVariables opts)
75 | otherwise = return (Object H.empty)
76 | otherwise = return (Object H.empty)
77metaValueToJSON :: Monad m
78metaValueToJSON :: Monad m
@@ -116,6 +117,18 @@ setField field val (Object hashmap) =
116 _ -> toJSON [oldval, newval]
117 _ -> toJSON [oldval, newval]
117setField _ _ x = x
118setField _ _ x = x
120+resetField :: ToJSON a
125+-- | Reset a field of a JSON object. If the field already has a value,
126+-- the new value replaces it.
127+-- This is a utility function to be used in preparing template contexts.
128+resetField field val (Object hashmap) =
129+ Object $ H.insert (T.pack field) (toJSON val) hashmap
119defField :: ToJSON a
132defField :: ToJSON a
120 => String
133 => String