diff --git a/src/Text/Pandoc/Readers/Markdown.hs b/src/Text/Pandoc/Readers/Markdown.hs index 1c2cc12f1..d69348e30 100644 --- a/src/Text/Pandoc/Readers/Markdown.hs +++ b/src/Text/Pandoc/Readers/Markdown.hs @@ -132,15 +132,19 @@ litChar = escapedChar' -- | Parse a sequence of inline elements between square brackets, -- including inlines between balanced pairs of square brackets. inlinesInBalancedBrackets :: Parser [Char] ParserState (F Inlines) -inlinesInBalancedBrackets = try $ do +inlinesInBalancedBrackets = charsInBalancedBrackets >>= + parseFromString (trimInlinesF . mconcat <$> many inline) + +charsInBalancedBrackets :: Parser [Char] ParserState [Char] +charsInBalancedBrackets = do char '[' - result <- manyTill ( (do lookAhead $ try $ do x <- inline - guard (runF x def == B.str "[") - bal <- inlinesInBalancedBrackets - return $ (\x -> B.str "[" <> x <> B.str "]") <$> bal) - <|> inline) - (char ']') - return $ mconcat result + result <- manyTill ( many1 (noneOf "`[]\n") + <|> (snd <$> withRaw code) + <|> ((\xs -> '[' : xs ++ "]") <$> charsInBalancedBrackets) + <|> count 1 (satisfy (/='\n')) + <|> (newline >> notFollowedBy blankline >> return "\n") + ) (char ']') + return $ concat result -- -- document structure diff --git a/tests/Tests/Readers/Markdown.hs b/tests/Tests/Readers/Markdown.hs index 9a79f12f4..1eb2ce31e 100644 --- a/tests/Tests/Readers/Markdown.hs +++ b/tests/Tests/Readers/Markdown.hs @@ -48,6 +48,8 @@ tests = [ testGroup "inline code" [ "in URL" =: "\\begin\n" =?> para (text "\\begin") ] + , "unbalanced brackets" =: + "[[[[[[[[[[[[[[[hi" =?> para (text "[[[[[[[[[[[[[[[hi") , testGroup "backslash escapes" [ "in URL" =: "[hi](/there\\))"