MD Reader: Smart `'` after inline math
Closes #1909.
Adds new parser combinator to Parsing.hs
`a <+?> b`
: if a succeeds, applies b and mappends
output (if any) to result of a. If b fails,
it's just a, if a fails, whole expression fails.
commit4229cf2d92faf5774fe1a3a9c89a5de885cf75cd
authorNikolay Yakimov <root@livid.pp.ru>
dateSat 18 Apr 2015, 01:18 (12 years ago)
parent94e4a5e
src/Text/Pandoc/Parsing.hs+6−1
@@ -161,7 +161,8 @@ module Text.Pandoc.Parsing ( anyLine,
161161 setSourceColumn,
162162 setSourceLine,
163163 newPos,
164− addWarning
164+ addWarning,
165+ (<+?>)
165166 )
166167where
167168
@@ -1245,3 +1246,7 @@ addWarning mbpos msg =
12451246
12461247generalize :: (Monad m) => Parser s st a -> ParserT s st m a
12471248generalize m = mkPT (\ s -> (return $ (return . runIdentity) <$> runIdentity (runParsecT m s)))
1249+
1250+infixr 5 <+?>
1251+(<+?>) :: (Monoid a, Monad m) => ParserT s st m a -> ParserT s st m a -> ParserT s st m a
1252+a <+?> b = a >>= flip fmap (try b <|> return mempty) . (<>)
src/Text/Pandoc/Readers/Markdown.hs+2−1
@@ -1487,7 +1487,8 @@ code = try $ do
14871487
14881488math :: MarkdownParser Inlines
14891489math = (B.displayMath <$> (mathDisplay >>= applyMacros'))
1490− <|> (B.math <$> (mathInline >>= applyMacros'))
1490+ <|> ((B.math <$> (mathInline >>= applyMacros')) <+?>
1491+ ((getOption readerSmart >>= guard) *> apostrophe <* notFollowedBy space))
14911492
14921493-- Parses material enclosed in *s, **s, _s, or __s.
14931494-- Designed to avoid backtracking.