From 81671727b2330cfdf28831266e51435d8ef8a09c Mon Sep 17 00:00:00 2001 From: Rockingcool Date: Wed, 7 May 2025 14:21:13 -0500 Subject: [PATCH] Added more parsers for escaped characters and links. --- src/MdToHTML.hs | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/MdToHTML.hs b/src/MdToHTML.hs index 5b5deb5..8798db9 100644 --- a/src/MdToHTML.hs +++ b/src/MdToHTML.hs @@ -123,6 +123,14 @@ parseItalic = do let parsedText = fst $ leftmostLongestParse parseLine text return (Italic parsedText) +-- Parse a link +parseLink :: ReadP MdToken +parseLink = do + linkText <- between (string "[") (string "]") (many1 get) + linkURL <- between (string "(") (string ")") (many1 get) + let parsedLinkText = fst $ leftmostLongestParse parseLine linkText + return $ Link parsedLinkText (URL linkURL) + -- Parse a linebreak character parseLinebreak :: ReadP MdToken parseLinebreak = do @@ -136,6 +144,13 @@ parseSingleNewline = do char '\n' return SingleNewline +-- Parse an escaped character +parseEscapedChar :: ReadP MdToken +parseEscapedChar = do + char '\\' + escapedChar <- choice (map char specialChars) + return (Unit [escapedChar]) + -- Parse a regular string as a Unit. parseString :: ReadP MdToken parseString = do @@ -144,7 +159,15 @@ parseString = do return (Unit (firstChar : text)) lineParsers :: [ReadP MdToken] -lineParsers = [parseLinebreak, parseSingleNewline, parseBold, parseItalic, parseString] -- A 'line' doesn't include a 'header' +lineParsers = + [ parseLinebreak, + parseSingleNewline, + parseEscapedChar, + parseBold, + parseItalic, + parseLink, + parseString + ] -- A 'line' doesn't include a 'header' -- List of all parsers allParsers :: [ReadP MdToken]