Markdown reader: interpret YAML metadata as Inlines when possible.

If the metadata field is all on one line, we try to interpret
it as Inlines, and only try parsing as Blocks if that fails.

If it extends over one line (including possibly the `|` or
`>` character signaling an indented block), then we parse as
Blocks.

This was motivated by some German users finding that

    date: '22. Juin 2017'

got parsed as an ordered list.

Closes #3755.
This commit is contained in:
John MacFarlane 2017-06-23 22:31:08 +02:00
parent 310ff99a8c
commit 5812ac0390
2 changed files with 36 additions and 12 deletions

View file

@ -292,18 +292,19 @@ ignorable t = (T.pack "_") `T.isSuffixOf` t
toMetaValue :: PandocMonad m
=> Text -> MarkdownParser m (F MetaValue)
toMetaValue x = toMeta <$> parseFromString' parseBlocks (T.unpack x)
where
toMeta p = do
p' <- p
return $
case B.toList p' of
[Plain xs] -> MetaInlines xs
[Para xs]
| endsWithNewline x -> MetaBlocks [Para xs]
| otherwise -> MetaInlines xs
bs -> MetaBlocks bs
endsWithNewline t = T.pack "\n" `T.isSuffixOf` t
toMetaValue x =
parseFromString' parser' (T.unpack x)
where parser' = (asInlines <$> ((trimInlinesF . mconcat)
<$> (guard (not endsWithNewline)
*> manyTill inline eof)))
<|> (asBlocks <$> parseBlocks)
asBlocks p = do
p' <- p
return $ MetaBlocks (B.toList p')
asInlines p = do
p' <- p
return $ MetaInlines (B.toList p')
endsWithNewline = T.pack "\n" `T.isSuffixOf` x
yamlToMeta :: PandocMonad m
=> Yaml.Value -> MarkdownParser m (F MetaValue)

23
test/command/3755.md Normal file
View file

@ -0,0 +1,23 @@
```
% pandoc -t native -s
---
title: 'Titel'
date: '22. Juni 2017'
---
^D
Pandoc (Meta {unMeta = fromList [("date",MetaInlines [Str "22.",Space,Str "Juni",Space,Str "2017"]),("title",MetaInlines [Str "Titel"])]})
[]
```
```
% pandoc -t native -s
---
title: '<div>foo</div>'
date: |
22. Juni 2017
---
^D
Pandoc (Meta {unMeta = fromList [("date",MetaBlocks [OrderedList (22,Decimal,Period) [[Plain [Str "Juni",Space,Str "2017"]]]]),("title",MetaBlocks [Div ("",[],[]) [Plain [Str "foo"]]])]})
[]
```