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]