From 22b69b557ecd9a86caa8628b9a395bdd86b55035 Mon Sep 17 00:00:00 2001
From: Alexander Krotov <ilabdsf@gmail.com>
Date: Fri, 19 Jan 2018 16:05:14 +0300
Subject: [PATCH] Muse reader: fix parsing of nested definition lists

---
 src/Text/Pandoc/Readers/Muse.hs | 21 ++++++++++-----------
 test/Tests/Readers/Muse.hs      | 12 +++++++++++-
 2 files changed, 21 insertions(+), 12 deletions(-)

diff --git a/src/Text/Pandoc/Readers/Muse.hs b/src/Text/Pandoc/Readers/Muse.hs
index 074f1e65a..4c6d1278e 100644
--- a/src/Text/Pandoc/Readers/Muse.hs
+++ b/src/Text/Pandoc/Readers/Muse.hs
@@ -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
diff --git a/test/Tests/Readers/Muse.hs b/test/Tests/Readers/Muse.hs
index 6cadd45bc..c92b395ff 100644
--- a/test/Tests/Readers/Muse.hs
+++ b/test/Tests/Readers/Muse.hs
@@ -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"