aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Text/Pandoc/Readers/Markdown.hs20
-rw-r--r--tests/Tests/Readers/Markdown.hs2
2 files changed, 14 insertions, 8 deletions
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\\))"