git.iko.soy/typeable/pandoc
on master help sign in
Textile reader: improve definition list parsing.

- Allow multiple terms (which we concatenate with linebreaks). - Fix exponential parsing bug (closes #3020 for real this time).

commite2d59461bbaa5ff41d41b2f0e430e03c12d8d0fd authorJohn MacFarlane <jgm@berkeley.edu> dateTue 19 Jul 2016, 09:03 (10 years ago) parent3490932
1 file changed+13−6
src/Text/Pandoc/Readers/Textile.hs+13−6
src/Text/Pandoc/Readers/Textile.hs+13−6
@@ -62,7 +62,7 @@ import Text.Pandoc.Shared (trim)
6262import Text.Pandoc.Readers.LaTeX ( rawLaTeXInline, rawLaTeXBlock )
6363import Text.HTML.TagSoup (parseTags, innerText, fromAttrib, Tag(..))
6464import Text.HTML.TagSoup.Match
65−import Data.List ( intercalate, transpose )
65+import Data.List ( intercalate, transpose, intersperse )
6666import Data.Char ( digitToInt, isUpper )
6767import Control.Monad ( guard, liftM, when )
6868import Text.Pandoc.Compat.Monoid ((<>))
@@ -273,13 +273,20 @@ listStart = genericListStart '*'
273273genericListStart :: Char -> Parser [Char] st ()
274274genericListStart c = () <$ try (many1 (char c) >> whitespace)
275275
276−definitionListStart :: Parser [Char] ParserState Inlines
277−definitionListStart = try $ do
276+basicDLStart :: Parser [Char] ParserState ()
277+basicDLStart = do
278278 char '-'
279279 whitespace
280280 notFollowedBy newline
281+
282+definitionListStart :: Parser [Char] ParserState Inlines
283+definitionListStart = try $ do
284+ basicDLStart
281285 trimInlines . mconcat <$>
282− many1Till inline (try (string ":=")) <* optional whitespace
286+ many1Till inline
287+ ( try (newline *> lookAhead basicDLStart)
288+ <|> try (lookAhead (() <$ string ":="))
289+ )
283290
284291listInline :: Parser [Char] ParserState Inlines
285292listInline = try (notFollowedBy newline >> inline)
@@ -291,8 +298,8 @@ listInline = try (notFollowedBy newline >> inline)
291298-- break.
292299definitionListItem :: Parser [Char] ParserState (Inlines, [Blocks])
293300definitionListItem = try $ do
294− term <- definitionListStart
295− def' <- multilineDef <|> inlineDef
301+ term <- (mconcat . intersperse B.linebreak) <$> many1 definitionListStart
302+ def' <- string ":=" *> optional whitespace *> (multilineDef <|> inlineDef)
296303 return (term, def')
297304 where inlineDef :: Parser [Char] ParserState [Blocks]
298305 inlineDef = liftM (\d -> [B.plain d])