@@ -1,5 +1,6 @@
11{-# LANGUAGE RelaxedPolyRec #-} -- needed for inlinesBetween on GHC < 7
22{-# LANGUAGE ScopedTypeVariables #-}
3+
34{-
45Copyright (C) 2006-2015 John MacFarlane <jgm@berkeley.edu>
56
@@ -65,24 +66,31 @@ import qualified Data.Set as Set
6566import Text.Printf (printf)
6667import Debug.Trace (trace)
6768import Data.Monoid ((<>))
68−import Text.Pandoc.Error
69+import Control.Monad.Trans (lift)
70+import Control.Monad.Except (throwError, catchError)
71+import Text.Pandoc.Class (PandocMonad, PandocExecutionError(..))
72+import qualified Text.Pandoc.Class as P
6973
70−type MarkdownParser = Parser [Char] ParserState
74+type MarkdownParser m = ParserT [Char] ParserState m
7175
7276-- | Read markdown from an input string and return a Pandoc document.
73−readMarkdown :: ReaderOptions -- ^ Reader options
77+readMarkdown :: PandocMonad m
78+ => ReaderOptions -- ^ Reader options
7479 -> String -- ^ String to parse (assuming @'\n'@ line endings)
75− -> Either PandocError Pandoc
76−readMarkdown opts s =
77− (readWith parseMarkdown) def{ stateOptions = opts } (s ++ "\n\n")
80+ -> m Pandoc
81+readMarkdown opts s = do
82+ parsed <- (readWithM parseMarkdown) def{ stateOptions = opts } (s ++ "\n\n")
83+ case parsed of
84+ Right result -> return result
85+ Left _ -> throwError $ PandocParseError "markdown parse error"
7886
7987-- | Read markdown from an input string and return a pair of a Pandoc document
8088-- and a list of warnings.
81−readMarkdownWithWarnings :: ReaderOptions -- ^ Reader options
89+readMarkdownWithWarnings :: PandocMonad m
90+ => ReaderOptions -- ^ Reader options
8291 -> String -- ^ String to parse (assuming @'\n'@ line endings)
83− -> Either PandocError (Pandoc, [String])
84−readMarkdownWithWarnings opts s =
85− (readWithWarnings parseMarkdown) def{ stateOptions = opts } (s ++ "\n\n")
92+ -> m Pandoc
93+readMarkdownWithWarnings = readMarkdown
8694
8795trimInlinesF :: F Inlines -> F Inlines
8896trimInlinesF = liftM trimInlines
@@ -117,25 +125,25 @@ isBlank _ = False
117125--
118126
119127-- | Succeeds when we're in list context.
120−inList :: MarkdownParser ()
128+inList :: PandocMonad m => MarkdownParser m ()
121129inList = do
122130 ctx <- stateParserContext <$> getState
123131 guard (ctx == ListItemState)
124132
125−spnl :: Parser [Char] st ()
133+spnl :: PandocMonad m => ParserT [Char] st m ()
126134spnl = try $ do
127135 skipSpaces
128136 optional newline
129137 skipSpaces
130138 notFollowedBy (char '\n')
131139
132−indentSpaces :: MarkdownParser String
140+indentSpaces :: PandocMonad m => MarkdownParser m String
133141indentSpaces = try $ do
134142 tabStop <- getOption readerTabStop
135143 count tabStop (char ' ') <|>
136144 string "\t" <?> "indentation"
137145
138−nonindentSpaces :: MarkdownParser String
146+nonindentSpaces :: PandocMonad m => MarkdownParser m String
139147nonindentSpaces = do
140148 tabStop <- getOption readerTabStop
141149 sps <- many (char ' ')
@@ -144,17 +152,17 @@ nonindentSpaces = do
144152 else unexpected "indented line"
145153
146154-- returns number of spaces parsed
147−skipNonindentSpaces :: MarkdownParser Int
155+skipNonindentSpaces :: PandocMonad m => MarkdownParser m Int
148156skipNonindentSpaces = do
149157 tabStop <- getOption readerTabStop
150158 atMostSpaces (tabStop - 1) <* notFollowedBy (char ' ')
151159
152−atMostSpaces :: Int -> MarkdownParser Int
160+atMostSpaces :: PandocMonad m => Int -> MarkdownParser m Int
153161atMostSpaces n
154162 | n > 0 = (char ' ' >> (+1) <$> atMostSpaces (n-1)) <|> return 0
155163 | otherwise = return 0
156164
157−litChar :: MarkdownParser Char
165+litChar :: PandocMonad m => MarkdownParser m Char
158166litChar = escapedChar'
159167 <|> characterReference
160168 <|> noneOf "\n"
@@ -162,14 +170,14 @@ litChar = escapedChar'
162170
163171-- | Parse a sequence of inline elements between square brackets,
164172-- including inlines between balanced pairs of square brackets.
165−inlinesInBalancedBrackets :: MarkdownParser (F Inlines)
173+inlinesInBalancedBrackets :: PandocMonad m => MarkdownParser m (F Inlines)
166174inlinesInBalancedBrackets = do
167175 char '['
168176 (_, raw) <- withRaw $ charsInBalancedBrackets 1
169177 guard $ not $ null raw
170178 parseFromString (trimInlinesF . mconcat <$> many inline) (init raw)
171179
172−charsInBalancedBrackets :: Int -> MarkdownParser ()
180+charsInBalancedBrackets :: PandocMonad m => Int -> MarkdownParser m ()
173181charsInBalancedBrackets 0 = return ()
174182charsInBalancedBrackets openBrackets =
175183 (char '[' >> charsInBalancedBrackets (openBrackets + 1))
@@ -185,7 +193,7 @@ charsInBalancedBrackets openBrackets =
185193-- document structure
186194--
187195
188−rawTitleBlockLine :: MarkdownParser String
196+rawTitleBlockLine :: PandocMonad m => MarkdownParser m String
189197rawTitleBlockLine = do
190198 char '%'
191199 skipSpaces
@@ -196,13 +204,13 @@ rawTitleBlockLine = do
196204 anyLine
197205 return $ trim $ unlines (first:rest)
198206
199−titleLine :: MarkdownParser (F Inlines)
207+titleLine :: PandocMonad m => MarkdownParser m (F Inlines)
200208titleLine = try $ do
201209 raw <- rawTitleBlockLine
202210 res <- parseFromString (many inline) raw
203211 return $ trimInlinesF $ mconcat res
204212
205−authorsLine :: MarkdownParser (F [Inlines])
213+authorsLine :: PandocMonad m => MarkdownParser m (F [Inlines])
206214authorsLine = try $ do
207215 raw <- rawTitleBlockLine
208216 let sep = (char ';' <* spaces) <|> newline
@@ -212,16 +220,16 @@ authorsLine = try $ do
212220 sep
213221 sequence <$> parseFromString pAuthors raw
214222
215−dateLine :: MarkdownParser (F Inlines)
223+dateLine :: PandocMonad m => MarkdownParser m (F Inlines)
216224dateLine = try $ do
217225 raw <- rawTitleBlockLine
218226 res <- parseFromString (many inline) raw
219227 return $ trimInlinesF $ mconcat res
220228
221−titleBlock :: MarkdownParser ()
229+titleBlock :: PandocMonad m => MarkdownParser m ()
222230titleBlock = pandocTitleBlock <|> mmdTitleBlock
223231
224−pandocTitleBlock :: MarkdownParser ()
232+pandocTitleBlock :: PandocMonad m => MarkdownParser m ()
225233pandocTitleBlock = try $ do
226234 guardEnabled Ext_pandoc_title_block
227235 lookAhead (char '%')
@@ -239,7 +247,15 @@ pandocTitleBlock = try $ do
239247 $ nullMeta
240248 updateState $ \st -> st{ stateMeta' = stateMeta' st <> meta' }
241249
242−yamlMetaBlock :: MarkdownParser (F Blocks)
250+
251+-- Adapted from solution at
252+-- http://stackoverflow.com/a/29448764/1901888
253+foldrWithKeyM :: Monad m => (k -> b -> a -> m a) -> a -> H.HashMap k b -> m a
254+foldrWithKeyM f acc = H.foldrWithKey f' (return acc)
255+ where
256+ f' k b ma = ma >>= \a -> f k b a
257+
258+yamlMetaBlock :: PandocMonad m => MarkdownParser m (F Blocks)
243259yamlMetaBlock = try $ do
244260 guardEnabled Ext_yaml_metadata_block
245261 pos <- getPosition
@@ -252,18 +268,20 @@ yamlMetaBlock = try $ do
252268 optional blanklines
253269 opts <- stateOptions <$> getState
254270 meta' <- case Yaml.decodeEither' $ UTF8.fromString rawYaml of
255− Right (Yaml.Object hashmap) -> return $ return $
256− H.foldrWithKey (\k v m ->
257− if ignorable k
258− then m
259− else case yamlToMeta opts v of
260− Left _ -> m
261− Right v' -> B.setMeta (T.unpack k) v' m)
262− nullMeta hashmap
263− Right Yaml.Null -> return $ return nullMeta
271+ Right (Yaml.Object hashmap) ->
272+ foldrWithKeyM
273+ (\k v m -> do
274+ if ignorable k
275+ then return m
276+ else (do v' <- lift $ yamlToMeta opts v
277+ return $ B.setMeta (T.unpack k) v' m)
278+ `catchError`
279+ (\_ -> return m)
280+ ) nullMeta hashmap
281+ Right Yaml.Null -> return nullMeta
264282 Right _ -> do
265− addWarning (Just pos) "YAML header is not an object"
266− return $ return nullMeta
283+ P.addWarningWithPos (Just pos) "YAML header is not an object"
284+ return nullMeta
267285 Left err' -> do
268286 case err' of
269287 InvalidYaml (Just YamlParseException{
@@ -273,24 +291,24 @@ yamlMetaBlock = try $ do
273291 yamlLine = yline
274292 , yamlColumn = ycol
275293 }}) ->
276− addWarning (Just $ setSourceLine
294+ P.addWarningWithPos (Just $ setSourceLine
277295 (setSourceColumn pos
278296 (sourceColumn pos + ycol))
279297 (sourceLine pos + 1 + yline))
280298 $ "Could not parse YAML header: " ++
281299 problem
282− _ -> addWarning (Just pos)
300+ _ -> P.addWarningWithPos (Just pos)
283301 $ "Could not parse YAML header: " ++
284302 show err'
285− return $ return nullMeta
286− updateState $ \st -> st{ stateMeta' = stateMeta' st <> meta' }
303+ return nullMeta
304+ updateState $ \st -> st{ stateMeta' = stateMeta' st <> (return meta') }
287305 return mempty
288306
289307-- ignore fields ending with _
290308ignorable :: Text -> Bool
291309ignorable t = (T.pack "_") `T.isSuffixOf` t
292310
293−toMetaValue :: ReaderOptions -> Text -> Either PandocError MetaValue
311+toMetaValue :: PandocMonad m => ReaderOptions -> Text -> m MetaValue
294312toMetaValue opts x = toMeta <$> readMarkdown opts' (T.unpack x)
295313 where
296314 toMeta p =
@@ -307,7 +325,7 @@ toMetaValue opts x = toMeta <$> readMarkdown opts' (T.unpack x)
307325 , Ext_yaml_metadata_block
308326 ]
309327
310−yamlToMeta :: ReaderOptions -> Yaml.Value -> Either PandocError MetaValue
328+yamlToMeta :: PandocMonad m => ReaderOptions -> Yaml.Value -> m MetaValue
311329yamlToMeta opts (Yaml.String t) = toMetaValue opts t
312330yamlToMeta _ (Yaml.Number n)
313331 -- avoid decimal points for numbers that don't need them:
@@ -327,10 +345,10 @@ yamlToMeta opts (Yaml.Object o) = MetaMap <$> H.foldrWithKey (\k v m ->
327345 (return M.empty) o
328346yamlToMeta _ _ = return $ MetaString ""
329347
330−stopLine :: MarkdownParser ()
348+stopLine :: PandocMonad m => MarkdownParser m ()
331349stopLine = try $ (string "---" <|> string "...") >> blankline >> return ()
332350
333−mmdTitleBlock :: MarkdownParser ()
351+mmdTitleBlock :: PandocMonad m => MarkdownParser m ()
334352mmdTitleBlock = try $ do
335353 guardEnabled Ext_mmd_title_block
336354 firstPair <- kvPair False
@@ -340,7 +358,7 @@ mmdTitleBlock = try $ do
340358 updateState $ \st -> st{ stateMeta' = stateMeta' st <>
341359 return (Meta $ M.fromList kvPairs) }
342360
343−kvPair :: Bool -> MarkdownParser (String, MetaValue)
361+kvPair :: PandocMonad m => Bool -> MarkdownParser m (String, MetaValue)
344362kvPair allowEmpty = try $ do
345363 key <- many1Till (alphaNum <|> oneOf "_- ") (char ':')
346364 val <- trim <$> manyTill anyChar
@@ -350,7 +368,7 @@ kvPair allowEmpty = try $ do
350368 let val' = MetaBlocks $ B.toList $ B.plain $ B.text $ val
351369 return (key',val')
352370
353−parseMarkdown :: MarkdownParser Pandoc
371+parseMarkdown :: PandocMonad m => MarkdownParser m Pandoc
354372parseMarkdown = do
355373 -- markdown allows raw HTML
356374 updateState $ \state -> state { stateOptions =
@@ -375,7 +393,7 @@ softBreakFilter (x:SoftBreak:y:zs) =
375393 _ -> x:SoftBreak:y:zs
376394softBreakFilter xs = xs
377395
378−referenceKey :: MarkdownParser (F Blocks)
396+referenceKey :: PandocMonad m => MarkdownParser m (F Blocks)
379397referenceKey = try $ do
380398 pos <- getPosition
381399 skipNonindentSpaces
@@ -402,18 +420,18 @@ referenceKey = try $ do
402420 let oldkeys = stateKeys st
403421 let key = toKey raw
404422 case M.lookup key oldkeys of
405− Just _ -> addWarning (Just pos) $ "Duplicate link reference `" ++ raw ++ "'"
423+ Just _ -> P.addWarningWithPos (Just pos) $ "Duplicate link reference `" ++ raw ++ "'"
406424 Nothing -> return ()
407425 updateState $ \s -> s { stateKeys = M.insert key (target, attr') oldkeys }
408426 return $ return mempty
409427
410−referenceTitle :: MarkdownParser String
428+referenceTitle :: PandocMonad m => MarkdownParser m String
411429referenceTitle = try $ do
412430 skipSpaces >> optional newline >> skipSpaces
413431 quotedTitle '"' <|> quotedTitle '\'' <|> charsInBalanced '(' ')' litChar
414432
415433-- A link title in quotes
416−quotedTitle :: Char -> MarkdownParser String
434+quotedTitle :: PandocMonad m => Char -> MarkdownParser m String
417435quotedTitle c = try $ do
418436 char c
419437 notFollowedBy spaces
@@ -425,7 +443,7 @@ quotedTitle c = try $ do
425443-- | PHP Markdown Extra style abbreviation key. Currently
426444-- we just skip them, since Pandoc doesn't have an element for
427445-- an abbreviation.
428−abbrevKey :: MarkdownParser (F Blocks)
446+abbrevKey :: PandocMonad m => MarkdownParser m (F Blocks)
429447abbrevKey = do
430448 guardEnabled Ext_abbreviations
431449 try $ do
@@ -436,23 +454,23 @@ abbrevKey = do
436454 blanklines
437455 return $ return mempty
438456
439−noteMarker :: MarkdownParser String
457+noteMarker :: PandocMonad m => MarkdownParser m String
440458noteMarker = string "[^" >> many1Till (satisfy $ not . isBlank) (char ']')
441459
442−rawLine :: MarkdownParser String
460+rawLine :: PandocMonad m => MarkdownParser m String
443461rawLine = try $ do
444462 notFollowedBy blankline
445463 notFollowedBy' $ try $ skipNonindentSpaces >> noteMarker
446464 optional indentSpaces
447465 anyLine
448466
449−rawLines :: MarkdownParser String
467+rawLines :: PandocMonad m => MarkdownParser m String
450468rawLines = do
451469 first <- anyLine
452470 rest <- many rawLine
453471 return $ unlines (first:rest)
454472
455−noteBlock :: MarkdownParser (F Blocks)
473+noteBlock :: PandocMonad m => MarkdownParser m (F Blocks)
456474noteBlock = try $ do
457475 pos <- getPosition
458476 skipNonindentSpaces
@@ -468,7 +486,7 @@ noteBlock = try $ do
468486 let newnote = (ref, parsed)
469487 oldnotes <- stateNotes' <$> getState
470488 case lookup ref oldnotes of
471− Just _ -> addWarning (Just pos) $ "Duplicate note reference `" ++ ref ++ "'"
489+ Just _ -> P.addWarningWithPos (Just pos) $ "Duplicate note reference `" ++ ref ++ "'"
472490 Nothing -> return ()
473491 updateState $ \s -> s { stateNotes' = newnote : oldnotes }
474492 return mempty
@@ -477,10 +495,10 @@ noteBlock = try $ do
477495-- parsing blocks
478496--
479497
480−parseBlocks :: MarkdownParser (F Blocks)
498+parseBlocks :: PandocMonad m => MarkdownParser m (F Blocks)
481499parseBlocks = mconcat <$> manyTill block eof
482500
483−block :: MarkdownParser (F Blocks)
501+block :: PandocMonad m => MarkdownParser m (F Blocks)
484502block = do
485503 tr <- getOption readerTrace
486504 pos <- getPosition
@@ -519,16 +537,16 @@ block = do
519537-- header blocks
520538--
521539
522−header :: MarkdownParser (F Blocks)
540+header :: PandocMonad m => MarkdownParser m (F Blocks)
523541header = setextHeader <|> atxHeader <?> "header"
524542
525−atxChar :: MarkdownParser Char
543+atxChar :: PandocMonad m => MarkdownParser m Char
526544atxChar = do
527545 exts <- getOption readerExtensions
528546 return $ if Set.member Ext_literate_haskell exts
529547 then '=' else '#'
530548
531−atxHeader :: MarkdownParser (F Blocks)
549+atxHeader :: PandocMonad m => MarkdownParser m (F Blocks)
532550atxHeader = try $ do
533551 level <- atxChar >>= many1 . char >>= return . length
534552 notFollowedBy $ guardEnabled Ext_fancy_lists >>
@@ -542,7 +560,7 @@ atxHeader = try $ do
542560 <|> registerImplicitHeader raw attr'
543561 return $ B.headerWith attr' level <$> text
544562
545−atxClosing :: MarkdownParser Attr
563+atxClosing :: PandocMonad m => MarkdownParser m Attr
546564atxClosing = try $ do
547565 attr' <- option nullAttr
548566 (guardEnabled Ext_mmd_header_identifiers >> mmdHeaderIdentifier)
@@ -553,7 +571,7 @@ atxClosing = try $ do
553571 blanklines
554572 return attr
555573
556−setextHeaderEnd :: MarkdownParser Attr
574+setextHeaderEnd :: PandocMonad m => MarkdownParser m Attr
557575setextHeaderEnd = try $ do
558576 attr <- option nullAttr
559577 $ (guardEnabled Ext_mmd_header_identifiers >> mmdHeaderIdentifier)
@@ -561,13 +579,13 @@ setextHeaderEnd = try $ do
561579 blanklines
562580 return attr
563581
564−mmdHeaderIdentifier :: MarkdownParser Attr
582+mmdHeaderIdentifier :: PandocMonad m => MarkdownParser m Attr
565583mmdHeaderIdentifier = do
566584 ident <- stripFirstAndLast . snd <$> reference
567585 skipSpaces
568586 return (ident,[],[])
569587
570−setextHeader :: MarkdownParser (F Blocks)
588+setextHeader :: PandocMonad m => MarkdownParser m (F Blocks)
571589setextHeader = try $ do
572590 -- This lookahead prevents us from wasting time parsing Inlines
573591 -- unless necessary -- it gives a significant performance boost.
@@ -585,7 +603,7 @@ setextHeader = try $ do
585603 <|> registerImplicitHeader raw attr'
586604 return $ B.headerWith attr' level <$> text
587605
588−registerImplicitHeader :: String -> Attr -> MarkdownParser ()
606+registerImplicitHeader :: PandocMonad m => String -> Attr -> MarkdownParser m ()
589607registerImplicitHeader raw attr@(ident, _, _) = do
590608 let key = toKey $ "[" ++ raw ++ "]"
591609 updateState (\s -> s { stateHeaderKeys =
@@ -595,7 +613,7 @@ registerImplicitHeader raw attr@(ident, _, _) = do
595613-- hrule block
596614--
597615
598−hrule :: Parser [Char] st (F Blocks)
616+hrule :: PandocMonad m => ParserT [Char] st m (F Blocks)
599617hrule = try $ do
600618 skipSpaces
601619 start <- satisfy isHruleChar
@@ -609,12 +627,13 @@ hrule = try $ do
609627-- code blocks
610628--
611629
612−indentedLine :: MarkdownParser String
630+indentedLine :: PandocMonad m => MarkdownParser m String
613631indentedLine = indentSpaces >> anyLine >>= return . (++ "\n")
614632
615−blockDelimiter :: (Char -> Bool)
633+blockDelimiter :: PandocMonad m
634+ => (Char -> Bool)
616635 -> Maybe Int
617− -> Parser [Char] st Int
636+ -> ParserT [Char] st m Int
618637blockDelimiter f len = try $ do
619638 c <- lookAhead (satisfy f)
620639 case len of
@@ -622,7 +641,7 @@ blockDelimiter f len = try $ do
622641 Nothing -> count 3 (char c) >> many (char c) >>=
623642 return . (+ 3) . length
624643
625−attributes :: MarkdownParser Attr
644+attributes :: PandocMonad m => MarkdownParser m Attr
626645attributes = try $ do
627646 char '{'
628647 spnl
@@ -630,28 +649,28 @@ attributes = try $ do
630649 char '}'
631650 return $ foldl (\x f -> f x) nullAttr attrs
632651
633−attribute :: MarkdownParser (Attr -> Attr)
652+attribute :: PandocMonad m => MarkdownParser m (Attr -> Attr)
634653attribute = identifierAttr <|> classAttr <|> keyValAttr <|> specialAttr
635654
636−identifier :: MarkdownParser String
655+identifier :: PandocMonad m => MarkdownParser m String
637656identifier = do
638657 first <- letter
639658 rest <- many $ alphaNum <|> oneOf "-_:."
640659 return (first:rest)
641660
642−identifierAttr :: MarkdownParser (Attr -> Attr)
661+identifierAttr :: PandocMonad m => MarkdownParser m (Attr -> Attr)
643662identifierAttr = try $ do
644663 char '#'
645664 result <- identifier
646665 return $ \(_,cs,kvs) -> (result,cs,kvs)
647666
648−classAttr :: MarkdownParser (Attr -> Attr)
667+classAttr :: PandocMonad m => MarkdownParser m (Attr -> Attr)
649668classAttr = try $ do
650669 char '.'
651670 result <- identifier
652671 return $ \(id',cs,kvs) -> (id',cs ++ [result],kvs)
653672
654−keyValAttr :: MarkdownParser (Attr -> Attr)
673+keyValAttr :: PandocMonad m => MarkdownParser m (Attr -> Attr)
655674keyValAttr = try $ do
656675 key <- identifier
657676 char '='
@@ -664,12 +683,12 @@ keyValAttr = try $ do
664683 "class" -> (id',cs ++ words val,kvs)
665684 _ -> (id',cs,kvs ++ [(key,val)])
666685
667−specialAttr :: MarkdownParser (Attr -> Attr)
686+specialAttr :: PandocMonad m => MarkdownParser m (Attr -> Attr)
668687specialAttr = do
669688 char '-'
670689 return $ \(id',cs,kvs) -> (id',cs ++ ["unnumbered"],kvs)
671690
672−codeBlockFenced :: MarkdownParser (F Blocks)
691+codeBlockFenced :: PandocMonad m => MarkdownParser m (F Blocks)
673692codeBlockFenced = try $ do
674693 c <- try (guardEnabled Ext_fenced_code_blocks >> lookAhead (char '~'))
675694 <|> (guardEnabled Ext_backtick_code_blocks >> lookAhead (char '`'))
@@ -690,7 +709,7 @@ toLanguageId = map toLower . go
690709 go "objective-c" = "objectivec"
691710 go x = x
692711
693−codeBlockIndented :: MarkdownParser (F Blocks)
712+codeBlockIndented :: PandocMonad m => MarkdownParser m (F Blocks)
694713codeBlockIndented = do
695714 contents <- many1 (indentedLine <|>
696715 try (do b <- blanklines
@@ -701,7 +720,7 @@ codeBlockIndented = do
701720 return $ return $ B.codeBlockWith ("", classes, []) $
702721 stripTrailingNewlines $ concat contents
703722
704−lhsCodeBlock :: MarkdownParser (F Blocks)
723+lhsCodeBlock :: PandocMonad m => MarkdownParser m (F Blocks)
705724lhsCodeBlock = do
706725 guardEnabled Ext_literate_haskell
707726 (return . B.codeBlockWith ("",["sourceCode","literate","haskell"],[]) <$>
@@ -709,7 +728,7 @@ lhsCodeBlock = do
709728 <|> (return . B.codeBlockWith ("",["sourceCode","haskell"],[]) <$>
710729 lhsCodeBlockInverseBird)
711730
712−lhsCodeBlockLaTeX :: MarkdownParser String
731+lhsCodeBlockLaTeX :: PandocMonad m => MarkdownParser m String
713732lhsCodeBlockLaTeX = try $ do
714733 string "\\begin{code}"
715734 manyTill spaceChar newline
@@ -717,13 +736,13 @@ lhsCodeBlockLaTeX = try $ do
717736 blanklines
718737 return $ stripTrailingNewlines contents
719738
720−lhsCodeBlockBird :: MarkdownParser String
739+lhsCodeBlockBird :: PandocMonad m => MarkdownParser m String
721740lhsCodeBlockBird = lhsCodeBlockBirdWith '>'
722741
723−lhsCodeBlockInverseBird :: MarkdownParser String
742+lhsCodeBlockInverseBird :: PandocMonad m => MarkdownParser m String
724743lhsCodeBlockInverseBird = lhsCodeBlockBirdWith '<'
725744
726−lhsCodeBlockBirdWith :: Char -> MarkdownParser String
745+lhsCodeBlockBirdWith :: PandocMonad m => Char -> MarkdownParser m String
727746lhsCodeBlockBirdWith c = try $ do
728747 pos <- getPosition
729748 when (sourceColumn pos /= 1) $ fail "Not in first column"
@@ -735,7 +754,7 @@ lhsCodeBlockBirdWith c = try $ do
735754 blanklines
736755 return $ intercalate "\n" lns'
737756
738−birdTrackLine :: Char -> Parser [Char] st String
757+birdTrackLine :: PandocMonad m => Char -> ParserT [Char] st m String
739758birdTrackLine c = try $ do
740759 char c
741760 -- allow html tags on left margin:
@@ -746,10 +765,10 @@ birdTrackLine c = try $ do
746765-- block quotes
747766--
748767
749−emailBlockQuoteStart :: MarkdownParser Char
768+emailBlockQuoteStart :: PandocMonad m => MarkdownParser m Char
750769emailBlockQuoteStart = try $ skipNonindentSpaces >> char '>' <* optional (char ' ')
751770
752−emailBlockQuote :: MarkdownParser [String]
771+emailBlockQuote :: PandocMonad m => MarkdownParser m [String]
753772emailBlockQuote = try $ do
754773 emailBlockQuoteStart
755774 let emailLine = many $ nonEndline <|> try
@@ -763,7 +782,7 @@ emailBlockQuote = try $ do
763782 optional blanklines
764783 return raw
765784
766−blockQuote :: MarkdownParser (F Blocks)
785+blockQuote :: PandocMonad m => MarkdownParser m (F Blocks)
767786blockQuote = do
768787 raw <- emailBlockQuote
769788 -- parse the extracted block, which may contain various block elements:
@@ -774,7 +793,7 @@ blockQuote = do
774793-- list blocks
775794--
776795
777−bulletListStart :: MarkdownParser ()
796+bulletListStart :: PandocMonad m => MarkdownParser m ()
778797bulletListStart = try $ do
779798 optional newline -- if preceded by a Plain block in a list context
780799 startpos <- sourceColumn <$> getPosition
@@ -786,7 +805,7 @@ bulletListStart = try $ do
786805 lookAhead (newline <|> spaceChar)
787806 () <$ atMostSpaces (tabStop - (endpos - startpos))
788807
789−anyOrderedListStart :: MarkdownParser (Int, ListNumberStyle, ListNumberDelim)
808+anyOrderedListStart :: PandocMonad m => MarkdownParser m (Int, ListNumberStyle, ListNumberDelim)
790809anyOrderedListStart = try $ do
791810 optional newline -- if preceded by a Plain block in a list context
792811 startpos <- sourceColumn <$> getPosition
@@ -810,10 +829,10 @@ anyOrderedListStart = try $ do
810829 atMostSpaces (tabStop - (endpos - startpos))
811830 return res
812831
813−listStart :: MarkdownParser ()
832+listStart :: PandocMonad m => MarkdownParser m ()
814833listStart = bulletListStart <|> (anyOrderedListStart >> return ())
815834
816−listLine :: MarkdownParser String
835+listLine :: PandocMonad m => MarkdownParser m String
817836listLine = try $ do
818837 notFollowedBy' (do indentSpaces
819838 many spaceChar
@@ -822,7 +841,7 @@ listLine = try $ do
822841 optional (() <$ indentSpaces)
823842 listLineCommon
824843
825−listLineCommon :: MarkdownParser String
844+listLineCommon :: PandocMonad m => MarkdownParser m String
826845listLineCommon = concat <$> manyTill
827846 ( many1 (satisfy $ \c -> c /= '\n' && c /= '<')
828847 <|> liftM snd (htmlTag isCommentTag)
@@ -830,8 +849,9 @@ listLineCommon = concat <$> manyTill
830849 ) newline
831850
832851-- parse raw text for one list item, excluding start marker and continuations
833−rawListItem :: MarkdownParser a
834− -> MarkdownParser String
852+rawListItem :: PandocMonad m
853+ => MarkdownParser m a
854+ -> MarkdownParser m String
835855rawListItem start = try $ do
836856 start
837857 first <- listLineCommon
@@ -842,21 +862,21 @@ rawListItem start = try $ do
842862-- continuation of a list item - indented and separated by blankline
843863-- or (in compact lists) endline.
844864-- note: nested lists are parsed as continuations
845−listContinuation :: MarkdownParser String
865+listContinuation :: PandocMonad m => MarkdownParser m String
846866listContinuation = try $ do
847867 lookAhead indentSpaces
848868 result <- many1 listContinuationLine
849869 blanks <- many blankline
850870 return $ concat result ++ blanks
851871
852−notFollowedByHtmlCloser :: MarkdownParser ()
872+notFollowedByHtmlCloser :: PandocMonad m => MarkdownParser m ()
853873notFollowedByHtmlCloser = do
854874 inHtmlBlock <- stateInHtmlBlock <$> getState
855875 case inHtmlBlock of
856876 Just t -> notFollowedBy' $ htmlTag (~== TagClose t)
857877 Nothing -> return ()
858878
859−listContinuationLine :: MarkdownParser String
879+listContinuationLine :: PandocMonad m => MarkdownParser m String
860880listContinuationLine = try $ do
861881 notFollowedBy blankline
862882 notFollowedBy' listStart
@@ -865,8 +885,9 @@ listContinuationLine = try $ do
865885 result <- anyLine
866886 return $ result ++ "\n"
867887
868−listItem :: MarkdownParser a
869− -> MarkdownParser (F Blocks)
888+listItem :: PandocMonad m
889+ => MarkdownParser m a
890+ -> MarkdownParser m (F Blocks)
870891listItem start = try $ do
871892 first <- rawListItem start
872893 continuations <- many listContinuation
@@ -882,7 +903,7 @@ listItem start = try $ do
882903 updateState (\st -> st {stateParserContext = oldContext})
883904 return contents
884905
885−orderedList :: MarkdownParser (F Blocks)
906+orderedList :: PandocMonad m => MarkdownParser m (F Blocks)
886907orderedList = try $ do
887908 (start, style, delim) <- lookAhead anyOrderedListStart
888909 unless (style `elem` [DefaultStyle, Decimal, Example] &&
@@ -903,14 +924,14 @@ orderedList = try $ do
903924 start' <- option 1 $ guardEnabled Ext_startnum >> return start
904925 return $ B.orderedListWith (start', style, delim) <$> fmap compactify' items
905926
906−bulletList :: MarkdownParser (F Blocks)
927+bulletList :: PandocMonad m => MarkdownParser m (F Blocks)
907928bulletList = do
908929 items <- fmap sequence $ many1 $ listItem bulletListStart
909930 return $ B.bulletList <$> fmap compactify' items
910931
911932-- definition lists
912933
913−defListMarker :: MarkdownParser ()
934+defListMarker :: PandocMonad m => MarkdownParser m ()
914935defListMarker = do
915936 sps <- nonindentSpaces
916937 char ':' <|> char '~'
@@ -921,7 +942,7 @@ defListMarker = do
921942 else mzero
922943 return ()
923944
924−definitionListItem :: Bool -> MarkdownParser (F (Inlines, [Blocks]))
945+definitionListItem :: PandocMonad m => Bool -> MarkdownParser m (F (Inlines, [Blocks]))
925946definitionListItem compact = try $ do
926947 rawLine' <- anyLine
927948 raw <- many1 $ defRawBlock compact
@@ -930,7 +951,7 @@ definitionListItem compact = try $ do
930951 optional blanklines
931952 return $ liftM2 (,) term (sequence contents)
932953
933−defRawBlock :: Bool -> MarkdownParser String
954+defRawBlock :: PandocMonad m => Bool -> MarkdownParser m String
934955defRawBlock compact = try $ do
935956 hasBlank <- option False $ blankline >> return True
936957 defListMarker
@@ -952,7 +973,7 @@ defRawBlock compact = try $ do
952973 return $ trimr (firstline ++ "\n" ++ unlines rawlines ++ cont) ++
953974 if hasBlank || not (null cont) then "\n\n" else ""
954975
955−definitionList :: MarkdownParser (F Blocks)
976+definitionList :: PandocMonad m => MarkdownParser m (F Blocks)
956977definitionList = try $ do
957978 lookAhead (anyLine >>
958979 optional (blankline >> notFollowedBy (table >> return ())) >>
@@ -960,13 +981,13 @@ definitionList = try $ do
960981 defListMarker)
961982 compactDefinitionList <|> normalDefinitionList
962983
963−compactDefinitionList :: MarkdownParser (F Blocks)
984+compactDefinitionList :: PandocMonad m => MarkdownParser m (F Blocks)
964985compactDefinitionList = do
965986 guardEnabled Ext_compact_definition_lists
966987 items <- fmap sequence $ many1 $ definitionListItem True
967988 return $ B.definitionList <$> fmap compactify'DL items
968989
969−normalDefinitionList :: MarkdownParser (F Blocks)
990+normalDefinitionList :: PandocMonad m => MarkdownParser m (F Blocks)
970991normalDefinitionList = do
971992 guardEnabled Ext_definition_lists
972993 items <- fmap sequence $ many1 $ definitionListItem False
@@ -976,7 +997,7 @@ normalDefinitionList = do
976997-- paragraph block
977998--
978999
979−para :: MarkdownParser (F Blocks)
1000+para :: PandocMonad m => MarkdownParser m (F Blocks)
9801001para = try $ do
9811002 exts <- getOption readerExtensions
9821003 result <- trimInlinesF . mconcat <$> many1 inline
@@ -1007,19 +1028,19 @@ para = try $ do
10071028 $ Image attr alt (src,'f':'i':'g':':':tit)
10081029 _ -> return $ B.para result'
10091030
1010−plain :: MarkdownParser (F Blocks)
1031+plain :: PandocMonad m => MarkdownParser m (F Blocks)
10111032plain = fmap B.plain . trimInlinesF . mconcat <$> many1 inline
10121033
10131034--
10141035-- raw html
10151036--
10161037
1017−htmlElement :: MarkdownParser String
1038+htmlElement :: PandocMonad m => MarkdownParser m String
10181039htmlElement = rawVerbatimBlock
10191040 <|> strictHtmlBlock
10201041 <|> liftM snd (htmlTag isBlockTag)
10211042
1022−htmlBlock :: MarkdownParser (F Blocks)
1043+htmlBlock :: PandocMonad m => MarkdownParser m (F Blocks)
10231044htmlBlock = do
10241045 guardEnabled Ext_raw_html
10251046 try (do
@@ -1044,24 +1065,24 @@ htmlBlock = do
10441065 <|> (guardEnabled Ext_markdown_in_html_blocks >> rawHtmlBlocks))
10451066 <|> htmlBlock'
10461067
1047−htmlBlock' :: MarkdownParser (F Blocks)
1068+htmlBlock' :: PandocMonad m => MarkdownParser m (F Blocks)
10481069htmlBlock' = try $ do
10491070 first <- htmlElement
10501071 skipMany spaceChar
10511072 optional blanklines
10521073 return $ return $ B.rawBlock "html" first
10531074
1054−strictHtmlBlock :: MarkdownParser String
1075+strictHtmlBlock :: PandocMonad m => MarkdownParser m String
10551076strictHtmlBlock = htmlInBalanced (not . isInlineTag)
10561077
1057−rawVerbatimBlock :: MarkdownParser String
1078+rawVerbatimBlock :: PandocMonad m => MarkdownParser m String
10581079rawVerbatimBlock = htmlInBalanced isVerbTag
10591080 where isVerbTag (TagOpen "pre" _) = True
10601081 isVerbTag (TagOpen "style" _) = True
10611082 isVerbTag (TagOpen "script" _) = True
10621083 isVerbTag _ = False
10631084
1064−rawTeXBlock :: MarkdownParser (F Blocks)
1085+rawTeXBlock :: PandocMonad m => MarkdownParser m (F Blocks)
10651086rawTeXBlock = do
10661087 guardEnabled Ext_raw_tex
10671088 result <- (B.rawBlock "latex" . concat <$>
@@ -1071,7 +1092,7 @@ rawTeXBlock = do
10711092 spaces
10721093 return $ return result
10731094
1074−rawHtmlBlocks :: MarkdownParser (F Blocks)
1095+rawHtmlBlocks :: PandocMonad m => MarkdownParser m (F Blocks)
10751096rawHtmlBlocks = do
10761097 (TagOpen tagtype _, raw) <- htmlTag isBlockTag
10771098 -- try to find closing tag
@@ -1101,7 +1122,7 @@ stripMarkdownAttribute s = renderTags' $ map filterAttrib $ parseTags s
11011122-- line block
11021123--
11031124
1104−lineBlock :: MarkdownParser (F Blocks)
1125+lineBlock :: PandocMonad m => MarkdownParser m (F Blocks)
11051126lineBlock = try $ do
11061127 guardEnabled Ext_line_blocks
11071128 lines' <- lineBlockLines >>=
@@ -1114,8 +1135,9 @@ lineBlock = try $ do
11141135
11151136-- Parse a dashed line with optional trailing spaces; return its length
11161137-- and the length including trailing space.
1117−dashedLine :: Char
1118− -> Parser [Char] st (Int, Int)
1138+dashedLine :: PandocMonad m
1139+ => Char
1140+ -> ParserT [Char] st m (Int, Int)
11191141dashedLine ch = do
11201142 dashes <- many1 (char ch)
11211143 sp <- many spaceChar
@@ -1125,8 +1147,9 @@ dashedLine ch = do
11251147
11261148-- Parse a table header with dashed lines of '-' preceded by
11271149-- one (or zero) line of text.
1128−simpleTableHeader :: Bool -- ^ Headerless table
1129− -> MarkdownParser (F [Blocks], [Alignment], [Int])
1150+simpleTableHeader :: PandocMonad m
1151+ => Bool -- ^ Headerless table
1152+ -> MarkdownParser m (F [Blocks], [Alignment], [Int])
11301153simpleTableHeader headless = try $ do
11311154 rawContent <- if headless
11321155 then return ""
@@ -1170,16 +1193,17 @@ alignType strLst len =
11701193 (False, False) -> AlignDefault
11711194
11721195-- Parse a table footer - dashed lines followed by blank line.
1173−tableFooter :: MarkdownParser String
1196+tableFooter :: PandocMonad m => MarkdownParser m String
11741197tableFooter = try $ skipNonindentSpaces >> many1 (dashedLine '-') >> blanklines
11751198
11761199-- Parse a table separator - dashed line.
1177−tableSep :: MarkdownParser Char
1200+tableSep :: PandocMonad m => MarkdownParser m Char
11781201tableSep = try $ skipNonindentSpaces >> many1 (dashedLine '-') >> char '\n'
11791202
11801203-- Parse a raw line and split it into chunks by indices.
1181−rawTableLine :: [Int]
1182− -> MarkdownParser [String]
1204+rawTableLine :: PandocMonad m
1205+ => [Int]
1206+ -> MarkdownParser m [String]
11831207rawTableLine indices = do
11841208 notFollowedBy' (blanklines <|> tableFooter)
11851209 line <- many1Till anyChar newline
@@ -1187,14 +1211,16 @@ rawTableLine indices = do
11871211 splitStringByIndices (init indices) line
11881212
11891213-- Parse a table line and return a list of lists of blocks (columns).
1190−tableLine :: [Int]
1191− -> MarkdownParser (F [Blocks])
1214+tableLine :: PandocMonad m
1215+ => [Int]
1216+ -> MarkdownParser m (F [Blocks])
11921217tableLine indices = rawTableLine indices >>=
11931218 fmap sequence . mapM (parseFromString (mconcat <$> many plain))
11941219
11951220-- Parse a multiline table row and return a list of blocks (columns).
1196−multilineRow :: [Int]
1197− -> MarkdownParser (F [Blocks])
1221+multilineRow :: PandocMonad m
1222+ => [Int]
1223+ -> MarkdownParser m (F [Blocks])
11981224multilineRow indices = do
11991225 colLines <- many1 (rawTableLine indices)
12001226 let cols = map unlines $ transpose colLines
@@ -1202,7 +1228,7 @@ multilineRow indices = do
12021228
12031229-- Parses a table caption: inlines beginning with 'Table:'
12041230-- and followed by blank lines.
1205−tableCaption :: MarkdownParser (F Inlines)
1231+tableCaption :: PandocMonad m => MarkdownParser m (F Inlines)
12061232tableCaption = try $ do
12071233 guardEnabled Ext_table_captions
12081234 skipNonindentSpaces
@@ -1210,8 +1236,9 @@ tableCaption = try $ do
12101236 trimInlinesF . mconcat <$> many1 inline <* blanklines
12111237
12121238-- Parse a simple table with '---' header and one line per row.
1213−simpleTable :: Bool -- ^ Headerless table
1214− -> MarkdownParser ([Alignment], [Double], F [Blocks], F [[Blocks]])
1239+simpleTable :: PandocMonad m
1240+ => Bool -- ^ Headerless table
1241+ -> MarkdownParser m ([Alignment], [Double], F [Blocks], F [[Blocks]])
12151242simpleTable headless = do
12161243 (aligns, _widths, heads', lines') <-
12171244 tableWith (simpleTableHeader headless) tableLine
@@ -1224,13 +1251,15 @@ simpleTable headless = do
12241251-- (which may be multiline), then the rows,
12251252-- which may be multiline, separated by blank lines, and
12261253-- ending with a footer (dashed line followed by blank line).
1227−multilineTable :: Bool -- ^ Headerless table
1228− -> MarkdownParser ([Alignment], [Double], F [Blocks], F [[Blocks]])
1254+multilineTable :: PandocMonad m
1255+ => Bool -- ^ Headerless table
1256+ -> MarkdownParser m ([Alignment], [Double], F [Blocks], F [[Blocks]])
12291257multilineTable headless =
12301258 tableWith (multilineTableHeader headless) multilineRow blanklines tableFooter
12311259
1232−multilineTableHeader :: Bool -- ^ Headerless table
1233− -> MarkdownParser (F [Blocks], [Alignment], [Int])
1260+multilineTableHeader :: PandocMonad m
1261+ => Bool -- ^ Headerless table
1262+ -> MarkdownParser m (F [Blocks], [Alignment], [Int])
12341263multilineTableHeader headless = try $ do
12351264 unless headless $
12361265 tableSep >> notFollowedBy blankline
@@ -1261,8 +1290,8 @@ multilineTableHeader headless = try $ do
12611290-- (which may be grid), then the rows,
12621291-- which may be grid, separated by blank lines, and
12631292-- ending with a footer (dashed line followed by blank line).
1264−gridTable :: Bool -- ^ Headerless table
1265− -> MarkdownParser ([Alignment], [Double], F [Blocks], F [[Blocks]])
1293+gridTable :: PandocMonad m => Bool -- ^ Headerless table
1294+ -> MarkdownParser m ([Alignment], [Double], F [Blocks], F [[Blocks]])
12661295gridTable headless =
12671296 tableWith (gridTableHeader headless) gridTableRow
12681297 (gridTableSep '-') gridTableFooter
@@ -1271,7 +1300,7 @@ gridTableSplitLine :: [Int] -> String -> [String]
12711300gridTableSplitLine indices line = map removeFinalBar $ tail $
12721301 splitStringByIndices (init indices) $ trimr line
12731302
1274−gridPart :: Char -> Parser [Char] st ((Int, Int), Alignment)
1303+gridPart :: PandocMonad m => Char -> ParserT [Char] st m ((Int, Int), Alignment)
12751304gridPart ch = do
12761305 leftColon <- option False (True <$ char ':')
12771306 dashes <- many1 (char ch)
@@ -1286,7 +1315,7 @@ gridPart ch = do
12861315 (False, False) -> AlignDefault
12871316 return ((lengthDashes, lengthDashes + 1), alignment)
12881317
1289−gridDashedLines :: Char -> Parser [Char] st [((Int, Int), Alignment)]
1318+gridDashedLines :: PandocMonad m => Char -> ParserT [Char] st m [((Int, Int), Alignment)]
12901319gridDashedLines ch = try $ char '+' >> many1 (gridPart ch) <* blankline
12911320
12921321removeFinalBar :: String -> String
@@ -1294,12 +1323,12 @@ removeFinalBar =
12941323 reverse . dropWhile (`elem` " \t") . dropWhile (=='|') . reverse
12951324
12961325-- | Separator between rows of grid table.
1297−gridTableSep :: Char -> MarkdownParser Char
1326+gridTableSep :: PandocMonad m => Char -> MarkdownParser m Char
12981327gridTableSep ch = try $ gridDashedLines ch >> return '\n'
12991328
13001329-- | Parse header for a grid table.
1301−gridTableHeader :: Bool -- ^ Headerless table
1302− -> MarkdownParser (F [Blocks], [Alignment], [Int])
1330+gridTableHeader :: PandocMonad m => Bool -- ^ Headerless table
1331+ -> MarkdownParser m (F [Blocks], [Alignment], [Int])
13031332gridTableHeader headless = try $ do
13041333 optional blanklines
13051334 dashes <- gridDashedLines '-'
@@ -1320,15 +1349,15 @@ gridTableHeader headless = try $ do
13201349 heads <- fmap sequence $ mapM (parseFromString parseBlocks . trim) rawHeads
13211350 return (heads, aligns, indices)
13221351
1323−gridTableRawLine :: [Int] -> MarkdownParser [String]
1352+gridTableRawLine :: PandocMonad m => [Int] -> MarkdownParser m [String]
13241353gridTableRawLine indices = do
13251354 char '|'
13261355 line <- anyLine
13271356 return (gridTableSplitLine indices line)
13281357
13291358-- | Parse row of grid table.
1330−gridTableRow :: [Int]
1331− -> MarkdownParser (F [Blocks])
1359+gridTableRow :: PandocMonad m => [Int]
1360+ -> MarkdownParser m (F [Blocks])
13321361gridTableRow indices = do
13331362 colLines <- many1 (gridTableRawLine indices)
13341363 let cols = map ((++ "\n") . unlines . removeOneLeadingSpace) $
@@ -1344,10 +1373,10 @@ removeOneLeadingSpace xs =
13441373 startsWithSpace (y:_) = y == ' '
13451374
13461375-- | Parse footer for a grid table.
1347−gridTableFooter :: MarkdownParser [Char]
1376+gridTableFooter :: PandocMonad m => MarkdownParser m [Char]
13481377gridTableFooter = blanklines
13491378
1350−pipeBreak :: MarkdownParser ([Alignment], [Int])
1379+pipeBreak :: PandocMonad m => MarkdownParser m ([Alignment], [Int])
13511380pipeBreak = try $ do
13521381 nonindentSpaces
13531382 openPipe <- (True <$ char '|') <|> return False
@@ -1359,7 +1388,7 @@ pipeBreak = try $ do
13591388 blankline
13601389 return $ unzip (first:rest)
13611390
1362−pipeTable :: MarkdownParser ([Alignment], [Double], F [Blocks], F [[Blocks]])
1391+pipeTable :: PandocMonad m => MarkdownParser m ([Alignment], [Double], F [Blocks], F [[Blocks]])
13631392pipeTable = try $ do
13641393 nonindentSpaces
13651394 lookAhead nonspaceChar
@@ -1377,13 +1406,13 @@ pipeTable = try $ do
13771406 else replicate (length aligns) 0.0
13781407 return $ (aligns, widths, heads', sequence lines'')
13791408
1380−sepPipe :: MarkdownParser ()
1409+sepPipe :: PandocMonad m => MarkdownParser m ()
13811410sepPipe = try $ do
13821411 char '|' <|> char '+'
13831412 notFollowedBy blankline
13841413
13851414-- parse a row, also returning probable alignments for org-table cells
1386−pipeTableRow :: MarkdownParser (F [Blocks])
1415+pipeTableRow :: PandocMonad m => MarkdownParser m (F [Blocks])
13871416pipeTableRow = try $ do
13881417 scanForPipe
13891418 skipMany spaceChar
@@ -1399,14 +1428,14 @@ pipeTableRow = try $ do
13991428 blankline
14001429 return $ sequence cells
14011430
1402−pipeTableCell :: MarkdownParser (F Blocks)
1431+pipeTableCell :: PandocMonad m => MarkdownParser m (F Blocks)
14031432pipeTableCell = do
14041433 result <- many inline
14051434 if null result
14061435 then return mempty
14071436 else return $ B.plain . mconcat <$> sequence result
14081437
1409−pipeTableHeaderPart :: Parser [Char] st (Alignment, Int)
1438+pipeTableHeaderPart :: PandocMonad m => ParserT [Char] st m (Alignment, Int)
14101439pipeTableHeaderPart = try $ do
14111440 skipMany spaceChar
14121441 left <- optionMaybe (char ':')
@@ -1422,7 +1451,7 @@ pipeTableHeaderPart = try $ do
14221451 (Just _,Just _) -> AlignCenter), len)
14231452
14241453-- Succeed only if current line contains a pipe.
1425−scanForPipe :: Parser [Char] st ()
1454+scanForPipe :: PandocMonad m => ParserT [Char] st m ()
14261455scanForPipe = do
14271456 inp <- getInput
14281457 case break (\c -> c == '\n' || c == '|') inp of
@@ -1432,11 +1461,12 @@ scanForPipe = do
14321461-- | Parse a table using 'headerParser', 'rowParser',
14331462-- 'lineParser', and 'footerParser'. Variant of the version in
14341463-- Text.Pandoc.Parsing.
1435−tableWith :: MarkdownParser (F [Blocks], [Alignment], [Int])
1436− -> ([Int] -> MarkdownParser (F [Blocks]))
1437− -> MarkdownParser sep
1438− -> MarkdownParser end
1439− -> MarkdownParser ([Alignment], [Double], F [Blocks], F [[Blocks]])
1464+tableWith :: PandocMonad m
1465+ => MarkdownParser m (F [Blocks], [Alignment], [Int])
1466+ -> ([Int] -> MarkdownParser m (F [Blocks]))
1467+ -> MarkdownParser m sep
1468+ -> MarkdownParser m end
1469+ -> MarkdownParser m ([Alignment], [Double], F [Blocks], F [[Blocks]])
14401470tableWith headerParser rowParser lineParser footerParser = try $ do
14411471 (heads, aligns, indices) <- headerParser
14421472 lines' <- fmap sequence $ rowParser indices `sepEndBy1` lineParser
@@ -1447,7 +1477,7 @@ tableWith headerParser rowParser lineParser footerParser = try $ do
14471477 else widthsFromIndices numColumns indices
14481478 return $ (aligns, widths, heads, lines')
14491479
1450−table :: MarkdownParser (F Blocks)
1480+table :: PandocMonad m => MarkdownParser m (F Blocks)
14511481table = try $ do
14521482 frontCaption <- option Nothing (Just <$> tableCaption)
14531483 (aligns, widths, heads, lns) <-
@@ -1479,7 +1509,7 @@ table = try $ do
14791509-- inline
14801510--
14811511
1482−inline :: MarkdownParser (F Inlines)
1512+inline :: PandocMonad m => MarkdownParser m (F Inlines)
14831513inline = choice [ whitespace
14841514 , bareURL
14851515 , str
@@ -1509,7 +1539,7 @@ inline = choice [ whitespace
15091539 , ltSign
15101540 ] <?> "inline"
15111541
1512−escapedChar' :: MarkdownParser Char
1542+escapedChar' :: PandocMonad m => MarkdownParser m Char
15131543escapedChar' = try $ do
15141544 char '\\'
15151545 (guardEnabled Ext_all_symbols_escapable >> satisfy (not . isAlphaNum))
@@ -1518,7 +1548,7 @@ escapedChar' = try $ do
15181548 <|> (guardEnabled Ext_escaped_line_breaks >> char '\n')
15191549 <|> oneOf "\\`*_{}[]()>#+-.!~\""
15201550
1521−escapedChar :: MarkdownParser (F Inlines)
1551+escapedChar :: PandocMonad m => MarkdownParser m (F Inlines)
15221552escapedChar = do
15231553 result <- escapedChar'
15241554 case result of
@@ -1527,14 +1557,14 @@ escapedChar = do
15271557 return (return B.linebreak) -- "\[newline]" is a linebreak
15281558 _ -> return $ return $ B.str [result]
15291559
1530−ltSign :: MarkdownParser (F Inlines)
1560+ltSign :: PandocMonad m => MarkdownParser m (F Inlines)
15311561ltSign = do
15321562 guardDisabled Ext_raw_html
15331563 <|> (notFollowedByHtmlCloser >> notFollowedBy' (htmlTag isBlockTag))
15341564 char '<'
15351565 return $ return $ B.str "<"
15361566
1537−exampleRef :: MarkdownParser (F Inlines)
1567+exampleRef :: PandocMonad m => MarkdownParser m (F Inlines)
15381568exampleRef = try $ do
15391569 guardEnabled Ext_example_lists
15401570 char '@'
@@ -1545,7 +1575,7 @@ exampleRef = try $ do
15451575 Just n -> B.str (show n)
15461576 Nothing -> B.str ('@':lab)
15471577
1548−symbol :: MarkdownParser (F Inlines)
1578+symbol :: PandocMonad m => MarkdownParser m (F Inlines)
15491579symbol = do
15501580 result <- noneOf "<\\\n\t "
15511581 <|> try (do lookAhead $ char '\\'
@@ -1554,7 +1584,7 @@ symbol = do
15541584 return $ return $ B.str [result]
15551585
15561586-- parses inline code, between n `s and n `s
1557−code :: MarkdownParser (F Inlines)
1587+code :: PandocMonad m => MarkdownParser m (F Inlines)
15581588code = try $ do
15591589 starts <- many1 (char '`')
15601590 skipSpaces
@@ -1566,7 +1596,7 @@ code = try $ do
15661596 >> attributes)
15671597 return $ return $ B.codeWith attr $ trim $ concat result
15681598
1569−math :: MarkdownParser (F Inlines)
1599+math :: PandocMonad m => MarkdownParser m (F Inlines)
15701600math = (return . B.displayMath <$> (mathDisplay >>= applyMacros'))
15711601 <|> (return . B.math <$> (mathInline >>= applyMacros')) <+?>
15721602 ((getOption readerSmart >>= guard) *> (return <$> apostrophe)
@@ -1574,8 +1604,9 @@ math = (return . B.displayMath <$> (mathDisplay >>= applyMacros'))
15741604
15751605-- Parses material enclosed in *s, **s, _s, or __s.
15761606-- Designed to avoid backtracking.
1577−enclosure :: Char
1578− -> MarkdownParser (F Inlines)
1607+enclosure :: PandocMonad m
1608+ => Char
1609+ -> MarkdownParser m (F Inlines)
15791610enclosure c = do
15801611 -- we can't start an enclosure with _ if after a string and
15811612 -- the intraword_underscores extension is enabled:
@@ -1591,7 +1622,7 @@ enclosure c = do
15911622 1 -> one c mempty
15921623 _ -> return (return $ B.str cs)
15931624
1594−ender :: Char -> Int -> MarkdownParser ()
1625+ender :: PandocMonad m => Char -> Int -> MarkdownParser m ()
15951626ender c n = try $ do
15961627 count n (char c)
15971628 guard (c == '*')
@@ -1602,7 +1633,7 @@ ender c n = try $ do
16021633-- If one c, emit emph and then parse two.
16031634-- If two cs, emit strong and then parse one.
16041635-- Otherwise, emit ccc then the results.
1605−three :: Char -> MarkdownParser (F Inlines)
1636+three :: PandocMonad m => Char -> MarkdownParser m (F Inlines)
16061637three c = do
16071638 contents <- mconcat <$> many (notFollowedBy (ender c 1) >> inline)
16081639 (ender c 3 >> return ((B.strong . B.emph) <$> contents))
@@ -1612,7 +1643,7 @@ three c = do
16121643
16131644-- Parse inlines til you hit two c's, and emit strong.
16141645-- If you never do hit two cs, emit ** plus inlines parsed.
1615−two :: Char -> F Inlines -> MarkdownParser (F Inlines)
1646+two :: PandocMonad m => Char -> F Inlines -> MarkdownParser m (F Inlines)
16161647two c prefix' = do
16171648 contents <- mconcat <$> many (try $ notFollowedBy (ender c 2) >> inline)
16181649 (ender c 2 >> return (B.strong <$> (prefix' <> contents)))
@@ -1620,7 +1651,7 @@ two c prefix' = do
16201651
16211652-- Parse inlines til you hit a c, and emit emph.
16221653-- If you never hit a c, emit * plus inlines parsed.
1623−one :: Char -> F Inlines -> MarkdownParser (F Inlines)
1654+one :: PandocMonad m => Char -> F Inlines -> MarkdownParser m (F Inlines)
16241655one c prefix' = do
16251656 contents <- mconcat <$> many ( (notFollowedBy (ender c 1) >> inline)
16261657 <|> try (string [c,c] >>
@@ -1629,47 +1660,48 @@ one c prefix' = do
16291660 (ender c 1 >> return (B.emph <$> (prefix' <> contents)))
16301661 <|> return (return (B.str [c]) <> (prefix' <> contents))
16311662
1632−strongOrEmph :: MarkdownParser (F Inlines)
1663+strongOrEmph :: PandocMonad m => MarkdownParser m (F Inlines)
16331664strongOrEmph = enclosure '*' <|> enclosure '_'
16341665
16351666-- | Parses a list of inlines between start and end delimiters.
1636−inlinesBetween :: (Show b)
1637− => MarkdownParser a
1638− -> MarkdownParser b
1639− -> MarkdownParser (F Inlines)
1667+inlinesBetween :: PandocMonad m
1668+ => (Show b)
1669+ => MarkdownParser m a
1670+ -> MarkdownParser m b
1671+ -> MarkdownParser m (F Inlines)
16401672inlinesBetween start end =
16411673 (trimInlinesF . mconcat) <$> try (start >> many1Till inner end)
16421674 where inner = innerSpace <|> (notFollowedBy' (() <$ whitespace) >> inline)
16431675 innerSpace = try $ whitespace <* notFollowedBy' end
16441676
1645−strikeout :: MarkdownParser (F Inlines)
1677+strikeout :: PandocMonad m => MarkdownParser m (F Inlines)
16461678strikeout = fmap B.strikeout <$>
16471679 (guardEnabled Ext_strikeout >> inlinesBetween strikeStart strikeEnd)
16481680 where strikeStart = string "~~" >> lookAhead nonspaceChar
16491681 >> notFollowedBy (char '~')
16501682 strikeEnd = try $ string "~~"
16511683
1652−superscript :: MarkdownParser (F Inlines)
1684+superscript :: PandocMonad m => MarkdownParser m (F Inlines)
16531685superscript = fmap B.superscript <$> try (do
16541686 guardEnabled Ext_superscript
16551687 char '^'
16561688 mconcat <$> many1Till (notFollowedBy spaceChar >> inline) (char '^'))
16571689
1658−subscript :: MarkdownParser (F Inlines)
1690+subscript :: PandocMonad m => MarkdownParser m (F Inlines)
16591691subscript = fmap B.subscript <$> try (do
16601692 guardEnabled Ext_subscript
16611693 char '~'
16621694 mconcat <$> many1Till (notFollowedBy spaceChar >> inline) (char '~'))
16631695
1664−whitespace :: MarkdownParser (F Inlines)
1696+whitespace :: PandocMonad m => MarkdownParser m (F Inlines)
16651697whitespace = spaceChar >> return <$> (lb <|> regsp) <?> "whitespace"
16661698 where lb = spaceChar >> skipMany spaceChar >> option B.space (endline >> return B.linebreak)
16671699 regsp = skipMany spaceChar >> return B.space
16681700
1669−nonEndline :: Parser [Char] st Char
1701+nonEndline :: PandocMonad m => ParserT [Char] st m Char
16701702nonEndline = satisfy (/='\n')
16711703
1672−str :: MarkdownParser (F Inlines)
1704+str :: PandocMonad m => MarkdownParser m (F Inlines)
16731705str = do
16741706 result <- many1 alphaNum
16751707 updateLastStrPos
@@ -1699,7 +1731,7 @@ likelyAbbrev x =
16991731 in map snd $ filter (\(y,_) -> y == x) abbrPairs
17001732
17011733-- an endline character that can be treated as a space, not a structural break
1702−endline :: MarkdownParser (F Inlines)
1734+endline :: PandocMonad m => MarkdownParser m (F Inlines)
17031735endline = try $ do
17041736 newline
17051737 notFollowedBy blankline
@@ -1721,17 +1753,17 @@ endline = try $ do
17211753--
17221754
17231755-- a reference label for a link
1724−reference :: MarkdownParser (F Inlines, String)
1756+reference :: PandocMonad m => MarkdownParser m (F Inlines, String)
17251757reference = do notFollowedBy' (string "[^") -- footnote reference
17261758 withRaw $ trimInlinesF <$> inlinesInBalancedBrackets
17271759
1728−parenthesizedChars :: MarkdownParser [Char]
1760+parenthesizedChars :: PandocMonad m => MarkdownParser m [Char]
17291761parenthesizedChars = do
17301762 result <- charsInBalanced '(' ')' litChar
17311763 return $ '(' : result ++ ")"
17321764
17331765-- source for a link, with optional title
1734−source :: MarkdownParser (String, String)
1766+source :: PandocMonad m => MarkdownParser m (String, String)
17351767source = do
17361768 char '('
17371769 skipSpaces
@@ -1748,10 +1780,10 @@ source = do
17481780 char ')'
17491781 return (escapeURI $ trimr src, tit)
17501782
1751−linkTitle :: MarkdownParser String
1783+linkTitle :: PandocMonad m => MarkdownParser m String
17521784linkTitle = quotedTitle '"' <|> quotedTitle '\''
17531785
1754−link :: MarkdownParser (F Inlines)
1786+link :: PandocMonad m => MarkdownParser m (F Inlines)
17551787link = try $ do
17561788 st <- getState
17571789 guard $ stateAllowLinks st
@@ -1760,7 +1792,7 @@ link = try $ do
17601792 setState $ st{ stateAllowLinks = True }
17611793 regLink B.linkWith lab <|> referenceLink B.linkWith (lab,raw)
17621794
1763−bracketedSpan :: MarkdownParser (F Inlines)
1795+bracketedSpan :: PandocMonad m => MarkdownParser m (F Inlines)
17641796bracketedSpan = try $ do
17651797 guardEnabled Ext_bracketed_spans
17661798 (lab,_) <- reference
@@ -1773,8 +1805,10 @@ bracketedSpan = try $ do
17731805 -> return $ B.smallcaps <$> lab
17741806 _ -> return $ B.spanWith attr <$> lab
17751807
1776−regLink :: (Attr -> String -> String -> Inlines -> Inlines)
1777− -> F Inlines -> MarkdownParser (F Inlines)
1808+regLink :: PandocMonad m
1809+ => (Attr -> String -> String -> Inlines -> Inlines)
1810+ -> F Inlines
1811+ -> MarkdownParser m (F Inlines)
17781812regLink constructor lab = try $ do
17791813 (src, tit) <- source
17801814 attr <- option nullAttr $
@@ -1782,8 +1816,10 @@ regLink constructor lab = try $ do
17821816 return $ constructor attr src tit <$> lab
17831817
17841818-- a link like [this][ref] or [this][] or [this]
1785−referenceLink :: (Attr -> String -> String -> Inlines -> Inlines)
1786− -> (F Inlines, String) -> MarkdownParser (F Inlines)
1819+referenceLink :: PandocMonad m
1820+ => (Attr -> String -> String -> Inlines -> Inlines)
1821+ -> (F Inlines, String)
1822+ -> MarkdownParser m (F Inlines)
17871823referenceLink constructor (lab, raw) = do
17881824 sp <- (True <$ lookAhead (char ' ')) <|> return False
17891825 (_,raw') <- option (mempty, "") $
@@ -1824,7 +1860,7 @@ dropBrackets = reverse . dropRB . reverse . dropLB
18241860 dropLB ('[':xs) = xs
18251861 dropLB xs = xs
18261862
1827−bareURL :: MarkdownParser (F Inlines)
1863+bareURL :: PandocMonad m => MarkdownParser m (F Inlines)
18281864bareURL = try $ do
18291865 guardEnabled Ext_autolink_bare_uris
18301866 getState >>= guard . stateAllowLinks
@@ -1832,7 +1868,7 @@ bareURL = try $ do
18321868 notFollowedBy $ try $ spaces >> htmlTag (~== TagClose "a")
18331869 return $ return $ B.link src "" (B.str orig)
18341870
1835−autoLink :: MarkdownParser (F Inlines)
1871+autoLink :: PandocMonad m => MarkdownParser m (F Inlines)
18361872autoLink = try $ do
18371873 getState >>= guard . stateAllowLinks
18381874 char '<'
@@ -1846,7 +1882,7 @@ autoLink = try $ do
18461882 guardEnabled Ext_link_attributes >> attributes
18471883 return $ return $ B.linkWith attr (src ++ escapeURI extra) "" (B.str $ orig ++ extra)
18481884
1849−image :: MarkdownParser (F Inlines)
1885+image :: PandocMonad m => MarkdownParser m (F Inlines)
18501886image = try $ do
18511887 char '!'
18521888 (lab,raw) <- reference
@@ -1856,7 +1892,7 @@ image = try $ do
18561892 _ -> B.imageWith attr' src
18571893 regLink constructor lab <|> referenceLink constructor (lab,raw)
18581894
1859−note :: MarkdownParser (F Inlines)
1895+note :: PandocMonad m => MarkdownParser m (F Inlines)
18601896note = try $ do
18611897 guardEnabled Ext_footnotes
18621898 ref <- noteMarker
@@ -1872,14 +1908,14 @@ note = try $ do
18721908 let contents' = runF contents st{ stateNotes' = [] }
18731909 return $ B.note contents'
18741910
1875−inlineNote :: MarkdownParser (F Inlines)
1911+inlineNote :: PandocMonad m => MarkdownParser m (F Inlines)
18761912inlineNote = try $ do
18771913 guardEnabled Ext_inline_notes
18781914 char '^'
18791915 contents <- inlinesInBalancedBrackets
18801916 return $ B.note . B.para <$> contents
18811917
1882−rawLaTeXInline' :: MarkdownParser (F Inlines)
1918+rawLaTeXInline' :: PandocMonad m => MarkdownParser m (F Inlines)
18831919rawLaTeXInline' = try $ do
18841920 guardEnabled Ext_raw_tex
18851921 lookAhead $ char '\\' >> notFollowedBy' (string "start") -- context env
@@ -1887,7 +1923,7 @@ rawLaTeXInline' = try $ do
18871923 return $ return $ B.rawInline "tex" s
18881924 -- "tex" because it might be context or latex
18891925
1890−rawConTeXtEnvironment :: Parser [Char] st String
1926+rawConTeXtEnvironment :: PandocMonad m => ParserT [Char] st m String
18911927rawConTeXtEnvironment = try $ do
18921928 string "\\start"
18931929 completion <- inBrackets (letter <|> digit <|> spaceChar)
@@ -1896,14 +1932,14 @@ rawConTeXtEnvironment = try $ do
18961932 (try $ string "\\stop" >> string completion)
18971933 return $ "\\start" ++ completion ++ concat contents ++ "\\stop" ++ completion
18981934
1899−inBrackets :: (Parser [Char] st Char) -> Parser [Char] st String
1935+inBrackets :: PandocMonad m => (ParserT [Char] st m Char) -> ParserT [Char] st m String
19001936inBrackets parser = do
19011937 char '['
19021938 contents <- many parser
19031939 char ']'
19041940 return $ "[" ++ contents ++ "]"
19051941
1906−spanHtml :: MarkdownParser (F Inlines)
1942+spanHtml :: PandocMonad m => MarkdownParser m (F Inlines)
19071943spanHtml = try $ do
19081944 guardEnabled Ext_native_spans
19091945 (TagOpen _ attrs, _) <- htmlTag (~== TagOpen "span" [])
@@ -1918,7 +1954,7 @@ spanHtml = try $ do
19181954 -> return $ B.smallcaps <$> contents
19191955 _ -> return $ B.spanWith (ident, classes, keyvals) <$> contents
19201956
1921−divHtml :: MarkdownParser (F Blocks)
1957+divHtml :: PandocMonad m => MarkdownParser m (F Blocks)
19221958divHtml = try $ do
19231959 guardEnabled Ext_native_divs
19241960 (TagOpen _ attrs, rawtag) <- htmlTag (~== TagOpen "div" [])
@@ -1940,7 +1976,7 @@ divHtml = try $ do
19401976 else -- avoid backtracing
19411977 return $ return (B.rawBlock "html" (rawtag <> bls)) <> contents
19421978
1943−rawHtmlInline :: MarkdownParser (F Inlines)
1979+rawHtmlInline :: PandocMonad m => MarkdownParser m (F Inlines)
19441980rawHtmlInline = do
19451981 guardEnabled Ext_raw_html
19461982 inHtmlBlock <- stateInHtmlBlock <$> getState
@@ -1962,7 +1998,7 @@ rawHtmlInline = do
19621998emojiChars :: [Char]
19631999emojiChars = ['a'..'z'] ++ ['0'..'9'] ++ ['_','+','-']
19642000
1965−emoji :: MarkdownParser (F Inlines)
2001+emoji :: PandocMonad m => MarkdownParser m (F Inlines)
19662002emoji = try $ do
19672003 guardEnabled Ext_emoji
19682004 char ':'
@@ -1974,7 +2010,7 @@ emoji = try $ do
19742010
19752011-- Citations
19762012
1977−cite :: MarkdownParser (F Inlines)
2013+cite :: PandocMonad m => MarkdownParser m (F Inlines)
19782014cite = do
19792015 guardEnabled Ext_citations
19802016 citations <- textualCite
@@ -1982,7 +2018,7 @@ cite = do
19822018 return $ (flip B.cite (B.text raw)) <$> cs
19832019 return citations
19842020
1985−textualCite :: MarkdownParser (F Inlines)
2021+textualCite :: PandocMonad m => MarkdownParser m (F Inlines)
19862022textualCite = try $ do
19872023 (_, key) <- citeKey
19882024 let first = Citation{ citationId = key
@@ -2017,7 +2053,7 @@ textualCite = try $ do
20172053 Just n -> B.str (show n)
20182054 _ -> B.cite [first] $ B.str $ '@':key)
20192055
2020−bareloc :: Citation -> MarkdownParser (F [Citation])
2056+bareloc :: PandocMonad m => Citation -> MarkdownParser m (F [Citation])
20212057bareloc c = try $ do
20222058 spnl
20232059 char '['
@@ -2032,7 +2068,7 @@ bareloc c = try $ do
20322068 rest' <- rest
20332069 return $ c{ citationSuffix = B.toList suff' } : rest'
20342070
2035−normalCite :: MarkdownParser (F [Citation])
2071+normalCite :: PandocMonad m => MarkdownParser m (F [Citation])
20362072normalCite = try $ do
20372073 char '['
20382074 spnl
@@ -2041,7 +2077,7 @@ normalCite = try $ do
20412077 char ']'
20422078 return citations
20432079
2044−suffix :: MarkdownParser (F Inlines)
2080+suffix :: PandocMonad m => MarkdownParser m (F Inlines)
20452081suffix = try $ do
20462082 hasSpace <- option False (notFollowedBy nonspaceChar >> return True)
20472083 spnl
@@ -2050,14 +2086,14 @@ suffix = try $ do
20502086 then (B.space <>) <$> rest
20512087 else rest
20522088
2053−prefix :: MarkdownParser (F Inlines)
2089+prefix :: PandocMonad m => MarkdownParser m (F Inlines)
20542090prefix = trimInlinesF . mconcat <$>
20552091 manyTill inline (char ']' <|> liftM (const ']') (lookAhead citeKey))
20562092
2057−citeList :: MarkdownParser (F [Citation])
2093+citeList :: PandocMonad m => MarkdownParser m (F [Citation])
20582094citeList = fmap sequence $ sepBy1 citation (try $ char ';' >> spnl)
20592095
2060−citation :: MarkdownParser (F Citation)
2096+citation :: PandocMonad m => MarkdownParser m (F Citation)
20612097citation = try $ do
20622098 pref <- prefix
20632099 (suppress_author, key) <- citeKey
@@ -2075,13 +2111,13 @@ citation = try $ do
20752111 , citationHash = 0
20762112 }
20772113
2078−smart :: MarkdownParser (F Inlines)
2114+smart :: PandocMonad m => MarkdownParser m (F Inlines)
20792115smart = do
20802116 getOption readerSmart >>= guard
20812117 doubleQuoted <|> singleQuoted <|>
20822118 choice (map (return <$>) [apostrophe, dash, ellipses])
20832119
2084−singleQuoted :: MarkdownParser (F Inlines)
2120+singleQuoted :: PandocMonad m => MarkdownParser m (F Inlines)
20852121singleQuoted = try $ do
20862122 singleQuoteStart
20872123 withQuoteContext InSingleQuote $
@@ -2091,7 +2127,7 @@ singleQuoted = try $ do
20912127-- doubleQuoted will handle regular double-quoted sections, as well
20922128-- as dialogues with an open double-quote without a close double-quote
20932129-- in the same paragraph.
2094−doubleQuoted :: MarkdownParser (F Inlines)
2130+doubleQuoted :: PandocMonad m => MarkdownParser m (F Inlines)
20952131doubleQuoted = try $ do
20962132 doubleQuoteStart
20972133 contents <- mconcat <$> many (try $ notFollowedBy doubleQuoteEnd >> inline)