summaryrefslogtreecommitdiff
path: root/src/Text/Pandoc/Readers
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2015-04-19 17:02:59 -0700
committerJohn MacFarlane <jgm@berkeley.edu>2015-04-19 17:04:33 -0700
commite9d7504bea5add902f95806a2dbac0248899777d (patch)
tree0b976dfb175b7a8fd01b28c6e15a3eeaa367d00a /src/Text/Pandoc/Readers
parent5b5813c30b458d3eee96e8e5be5c44451b2037b8 (diff)
Rewrote charsInBalancedBrackets.
This version should be a bit more efficient. This doesn't help with #1735, however.
Diffstat (limited to 'src/Text/Pandoc/Readers')
-rw-r--r--src/Text/Pandoc/Readers/Markdown.hs27
1 files changed, 15 insertions, 12 deletions
diff --git a/src/Text/Pandoc/Readers/Markdown.hs b/src/Text/Pandoc/Readers/Markdown.hs
index b54b947b4..102c42ab2 100644
--- a/src/Text/Pandoc/Readers/Markdown.hs
+++ b/src/Text/Pandoc/Readers/Markdown.hs
@@ -165,19 +165,22 @@ litChar = escapedChar'
-- | Parse a sequence of inline elements between square brackets,
-- including inlines between balanced pairs of square brackets.
inlinesInBalancedBrackets :: MarkdownParser (F Inlines)
-inlinesInBalancedBrackets = charsInBalancedBrackets >>=
- parseFromString (trimInlinesF . mconcat <$> many inline)
-
-charsInBalancedBrackets :: MarkdownParser [Char]
-charsInBalancedBrackets = do
+inlinesInBalancedBrackets = do
char '['
- result <- manyTill ( many1 (noneOf "`[]\n")
- <|> (snd <$> withRaw code)
- <|> ((\xs -> '[' : xs ++ "]") <$> charsInBalancedBrackets)
- <|> count 1 (satisfy (/='\n'))
- <|> (newline >> notFollowedBy blankline >> return "\n")
- ) (char ']')
- return $ concat result
+ (_, raw) <- withRaw $ charsInBalancedBrackets 1
+ guard $ not $ null raw
+ parseFromString (trimInlinesF . mconcat <$> many inline) (init raw)
+
+charsInBalancedBrackets :: Int -> MarkdownParser ()
+charsInBalancedBrackets 0 = return ()
+charsInBalancedBrackets openBrackets =
+ (char '[' >> charsInBalancedBrackets (openBrackets + 1))
+ <|> (char ']' >> charsInBalancedBrackets (openBrackets - 1))
+ <|> (( (() <$ code)
+ <|> (() <$ escapedChar')
+ <|> (newline >> notFollowedBy blankline)
+ <|> skipMany1 (noneOf "[]`\n\\")
+ ) >> charsInBalancedBrackets openBrackets)
--
-- document structure