Muse reader: fix parsing of nested definition lists

This commit is contained in:
Alexander Krotov 2018-01-19 16:05:14 +03:00
parent 62c395dafa
commit 22b69b557e
2 changed files with 21 additions and 12 deletions

View file

@ -467,26 +467,25 @@ orderedList = try $ do
rest <- many $ listItem (col - 1) (void (orderedListMarker style delim))
return $ B.orderedListWith p <$> sequence (first : rest)
definitionListItem :: PandocMonad m => MuseParser m (F (Inlines, [Blocks]))
definitionListItem = try $ do
many spaceChar
definitionListItem :: PandocMonad m => Int -> MuseParser m (F (Inlines, [Blocks]))
definitionListItem n = try $ do
count n spaceChar
pos <- getPosition
(guardDisabled Ext_amuse) <|> (guard (sourceColumn pos /= 1)) -- Initial space is required by Amusewiki, but not Emacs Muse
term <- trimInlinesF . mconcat <$> manyTill (choice inlineList) (string "::")
void spaceChar <|> lookAhead eol
contents <- listItemContents' $ sourceColumn pos
optionMaybe blankline
pure $ do lineContent' <- contents
term' <- term
pure (term', [lineContent'])
definitionListItems :: PandocMonad m => MuseParser m (F [(Inlines, [Blocks])])
definitionListItems = sequence <$> many1 definitionListItem
definitionList :: PandocMonad m => MuseParser m (F Blocks)
definitionList = do
items <- definitionListItems
return $ B.definitionList <$> items
definitionList = try $ do
many spaceChar
pos <- getPosition
(guardDisabled Ext_amuse) <|> (guard (sourceColumn pos /= 1)) -- Initial space is required by Amusewiki, but not Emacs Muse
first <- definitionListItem 0
rest <- many $ try (optionMaybe blankline >> definitionListItem (sourceColumn pos - 1))
return $ B.definitionList <$> sequence (first : rest)
--
-- tables

View file

@ -960,9 +960,19 @@ tests =
definitionList [ ("Term1", [ para "This is a first definition\nAnd it has two lines;\nno, make that three."])
, ("Term2", [ para "This is a second definition"])
])
, "Nested definition list" =:
, "One-line nested definition list" =:
" Foo :: bar :: baz" =?>
definitionList [ ("Foo", [ definitionList [ ("bar", [ para "baz" ])]])]
, "Nested definition list" =:
T.unlines
[ " First :: Second :: Third"
, " Fourth :: Fifth :: Sixth"
, " Seventh :: Eighth"
] =?>
definitionList [ ("First", [ definitionList [ ("Second", [ para "Third" ]),
("Fourth", [ definitionList [ ("Fifth", [ para "Sixth"] ) ] ] ) ] ] )
, ("Seventh", [ para "Eighth" ])
]
, "Two blank lines separate definition lists" =:
T.unlines
[ " First :: list"