@@ -243,14 +243,9 @@ yamlMetaBlock = try $ do
243243 optional blanklines
244244 case YAML.decodeNode' YAML.failsafeSchemaResolver False False
245245 (UTF8.fromStringLazy rawYaml) of
246− Right [YAML.Doc (YAML.Mapping _ hashmap)] -> do
247− let alist = M.toList hashmap
248− mapM_ (\(key, v) ->
249− case key of
250− (YAML.Scalar (YAML.SStr t)) -> handleKey t v
251− (YAML.Scalar (YAML.SUnknown _ t)) -> handleKey t v
252− _ -> fail "Non-string key in YAML mapping") alist
253− where handleKey k v =
246+ Right [YAML.Doc (YAML.Mapping _ hashmap)] ->
247+ mapM_ (\(key, v) -> do
248+ k <- nodeToKey key
254249 if ignorable k
255250 then return ()
256251 else do
@@ -263,7 +258,8 @@ yamlMetaBlock = try $ do
263258 Just _ -> return m
264259 Nothing -> do
265260 v'' <- v'
266− return $ B.setMeta (T.unpack k) v'' m}
261+ return $ B.setMeta (T.unpack k) v'' m})
262+ (M.toList hashmap)
267263 Right [] -> return ()
268264 Right [YAML.Doc (YAML.Scalar YAML.SNull)] -> return ()
269265 Right _ -> do
@@ -277,6 +273,11 @@ yamlMetaBlock = try $ do
277273 return ()
278274 return mempty
279275
276+nodeToKey :: Monad m => YAML.Node -> m Text
277+nodeToKey (YAML.Scalar (YAML.SStr t)) = return t
278+nodeToKey (YAML.Scalar (YAML.SUnknown _ t)) = return t
279+nodeToKey _ = fail "Non-string key in YAML mapping"
280+
280281-- ignore fields ending with _
281282ignorable :: Text -> Bool
282283ignorable t = (T.pack "_") `T.isSuffixOf` t
@@ -315,22 +316,19 @@ yamlToMeta (YAML.Sequence _ xs) = do
315316 return $ do
316317 xs'' <- sequence xs'
317318 return $ B.toMetaValue xs''
318−yamlToMeta (YAML.Mapping _ o) = do
319− let alist = M.toList o
320− foldM (\m (key, v) ->
321− case YAML.parseEither (YAML.parseYAML key) of
322− Left e -> fail e
323− Right k -> do
324− if ignorable k
325− then return m
326− else do
327− v' <- yamlToMeta v
328− return $ do
329− MetaMap m' <- m
330− v'' <- v'
331− return (MetaMap $ M.insert (T.unpack k) v'' m'))
319+yamlToMeta (YAML.Mapping _ o) =
320+ foldM (\m (key, v) -> do
321+ k <- nodeToKey key
322+ if ignorable k
323+ then return m
324+ else do
325+ v' <- yamlToMeta v
326+ return $ do
327+ MetaMap m' <- m
328+ v'' <- v'
329+ return (MetaMap $ M.insert (T.unpack k) v'' m'))
332330 (return $ MetaMap M.empty)
333− alist
331+ (M.toList o)
334332yamlToMeta _ = return $ return $ MetaString ""
335333
336334stopLine :: PandocMonad m => MarkdownParser m ()