git.iko.soy/typeable/pandoc
on master help sign in
Markdown reader: Fixed link parser to avoid exponential slowdowns.
22bd34fJohn MacFarlane
src/Text/Pandoc/Readers/Markdown.hs+12−8
@@ -132,15 +132,19 @@ litChar = escapedChar'
132-- | Parse a sequence of inline elements between square brackets,
132-- | Parse a sequence of inline elements between square brackets,
133-- including inlines between balanced pairs of square brackets.
133-- including inlines between balanced pairs of square brackets.
134inlinesInBalancedBrackets :: Parser [Char] ParserState (F Inlines)
134inlinesInBalancedBrackets :: Parser [Char] ParserState (F Inlines)
135−inlinesInBalancedBrackets = try $ do
135+inlinesInBalancedBrackets = charsInBalancedBrackets >>=
136+ parseFromString (trimInlinesF . mconcat <$> many inline)
137+
138+charsInBalancedBrackets :: Parser [Char] ParserState [Char]
139+charsInBalancedBrackets = do
136 char '['
140 char '['
137− result <- manyTill ( (do lookAhead $ try $ do x <- inline
141+ result <- manyTill ( many1 (noneOf "`[]\n")
138− guard (runF x def == B.str "[")
142+ <|> (snd <$> withRaw code)
139− bal <- inlinesInBalancedBrackets
143+ <|> ((\xs -> '[' : xs ++ "]") <$> charsInBalancedBrackets)
140− return $ (\x -> B.str "[" <> x <> B.str "]") <$> bal)
144+ <|> count 1 (satisfy (/='\n'))
141− <|> inline)
145+ <|> (newline >> notFollowedBy blankline >> return "\n")
142− (char ']')
146+ ) (char ']')
143− return $ mconcat result
147+ return $ concat result
144
148
145--
149--
146-- document structure
150-- document structure
tests/Tests/Readers/Markdown.hs+2
@@ -48,6 +48,8 @@ tests = [ testGroup "inline code"
48 [ "in URL" =:
48 [ "in URL" =:
49 "\\begin\n" =?> para (text "\\begin")
49 "\\begin\n" =?> para (text "\\begin")
50 ]
50 ]
51+ , "unbalanced brackets" =:
52+ "[[[[[[[[[[[[[[[hi" =?> para (text "[[[[[[[[[[[[[[[hi")
51 , testGroup "backslash escapes"
53 , testGroup "backslash escapes"
52 [ "in URL" =:
54 [ "in URL" =:
53 "[hi](/there\\))"
55 "[hi](/there\\))"