git.iko.soy/typeable/pandoc
on master help sign in
Markdown reader: allow unquoted numbers, booleans as YAML mapping keys.

Previously in 2.2.2 you could not do --- 0: bar ... but only --- '0': bar ... With this change, both forms work.

commitd3d932f42cd361a7b4d7e2b22a3238f53cb54f6b authorJohn MacFarlane <jgm@berkeley.edu> dateMon 30 Jul 2018, 23:04 (8 years ago) parentcbb662c
1 file changed+28−26
src/Text/Pandoc/Readers/Markdown.hs+28−26
src/Text/Pandoc/Readers/Markdown.hs+28−26
@@ -230,7 +230,6 @@ pandocTitleBlock = try $ do
230230 $ nullMeta
231231 updateState $ \st -> st{ stateMeta' = stateMeta' st <> meta' }
232232
233−
234233yamlMetaBlock :: PandocMonad m => MarkdownParser m (F Blocks)
235234yamlMetaBlock = try $ do
236235 guardEnabled Ext_yaml_metadata_block
@@ -242,29 +241,31 @@ yamlMetaBlock = try $ do
242241 -- by including --- and ..., we allow yaml blocks with just comments:
243242 let rawYaml = unlines ("---" : (rawYamlLines ++ ["..."]))
244243 optional blanklines
245− case YAML.decode (UTF8.fromStringLazy rawYaml) of
246− Right (YAML.Mapping _ hashmap : _) -> do
244+ case YAML.decodeNode' YAML.failsafeSchemaResolver False False
245+ (UTF8.fromStringLazy rawYaml) of
246+ Right [YAML.Doc (YAML.Mapping _ hashmap)] -> do
247247 let alist = M.toList hashmap
248248 mapM_ (\(key, v) ->
249− case YAML.parseEither (YAML.parseYAML key) of
250− Left e -> fail e
251− Right k -> do
252− if ignorable k
253− then return ()
254− else do
255− v' <- yamlToMeta v
256− let k' = T.unpack k
257− updateState $ \st -> st{ stateMeta' =
258− do m <- stateMeta' st
259− -- if there's already a value, leave it unchanged
260− case lookupMeta k' m of
261− Just _ -> return m
262− Nothing -> do
263− v'' <- v'
264− return $ B.setMeta (T.unpack k) v'' m}
265− ) alist
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 =
254+ if ignorable k
255+ then return ()
256+ else do
257+ v' <- yamlToMeta v
258+ let k' = T.unpack k
259+ updateState $ \st -> st{ stateMeta' =
260+ do m <- stateMeta' st
261+ -- if there's already a value, leave it unchanged
262+ case lookupMeta k' m of
263+ Just _ -> return m
264+ Nothing -> do
265+ v'' <- v'
266+ return $ B.setMeta (T.unpack k) v'' m}
266267 Right [] -> return ()
267− Right (YAML.Scalar YAML.SNull:_) -> return ()
268+ Right [YAML.Doc (YAML.Scalar YAML.SNull)] -> return ()
268269 Right _ -> do
269270 logMessage $
270271 CouldNotParseYamlMetadata "not an object"
@@ -303,11 +304,12 @@ yamlToMeta :: PandocMonad m
303304 => YAML.Node -> MarkdownParser m (F MetaValue)
304305yamlToMeta (YAML.Scalar x) =
305306 case x of
306− YAML.SStr t -> toMetaValue t
307− YAML.SBool b -> return $ return $ MetaBool b
308− YAML.SFloat d -> return $ return $ MetaString (show d)
309− YAML.SInt i -> return $ return $ MetaString (show i)
310− _ -> return $ return $ MetaString ""
307+ YAML.SStr t -> toMetaValue t
308+ YAML.SBool b -> return $ return $ MetaBool b
309+ YAML.SFloat d -> return $ return $ MetaString (show d)
310+ YAML.SInt i -> return $ return $ MetaString (show i)
311+ YAML.SUnknown _ t -> toMetaValue t
312+ YAML.SNull -> return $ return $ MetaString ""
311313yamlToMeta (YAML.Sequence _ xs) = do
312314 xs' <- mapM yamlToMeta xs
313315 return $ do