From 2514ecdafcef001c4621a32aa056d6a00f600371 Mon Sep 17 00:00:00 2001 From: Rockingcool Date: Tue, 20 May 2025 12:19:59 -0500 Subject: [PATCH] Parse bold, italic and strikethrough in-order, instead of trying to find the end, then parsing everything in the middle. The current approach parses the opening bold (or italic), some text, then the closing bold (or italic), instead of parsing the opening, closing, then everything in between. --- src/MdToHTML.hs | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/src/MdToHTML.hs b/src/MdToHTML.hs index 57c58c3..18cd2a9 100644 --- a/src/MdToHTML.hs +++ b/src/MdToHTML.hs @@ -166,32 +166,31 @@ parseHeader = do -- Parse bold text parseBold :: ReadP MdToken -parseBold = do - text <- - choice - [ between (string "__") (string "__") (many1 (lookaheadParse (/= "__"))), - between (string "**") (string "**") (many1 (lookaheadParse (/= "**"))) - ] - let parsedText = fst $ leftmostLongestParse parseLine text - return (Bold parsedText) +parseBold = parseBoldWith "**" <|> parseBoldWith "__" + where + parseBoldWith delim = do + string delim + inside <- greedyParse1 parseLineToken + string delim + return (Bold (Line inside)) -- Parse italic text parseItalic :: ReadP MdToken -parseItalic = do - text <- - choice - [ between (string "_") (string "_") (munch1 (/= '_')), - between (string "*") (string "*") (munch1 (/= '*')) - ] - let parsedText = fst $ leftmostLongestParse parseLine text - return (Italic parsedText) +parseItalic = parseBoldWith "*" <|> parseBoldWith "_" + where + parseBoldWith delim = do + string delim + inside <- greedyParse1 parseLineToken + string delim + return (Italic (Line inside)) -- Parse strikethrough text parseStrikethrough :: ReadP MdToken parseStrikethrough = do - text <- between (string "~~") (string "~~") (many1 (lookaheadParse (/= "~~"))) - let parsedText = fst $ leftmostLongestParse parseLine text - return (Strikethrough parsedText) + string "~~" + inside <- many1 parseLineToken + string "~~" + return (Strikethrough (Line inside)) -- Parse a link parseLink :: ReadP MdToken