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:
parent
310ff99a8c
commit
5812ac0390
2 changed files with 36 additions and 12 deletions
|
@ -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
23
test/command/3755.md
Normal 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"]]])]})
|
||||
[]
|
||||
```
|
||||
|
Loading…
Add table
Reference in a new issue