Working on parsing single newlines

This commit is contained in:
2025-05-05 09:42:53 -05:00
parent f916267d29
commit a18d03e4ac
2 changed files with 36 additions and 31 deletions

View File

@@ -21,6 +21,7 @@ data MdToken
| Header HeaderLevel MdToken
| Para MdToken
| Line [MdToken]
| SingleNewline -- A single newline is rendered as a space.
| Linebreak
| HorizontalRule
| Blockquote MdToken
@@ -42,6 +43,7 @@ instance Show MdToken where
show (Para token) = "<p>" ++ show token ++ "</p>"
show (Line tokens) = concat (map show tokens)
show Linebreak = "<br>"
show SingleNewline = " "
show HorizontalRule = "---------"
show (Blockquote token) = "BLOCK" ++ show token
show (UnordList tokens) = "UNORD" ++ concat (map show tokens)
@@ -87,12 +89,11 @@ lineToList (Line tokens) = tokens
parseHeader :: ReadP MdToken
parseHeader = do
skipSpaces
headers <- many1 mustBeHash
headers <- munch1 (== '#')
when
((length headers) > 6)
pfail
_ <- string " "
-- text <- manyTill (get) ((string "\n") <|> (eof >> return ""))-- Parse until EOL or EOF
skipSpaces
text <- munch1 (/= '\n')
Text.ParserCombinators.ReadP.optional (char '\n')
let parsedText = fst $ leftmostLongestParse parseLine text
@@ -128,6 +129,11 @@ parseLinebreak = do
char '\n'
return Linebreak
parseSingleNewline :: ReadP MdToken
parseSingleNewline = do
char '\n'
return SingleNewline
-- Parse a regular string as a Unit.
parseString :: ReadP MdToken
parseString = do
@@ -136,7 +142,7 @@ parseString = do
return (Unit (firstChar : text))
lineParsers :: [ReadP MdToken]
lineParsers = [parseLinebreak, parseBold, parseItalic, parseString] -- A 'line' doesn't include a 'header'
lineParsers = [parseLinebreak, parseSingleNewline, parseBold, parseItalic, parseString] -- A 'line' doesn't include a 'header'
-- List of all parsers
allParsers :: [ReadP MdToken]
@@ -154,7 +160,6 @@ parseLine = do
remaining <- look
when (null remaining) pfail
parsed <- parseMany parseLineToken
-- traceM $ show parsed
return (Line parsed)
-- Parse a paragraph, which is a 'Line' (can span multiple actual lines), separated by double-newlines.