git.iko.soy/typeable/pandoc
on master help sign in
Parsing: Provide parseFromString'.

This is a verison of parseFromString specialied to ParserState, which resets stateLastStrPos at the end. This is almost always what we want. This fixes a bug where `_hi_` wasn't treated as emphasis in the following, because pandoc got confused about the position of the last word: - [o] _hi_ Closes #3690.

commitbc6aac7b474495c4433c31bcd4a3570057edb850 authorJohn MacFarlane <jgm@berkeley.edu> dateWed 24 May 2017, 22:41 (9 years ago) parentd4ccd1e
8 files changed+88−62
src/Text/Pandoc/Parsing.hs+17−1 src/Text/Pandoc/Readers/LaTeX.hs+6−6 src/Text/Pandoc/Readers/Markdown.hs+21−19 src/Text/Pandoc/Readers/RST.hs+25−25 src/Text/Pandoc/Readers/TWiki.hs+4−4 src/Text/Pandoc/Readers/Textile.hs+4−4 src/Text/Pandoc/Readers/Txt2Tags.hs+3−3 test/command/3690.md+8
src/Text/Pandoc/Parsing.hs+17−1
@@ -50,6 +50,7 @@ module Text.Pandoc.Parsing ( anyLine,
5050 enclosed,
5151 stringAnyCase,
5252 parseFromString,
53+ parseFromString',
5354 lineClump,
5455 charsInBalanced,
5556 romanNumeral,
@@ -358,7 +359,10 @@ stringAnyCase (x:xs) = do
358359 return (firstChar:rest)
359360
360361-- | Parse contents of 'str' using 'parser' and return result.
361−parseFromString :: Monad m => ParserT String st m a -> String -> ParserT String st m a
362+parseFromString :: Monad m
363+ => ParserT String st m a
364+ -> String
365+ -> ParserT String st m a
362366parseFromString parser str = do
363367 oldPos <- getPosition
364368 oldInput <- getInput
@@ -370,6 +374,18 @@ parseFromString parser str = do
370374 setPosition oldPos
371375 return result
372376
377+-- | Like 'parseFromString' but specialized for 'ParserState'.
378+-- This resets 'stateLastStrPos', which is almost always what we want.
379+parseFromString' :: Monad m
380+ => ParserT String ParserState m a
381+ -> String
382+ -> ParserT String ParserState m a
383+parseFromString' parser str = do
384+ oldStrPos <- stateLastStrPos <$> getState
385+ res <- parseFromString parser str
386+ updateState $ \st -> st{ stateLastStrPos = oldStrPos }
387+ return res
388+
373389-- | Parse raw line block up to and including blank lines.
374390lineClump :: Stream [Char] m Char => ParserT [Char] st m String
375391lineClump = blanklines
src/Text/Pandoc/Readers/LaTeX.hs+6−6
@@ -304,8 +304,8 @@ blockCommand = try $ do
304304 rawcommand <- getRawCommand name'
305305 transformed <- applyMacros' rawcommand
306306 guard $ transformed /= rawcommand
307− notFollowedBy $ parseFromString inlines transformed
308− parseFromString blocks transformed
307+ notFollowedBy $ parseFromString' inlines transformed
308+ parseFromString' blocks transformed
309309 lookupListDefault raw [name',name] blockCommands
310310
311311inBrackets :: Inlines -> Inlines
@@ -475,7 +475,7 @@ inlineCommand = try $ do
475475 transformed <- applyMacros' rawcommand
476476 exts <- getOption readerExtensions
477477 if transformed /= rawcommand
478− then parseFromString inlines transformed
478+ then parseFromString' inlines transformed
479479 else if extensionEnabled Ext_raw_tex exts
480480 then return $ rawInline "latex" rawcommand
481481 else ignore rawcommand
@@ -1021,7 +1021,7 @@ rawEnv name = do
10211021 (bs, raw) <- withRaw $ env name blocks
10221022 raw' <- applyMacros' $ beginCommand ++ raw
10231023 if raw' /= beginCommand ++ raw
1024− then parseFromString blocks raw'
1024+ then parseFromString' blocks raw'
10251025 else if parseRaw
10261026 then return $ rawBlock "latex" $ beginCommand ++ raw'
10271027 else do
@@ -1119,7 +1119,7 @@ keyvals :: PandocMonad m => LP m [(String, String)]
11191119keyvals = try $ char '[' *> manyTill keyval (char ']')
11201120
11211121alltt :: PandocMonad m => String -> LP m Blocks
1122−alltt t = walk strToCode <$> parseFromString blocks
1122+alltt t = walk strToCode <$> parseFromString' blocks
11231123 (substitute " " "\\ " $ substitute "%" "\\%" $
11241124 intercalate "\\\\\n" $ lines t)
11251125 where strToCode (Str s) = Code nullAttr s
@@ -1503,7 +1503,7 @@ parseTableRow cols prefixes suffixes = try $ do
15031503 guard $ length rawcells == cols
15041504 let rawcells' = zipWith3 (\c p s -> p ++ trim c ++ s)
15051505 rawcells prefixes suffixes
1506− cells' <- mapM (parseFromString tableCell) rawcells'
1506+ cells' <- mapM (parseFromString' tableCell) rawcells'
15071507 let numcells = length cells'
15081508 guard $ numcells <= cols && numcells >= 1
15091509 guard $ cells' /= [mempty]
src/Text/Pandoc/Readers/Markdown.hs+21−19
@@ -155,9 +155,11 @@ litChar = escapedChar'
155155inlinesInBalancedBrackets :: PandocMonad m => MarkdownParser m (F Inlines)
156156inlinesInBalancedBrackets = do
157157 char '['
158+ pos <- getPosition
158159 (_, raw) <- withRaw $ charsInBalancedBrackets 1
159160 guard $ not $ null raw
160− parseFromString (trimInlinesF . mconcat <$> many inline) (init raw)
161+ parseFromString' (setPosition pos >>
162+ trimInlinesF . mconcat <$> many inline) (init raw)
161163
162164charsInBalancedBrackets :: PandocMonad m => Int -> MarkdownParser m ()
163165charsInBalancedBrackets 0 = return ()
@@ -189,7 +191,7 @@ rawTitleBlockLine = do
189191titleLine :: PandocMonad m => MarkdownParser m (F Inlines)
190192titleLine = try $ do
191193 raw <- rawTitleBlockLine
192− res <- parseFromString (many inline) raw
194+ res <- parseFromString' (many inline) raw
193195 return $ trimInlinesF $ mconcat res
194196
195197authorsLine :: PandocMonad m => MarkdownParser m (F [Inlines])
@@ -200,12 +202,12 @@ authorsLine = try $ do
200202 (trimInlinesF . mconcat <$> many
201203 (try $ notFollowedBy sep >> inline))
202204 sep
203− sequence <$> parseFromString pAuthors raw
205+ sequence <$> parseFromString' pAuthors raw
204206
205207dateLine :: PandocMonad m => MarkdownParser m (F Inlines)
206208dateLine = try $ do
207209 raw <- rawTitleBlockLine
208− res <- parseFromString (many inline) raw
210+ res <- parseFromString' (many inline) raw
209211 return $ trimInlinesF $ mconcat res
210212
211213titleBlock :: PandocMonad m => MarkdownParser m ()
@@ -290,7 +292,7 @@ ignorable t = (T.pack "_") `T.isSuffixOf` t
290292
291293toMetaValue :: PandocMonad m
292294 => Text -> MarkdownParser m (F MetaValue)
293−toMetaValue x = toMeta <$> parseFromString parseBlocks (T.unpack x)
295+toMetaValue x = toMeta <$> parseFromString' parseBlocks (T.unpack x)
294296 where
295297 toMeta p = do
296298 p' <- p
@@ -466,7 +468,7 @@ noteBlock = try $ do
466468 rest <- many $ try $ blanklines >> indentSpaces >> rawLines
467469 let raw = unlines (first:rest) ++ "\n"
468470 optional blanklines
469− parsed <- parseFromString parseBlocks raw
471+ parsed <- parseFromString' parseBlocks raw
470472 let newnote = (ref, parsed)
471473 oldnotes <- stateNotes' <$> getState
472474 case lookup ref oldnotes of
@@ -774,7 +776,7 @@ blockQuote :: PandocMonad m => MarkdownParser m (F Blocks)
774776blockQuote = do
775777 raw <- emailBlockQuote
776778 -- parse the extracted block, which may contain various block elements:
777− contents <- parseFromString parseBlocks $ (intercalate "\n" raw) ++ "\n\n"
779+ contents <- parseFromString' parseBlocks $ (intercalate "\n" raw) ++ "\n\n"
778780 return $ B.blockQuote <$> contents
779781
780782--
@@ -887,7 +889,7 @@ listItem start = try $ do
887889 setState $ state {stateParserContext = ListItemState}
888890 -- parse the extracted block, which may contain various block elements:
889891 let raw = concat (first:continuations)
890− contents <- parseFromString parseBlocks raw
892+ contents <- parseFromString' parseBlocks raw
891893 updateState (\st -> st {stateParserContext = oldContext})
892894 return contents
893895
@@ -934,8 +936,8 @@ definitionListItem :: PandocMonad m => Bool -> MarkdownParser m (F (Inlines, [Bl
934936definitionListItem compact = try $ do
935937 rawLine' <- anyLine
936938 raw <- many1 $ defRawBlock compact
937− term <- parseFromString (trimInlinesF . mconcat <$> many inline) rawLine'
938− contents <- mapM (parseFromString parseBlocks . (++"\n")) raw
939+ term <- parseFromString' (trimInlinesF . mconcat <$> many inline) rawLine'
940+ contents <- mapM (parseFromString' parseBlocks . (++"\n")) raw
939941 optional blanklines
940942 return $ liftM2 (,) term (sequence contents)
941943
@@ -1127,7 +1129,7 @@ lineBlock :: PandocMonad m => MarkdownParser m (F Blocks)
11271129lineBlock = try $ do
11281130 guardEnabled Ext_line_blocks
11291131 lines' <- lineBlockLines >>=
1130− mapM (parseFromString (trimInlinesF . mconcat <$> many inline))
1132+ mapM (parseFromString' (trimInlinesF . mconcat <$> many inline))
11311133 return $ B.lineBlock <$> sequence lines'
11321134
11331135--
@@ -1170,7 +1172,7 @@ simpleTableHeader headless = try $ do
11701172 then replicate (length dashes) ""
11711173 else rawHeads
11721174 heads <- fmap sequence
1173− $ mapM (parseFromString (mconcat <$> many plain))
1175+ $ mapM (parseFromString' (mconcat <$> many plain))
11741176 $ map trim rawHeads'
11751177 return (heads, aligns, indices)
11761178
@@ -1216,7 +1218,7 @@ tableLine :: PandocMonad m
12161218 => [Int]
12171219 -> MarkdownParser m (F [Blocks])
12181220tableLine indices = rawTableLine indices >>=
1219− fmap sequence . mapM (parseFromString (mconcat <$> many plain))
1221+ fmap sequence . mapM (parseFromString' (mconcat <$> many plain))
12201222
12211223-- Parse a multiline table row and return a list of blocks (columns).
12221224multilineRow :: PandocMonad m
@@ -1225,7 +1227,7 @@ multilineRow :: PandocMonad m
12251227multilineRow indices = do
12261228 colLines <- many1 (rawTableLine indices)
12271229 let cols = map unlines $ transpose colLines
1228− fmap sequence $ mapM (parseFromString (mconcat <$> many plain)) cols
1230+ fmap sequence $ mapM (parseFromString' (mconcat <$> many plain)) cols
12291231
12301232-- Parses a table caption: inlines beginning with 'Table:'
12311233-- and followed by blank lines.
@@ -1283,7 +1285,7 @@ multilineTableHeader headless = try $ do
12831285 then replicate (length dashes) ""
12841286 else map (unlines . map trim) rawHeadsList
12851287 heads <- fmap sequence $
1286− mapM (parseFromString (mconcat <$> many plain)) $
1288+ mapM (parseFromString' (mconcat <$> many plain)) $
12871289 map trim rawHeads
12881290 return (heads, aligns, indices)
12891291
@@ -1340,7 +1342,7 @@ pipeTableRow = try $ do
13401342 let chunk = void (code <|> math <|> rawHtmlInline <|> escapedChar <|> rawLaTeXInline')
13411343 <|> void (noneOf "|\n\r")
13421344 let cellContents = ((trim . snd) <$> withRaw (many chunk)) >>=
1343− parseFromString pipeTableCell
1345+ parseFromString' pipeTableCell
13441346 cells <- cellContents `sepEndBy1` (char '|')
13451347 -- surrounding pipes needed for a one-column table:
13461348 guard $ not (length cells == 1 && not openPipe)
@@ -1747,8 +1749,8 @@ referenceLink constructor (lab, raw) = do
17471749 when (raw' == "") $ guardEnabled Ext_shortcut_reference_links
17481750 let labIsRef = raw' == "" || raw' == "[]"
17491751 let key = toKey $ if labIsRef then raw else raw'
1750− parsedRaw <- parseFromString (mconcat <$> many inline) raw'
1751− fallback <- parseFromString (mconcat <$> many inline) $ dropBrackets raw
1752+ parsedRaw <- parseFromString' (mconcat <$> many inline) raw'
1753+ fallback <- parseFromString' (mconcat <$> many inline) $ dropBrackets raw
17521754 implicitHeaderRefs <- option False $
17531755 True <$ guardEnabled Ext_implicit_header_references
17541756 let makeFallback = do
@@ -1954,7 +1956,7 @@ textualCite = try $ do
19541956 let (spaces',raw') = span isSpace raw
19551957 spc | null spaces' = mempty
19561958 | otherwise = B.space
1957− lab <- parseFromString (mconcat <$> many inline) $ dropBrackets raw'
1959+ lab <- parseFromString' (mconcat <$> many inline) $ dropBrackets raw'
19581960 fallback <- referenceLink B.linkWith (lab,raw')
19591961 return $ do
19601962 fallback' <- fallback
src/Text/Pandoc/Readers/RST.hs+25−25
@@ -196,7 +196,7 @@ parseRST = do
196196parseCitation :: PandocMonad m
197197 => (String, String) -> RSTParser m (Inlines, [Blocks])
198198parseCitation (ref, raw) = do
199− contents <- parseFromString parseBlocks raw
199+ contents <- parseFromString' parseBlocks raw
200200 return $ (B.spanWith (ref, ["citation-label"], []) (B.str ref),
201201 [contents])
202202
@@ -246,7 +246,7 @@ fieldListItem :: PandocMonad m => Int -> RSTParser m (Inlines, [Blocks])
246246fieldListItem minIndent = try $ do
247247 (name, raw) <- rawFieldListItem minIndent
248248 term <- parseInlineFromString name
249− contents <- parseFromString parseBlocks raw
249+ contents <- parseFromString' parseBlocks raw
250250 optional blanklines
251251 return (term, [contents])
252252
@@ -445,7 +445,7 @@ blockQuote :: PandocMonad m => RSTParser m Blocks
445445blockQuote = do
446446 raw <- indentedBlock
447447 -- parse the extracted block, which may contain various block elements:
448− contents <- parseFromString parseBlocks $ raw ++ "\n\n"
448+ contents <- parseFromString' parseBlocks $ raw ++ "\n\n"
449449 return $ B.blockQuote contents
450450
451451{-
@@ -533,7 +533,7 @@ definitionListItem = try $ do
533533 term <- trimInlines . mconcat <$> many1Till inline endline
534534 raw <- indentedBlock
535535 -- parse the extracted block, which may contain various block elements:
536− contents <- parseFromString parseBlocks $ raw ++ "\n"
536+ contents <- parseFromString' parseBlocks $ raw ++ "\n"
537537 return (term, [contents])
538538
539539definitionList :: PandocMonad m => RSTParser m Blocks
@@ -595,7 +595,7 @@ listItem start = try $ do
595595 let oldContext = stateParserContext state
596596 setState $ state {stateParserContext = ListItemState}
597597 -- parse the extracted block, which may itself contain block elements
598− parsed <- parseFromString parseBlocks $ concat (first:rest) ++ "\n"
598+ parsed <- parseFromString' parseBlocks $ concat (first:rest) ++ "\n"
599599 updateState (\st -> st {stateParserContext = oldContext})
600600 return $ case B.toList parsed of
601601 [Para xs] ->
@@ -686,19 +686,19 @@ directive' = do
686686 "line-block" -> lineBlockDirective body'
687687 "raw" -> return $ B.rawBlock (trim top) (stripTrailingNewlines body)
688688 "role" -> addNewRole top $ map (\(k,v) -> (k, trim v)) fields
689− "container" -> parseFromString parseBlocks body'
689+ "container" -> parseFromString' parseBlocks body'
690690 "replace" -> B.para <$> -- consumed by substKey
691691 parseInlineFromString (trim top)
692692 "unicode" -> B.para <$> -- consumed by substKey
693693 parseInlineFromString (trim $ unicodeTransform top)
694− "compound" -> parseFromString parseBlocks body'
695− "pull-quote" -> B.blockQuote <$> parseFromString parseBlocks body'
696− "epigraph" -> B.blockQuote <$> parseFromString parseBlocks body'
697− "highlights" -> B.blockQuote <$> parseFromString parseBlocks body'
694+ "compound" -> parseFromString' parseBlocks body'
695+ "pull-quote" -> B.blockQuote <$> parseFromString' parseBlocks body'
696+ "epigraph" -> B.blockQuote <$> parseFromString' parseBlocks body'
697+ "highlights" -> B.blockQuote <$> parseFromString' parseBlocks body'
698698 "rubric" -> B.para . B.strong <$> parseInlineFromString top
699699 _ | label `elem` ["attention","caution","danger","error","hint",
700700 "important","note","tip","warning","admonition"] ->
701− do bod <- parseFromString parseBlocks $ top ++ "\n\n" ++ body'
701+ do bod <- parseFromString' parseBlocks $ top ++ "\n\n" ++ body'
702702 let lab = case label of
703703 "admonition" -> mempty
704704 (l:ls) -> B.divWith ("",["admonition-title"],[])
@@ -711,11 +711,11 @@ directive' = do
711711 (trim top ++ if null subtit
712712 then ""
713713 else (": " ++ subtit))
714− bod <- parseFromString parseBlocks body'
714+ bod <- parseFromString' parseBlocks body'
715715 return $ B.divWith ("",["sidebar"],[]) $ tit <> bod
716716 "topic" ->
717717 do tit <- B.para . B.strong <$> parseInlineFromString top
718− bod <- parseFromString parseBlocks body'
718+ bod <- parseFromString' parseBlocks body'
719719 return $ B.divWith ("",["topic"],[]) $ tit <> bod
720720 "default-role" -> mempty <$ updateState (\s ->
721721 s { stateRstDefaultRole =
@@ -731,7 +731,7 @@ directive' = do
731731 "math" -> return $ B.para $ mconcat $ map B.displayMath
732732 $ toChunks $ top ++ "\n\n" ++ body
733733 "figure" -> do
734− (caption, legend) <- parseFromString extractCaption body'
734+ (caption, legend) <- parseFromString' extractCaption body'
735735 let src = escapeURI $ trim top
736736 return $ B.para (B.imageWith (imgAttr "figclass") src "fig:"
737737 caption) <> legend
@@ -750,21 +750,21 @@ directive' = do
750750 -- directive content or the first immediately following element
751751 children <- case body of
752752 "" -> block
753− _ -> parseFromString parseBlocks body'
753+ _ -> parseFromString' parseBlocks body'
754754 return $ B.divWith attrs children
755755 other -> do
756756 pos <- getPosition
757757 logMessage $ SkippedContent (".. " ++ other) pos
758− bod <- parseFromString parseBlocks $ top ++ "\n\n" ++ body'
758+ bod <- parseFromString' parseBlocks $ top ++ "\n\n" ++ body'
759759 return $ B.divWith ("",[other],[]) bod
760760
761761tableDirective :: PandocMonad m
762762 => String -> [(String, String)] -> String -> RSTParser m Blocks
763763tableDirective top _fields body = do
764− bs <- parseFromString parseBlocks body
764+ bs <- parseFromString' parseBlocks body
765765 case B.toList bs of
766766 [Table _ aligns' widths' header' rows'] -> do
767− title <- parseFromString (trimInlines . mconcat <$> many inline) top
767+ title <- parseFromString' (trimInlines . mconcat <$> many inline) top
768768 -- TODO widths
769769 -- align is not applicable since we can't represent whole table align
770770 return $ B.singleton $ Table (B.toList title)
@@ -780,8 +780,8 @@ listTableDirective :: PandocMonad m
780780 => String -> [(String, String)] -> String
781781 -> RSTParser m Blocks
782782listTableDirective top fields body = do
783− bs <- parseFromString parseBlocks body
784− title <- parseFromString (trimInlines . mconcat <$> many inline) top
783+ bs <- parseFromString' parseBlocks body
784+ title <- parseFromString' (trimInlines . mconcat <$> many inline) top
785785 let rows = takeRows $ B.toList bs
786786 headerRowsNum = fromMaybe (0 :: Int) $
787787 lookup "header-rows" fields >>= safeRead
@@ -812,7 +812,7 @@ addNewRole :: PandocMonad m
812812 => String -> [(String, String)] -> RSTParser m Blocks
813813addNewRole roleString fields = do
814814 pos <- getPosition
815− (role, parentRole) <- parseFromString inheritedRole roleString
815+ (role, parentRole) <- parseFromString' inheritedRole roleString
816816 customRoles <- stateRstCustomRoles <$> getState
817817 let getBaseRole (r, f, a) roles =
818818 case M.lookup r roles of
@@ -1127,7 +1127,7 @@ simpleTableRow indices = do
11271127 let cols = map unlines . transpose $ firstLine : conLines ++
11281128 [replicate (length indices) ""
11291129 | not (null conLines)]
1130− mapM (parseFromString parseBlocks) cols
1130+ mapM (parseFromString' parseBlocks) cols
11311131
11321132simpleTableSplitLine :: [Int] -> String -> [String]
11331133simpleTableSplitLine indices line =
@@ -1150,7 +1150,7 @@ simpleTableHeader headless = try $ do
11501150 let rawHeads = if headless
11511151 then replicate (length dashes) ""
11521152 else simpleTableSplitLine indices rawContent
1153− heads <- mapM (parseFromString (mconcat <$> many plain)) $
1153+ heads <- mapM (parseFromString' (mconcat <$> many plain)) $
11541154 map trim rawHeads
11551155 return (heads, aligns, indices)
11561156
@@ -1206,7 +1206,7 @@ inline = choice [ note -- can start with whitespace, so try before ws
12061206 , symbol ] <?> "inline"
12071207
12081208parseInlineFromString :: PandocMonad m => String -> RSTParser m Inlines
1209−parseInlineFromString = parseFromString (trimInlines . mconcat <$> many inline)
1209+parseInlineFromString = parseFromString' (trimInlines . mconcat <$> many inline)
12101210
12111211hyphens :: Monad m => RSTParser m Inlines
12121212hyphens = do
@@ -1470,7 +1470,7 @@ note = try $ do
14701470 -- Note references inside other notes are allowed in reST, but
14711471 -- not yet in this implementation.
14721472 updateState $ \st -> st{ stateNotes = [] }
1473− contents <- parseFromString parseBlocks raw
1473+ contents <- parseFromString' parseBlocks raw
14741474 let newnotes = if (ref == "*" || ref == "#") -- auto-numbered
14751475 -- delete the note so the next auto-numbered note
14761476 -- doesn't get the same contents:
src/Text/Pandoc/Readers/TWiki.hs+4−4
@@ -106,7 +106,7 @@ parseHtmlContentWithAttrs tag parser = do
106106 parsedContent <- try $ parseContent content
107107 return (attr, parsedContent)
108108 where
109− parseContent = parseFromString $ nested $ manyTill parser endOfContent
109+ parseContent = parseFromString' $ nested $ manyTill parser endOfContent
110110 endOfContent = try $ skipMany blankline >> skipSpaces >> eof
111111
112112parseHtmlContent :: PandocMonad m => String -> TWParser m a -> TWParser m [a]
@@ -233,7 +233,7 @@ listItemLine prefix marker = lineContent >>= parseContent >>= return . mconcat
233233 filterSpaces = reverse . dropWhile (== ' ') . reverse
234234 listContinuation = notFollowedBy (string prefix >> marker) >>
235235 string " " >> lineContent
236− parseContent = parseFromString $ many1 $ nestedList <|> parseInline
236+ parseContent = parseFromString' $ many1 $ nestedList <|> parseInline
237237 parseInline = many1Till inline (lastNewline <|> newlineBeforeNestedList) >>=
238238 return . B.plain . mconcat
239239 nestedList = list prefix
@@ -297,7 +297,7 @@ noautolink = do
297297 setState $ st{ stateAllowLinks = True }
298298 return $ mconcat blocks
299299 where
300− parseContent = parseFromString $ many $ block
300+ parseContent = parseFromString' $ many $ block
301301
302302para :: PandocMonad m => TWParser m B.Blocks
303303para = many1Till inline endOfParaElement >>= return . result . mconcat
@@ -525,4 +525,4 @@ linkText = do
525525 return (url, "", content)
526526 where
527527 linkContent = (char '[') >> many1Till anyChar (char ']') >>= parseLinkContent
528− parseLinkContent = parseFromString $ many1 inline
528+ parseLinkContent = parseFromString' $ many1 inline
src/Text/Pandoc/Readers/Textile.hs+4−4
@@ -315,7 +315,7 @@ definitionListItem = try $ do
315315 optional whitespace >> newline
316316 s <- many1Till anyChar (try (string "=:" >> newline))
317317 -- this ++ "\n\n" does not look very good
318− ds <- parseFromString parseBlocks (s ++ "\n\n")
318+ ds <- parseFromString' parseBlocks (s ++ "\n\n")
319319 return [ds]
320320
321321-- raw content
@@ -367,7 +367,7 @@ tableCell = try $ do
367367 notFollowedBy blankline
368368 raw <- trim <$>
369369 many (noneOf "|\n" <|> try (char '\n' <* notFollowedBy blankline))
370− content <- mconcat <$> parseFromString (many inline) raw
370+ content <- mconcat <$> parseFromString' (many inline) raw
371371 return ((isHeader, alignment), B.plain content)
372372
373373-- | A table row is made of many table cells
@@ -389,7 +389,7 @@ table = try $ do
389389 _ <- attributes
390390 char '.'
391391 rawcapt <- trim <$> anyLine
392− parseFromString (mconcat <$> many inline) rawcapt
392+ parseFromString' (mconcat <$> many inline) rawcapt
393393 rawrows <- many1 $ (skipMany ignorableRow) >> tableRow
394394 skipMany ignorableRow
395395 blanklines
@@ -507,7 +507,7 @@ note = try $ do
507507 notes <- stateNotes <$> getState
508508 case lookup ref notes of
509509 Nothing -> fail "note not found"
510− Just raw -> B.note <$> parseFromString parseBlocks raw
510+ Just raw -> B.note <$> parseFromString' parseBlocks raw
511511
512512-- | Special chars
513513markupChars :: [Char]
src/Text/Pandoc/Readers/Txt2Tags.hs+3−3
@@ -212,7 +212,7 @@ quote :: T2T Blocks
212212quote = try $ do
213213 lookAhead tab
214214 rawQuote <- many1 (tab *> optional spaces *> anyLine)
215− contents <- parseFromString parseBlocks (intercalate "\n" rawQuote ++ "\n\n")
215+ contents <- parseFromString' parseBlocks (intercalate "\n" rawQuote ++ "\n\n")
216216 return $ B.blockQuote contents
217217
218218commentLine :: T2T Inlines
@@ -264,7 +264,7 @@ listItem start end = try $ do
264264 firstLine <- anyLineNewline
265265 blank <- option "" ("\n" <$ blankline)
266266 rest <- concat <$> many (listContinuation markerLength)
267− parseFromString end $ firstLine ++ blank ++ rest
267+ parseFromString' end $ firstLine ++ blank ++ rest
268268
269269-- continuation of a list item - indented and separated by blankline or endline.
270270-- Note: nested lists are parsed as continuations.
@@ -439,7 +439,7 @@ inlineMarkup p f c special = try $ do
439439 Just middle -> do
440440 lastChar <- anyChar
441441 end <- many1 (char c)
442− let parser inp = parseFromString (mconcat <$> many p) inp
442+ let parser inp = parseFromString' (mconcat <$> many p) inp
443443 let start' = case drop 2 start of
444444 "" -> mempty
445445 xs -> special xs
test/command/3690.mdnew file+8
@@ -0,0 +1,8 @@
1+```
2+% pandoc
3+- [o] _hi_
4+^D
5+<ul>
6+<li>[o] <em>hi</em></li>
7+</ul>
8+```