git.iko.soy/typeable/pandoc
on master help sign in
Markdown reader: Improved inlinesInBalancedBrackets.

The change both improves performance and fixes a regression whereby normal citations inside inline notes were not parsed correctly. Closes jgm/pandoc-citeproc#315.

commitd9584d73f94501787026c57b77d217e51f21505d authorJohn MacFarlane <jgm@berkeley.edu> dateSun 14 Jan 2018, 12:23 (9 years ago) parentcd80b8d
4 files changed+29−14
src/Text/Pandoc/Parsing.hs+1 src/Text/Pandoc/Readers/Markdown.hs+21−13 test/Tests/Readers/Markdown.hs+1−1 test/command/cite-in-inline-note.md+6
src/Text/Pandoc/Parsing.hs+1
@@ -180,6 +180,7 @@ module Text.Pandoc.Parsing ( takeWhileP,
180180 sourceLine,
181181 setSourceColumn,
182182 setSourceLine,
183+ incSourceColumn,
183184 newPos,
184185 Line,
185186 Column
src/Text/Pandoc/Readers/Markdown.hs+21−13
@@ -148,19 +148,27 @@ litChar = escapedChar'
148148-- | Parse a sequence of inline elements between square brackets,
149149-- including inlines between balanced pairs of square brackets.
150150inlinesInBalancedBrackets :: PandocMonad m => MarkdownParser m (F Inlines)
151−inlinesInBalancedBrackets = try $ char '[' >> go 1
152− where go :: PandocMonad m => Int -> MarkdownParser m (F Inlines)
153− go 0 = return mempty
154− go openBrackets =
155− (mappend <$> (bracketedSpan <|> link <|> image) <*>
156− go openBrackets)
157− <|> ((if openBrackets > 1
158− then (return (B.str "]") <>)
159− else id) <$>
160− (char ']' >> go (openBrackets - 1)))
161− <|> ((return (B.str "[") <>) <$>
162− (char '[' >> go (openBrackets + 1)))
163− <|> (mappend <$> inline <*> go openBrackets)
151+inlinesInBalancedBrackets =
152+ try $ char '[' >> withRaw (go 1) >>=
153+ parseFromString inlines . stripBracket . snd
154+ where stripBracket [] = []
155+ stripBracket xs = if last xs == ']' then init xs else xs
156+ go :: PandocMonad m => Int -> MarkdownParser m ()
157+ go 0 = return ()
158+ go openBrackets = do
159+ (() <$ (escapedChar <|>
160+ code <|>
161+ rawHtmlInline <|>
162+ rawLaTeXInline') >> go openBrackets)
163+ <|>
164+ (do char ']'
165+ if openBrackets > 1
166+ then go (openBrackets - 1)
167+ else return ())
168+ <|>
169+ (char '[' >> go (openBrackets + 1))
170+ <|>
171+ (anyChar >> go openBrackets)
164172
165173--
166174-- document structure
test/Tests/Readers/Markdown.hs+1−1
@@ -200,7 +200,7 @@ tests = [ testGroup "inline code"
200200 ":smile: and :+1:" =?> para (text "😄 and 👍")
201201 ]
202202 , "unbalanced brackets" =:
203− "[[[[[[[[[[[hi" =?> para (text "[[[[[[[[[[[hi")
203+ "[[[[[[[[[[[[hi" =?> para (text "[[[[[[[[[[[[hi")
204204 , testGroup "backslash escapes"
205205 [ "in URL" =:
206206 "[hi](/there\\))"
test/command/cite-in-inline-note.mdnew file+6
@@ -0,0 +1,6 @@
1+```
2+% pandoc -t native
3+foo^[bar [@doe]]
4+^D
5+[Para [Str "foo",Note [Para [Str "bar",Space,Cite [Citation {citationId = "doe", citationPrefix = [], citationSuffix = [], citationMode = NormalCitation, citationNoteNum = 0, citationHash = 0}] [Str "[@doe]"]]]]]
6+```