@@ -64,6 +64,7 @@ module Text.Pandoc.Shared (
6464 addMetaField,
6565 makeMeta,
6666 metaToJSON,
67+ getField,
6768 setField,
6869 defField,
6970 -- * TagSoup HTML handling
@@ -113,7 +114,7 @@ import Network.Browser (browse, setAllowRedirects, setOutHandler, request)
113114import qualified Data.Traversable as Traversable
114115import qualified Data.HashMap.Strict as H
115116import qualified Data.Text as T
116−import Data.Aeson (ToJSON (..), Value(Object), Result(..), fromJSON)
117+import Data.Aeson (FromJSON(..), fromJSON, ToJSON (..), Value(Object), Result(..))
117118
118119#ifdef EMBED_DATA_FILES
119120import Text.Pandoc.Data (dataFiles)
@@ -554,6 +555,18 @@ metaValueToJSON _ _ (MetaString s) = return $ toJSON s
554555metaValueToJSON blockWriter _ (MetaBlocks bs) = liftM toJSON $ blockWriter bs
555556metaValueToJSON _ inlineWriter (MetaInlines bs) = liftM toJSON $ inlineWriter bs
556557
558+-- | Retrieve a field value from a JSON object.
559+getField :: FromJSON a
560+ => String
561+ -> Value
562+ -> Maybe a
563+getField field (Object hashmap) = do
564+ result <- H.lookup (T.pack field) hashmap
565+ case fromJSON result of
566+ Success x -> return x
567+ _ -> fail "Could not convert from JSON"
568+getField field _ = fail "Not a JSON object"
569+
557570setField :: ToJSON a
558571 => String
559572 -> a