|
|
|
@ -120,6 +120,16 @@ fallthroughParser :: [ReadP a] -> ReadP a
|
|
|
|
|
fallthroughParser [x] = x
|
|
|
|
|
fallthroughParser (x : xs) = x <++ fallthroughParser xs
|
|
|
|
|
|
|
|
|
|
myMany :: (Monoid a) => ReadP a -> ReadP [a]
|
|
|
|
|
myMany p = do
|
|
|
|
|
remaining <- look
|
|
|
|
|
case remaining of
|
|
|
|
|
[] -> return []
|
|
|
|
|
_ -> return [] +++ myMany1 p
|
|
|
|
|
|
|
|
|
|
myMany1 :: (Monoid a) => ReadP a -> ReadP [a]
|
|
|
|
|
myMany1 p = liftM2 (:) p (myMany p)
|
|
|
|
|
|
|
|
|
|
-- ---------------
|
|
|
|
|
|
|
|
|
|
-- Parse a markdown header, denoted by 1-6 #'s followed by some text, followed by EOL.
|
|
|
|
@ -143,19 +153,25 @@ parseBold = parseBoldWith "**" <|> parseBoldWith "__"
|
|
|
|
|
where
|
|
|
|
|
parseBoldWith delim = do
|
|
|
|
|
string delim
|
|
|
|
|
inside <- greedyParse1 parseLineToken
|
|
|
|
|
inside <- myMany1 parseLineToken
|
|
|
|
|
string delim
|
|
|
|
|
return (Bold (Line inside))
|
|
|
|
|
|
|
|
|
|
-- Parse italic text
|
|
|
|
|
parseItalic :: ReadP MdToken
|
|
|
|
|
parseItalic = parseItalicWith "*" <|> parseItalicWith "_"
|
|
|
|
|
parseItalic = parseItalicWith '*' <|> parseItalicWith '_'
|
|
|
|
|
where
|
|
|
|
|
parseItalicWith delim = do
|
|
|
|
|
string delim
|
|
|
|
|
inside <- greedyParse1 parseLineToken
|
|
|
|
|
string delim
|
|
|
|
|
exactlyOnce delim
|
|
|
|
|
inside <- myMany1 parseLineToken
|
|
|
|
|
exactlyOnce delim
|
|
|
|
|
return (Italic (Line inside))
|
|
|
|
|
exactlyOnce ch = do
|
|
|
|
|
char ch
|
|
|
|
|
remaining <- look
|
|
|
|
|
case remaining of
|
|
|
|
|
[] -> return ch
|
|
|
|
|
x : xs -> if x == ch then pfail else return ch
|
|
|
|
|
|
|
|
|
|
-- Parse strikethrough text
|
|
|
|
|
parseStrikethrough :: ReadP MdToken
|
|
|
|
@ -204,7 +220,8 @@ parseEscapedChar = do
|
|
|
|
|
-- Parse a character as a Unit.
|
|
|
|
|
parseUnit :: ReadP MdToken
|
|
|
|
|
parseUnit = do
|
|
|
|
|
text <- satisfy (`notElem` specialChars)
|
|
|
|
|
-- text <- satisfy (`notElem` specialChars)
|
|
|
|
|
text <- get
|
|
|
|
|
return (Unit [text])
|
|
|
|
|
|
|
|
|
|
lineParsers :: [ReadP MdToken]
|
|
|
|
@ -249,7 +266,7 @@ parseLine :: ReadP MdToken
|
|
|
|
|
parseLine = do
|
|
|
|
|
skipSpaces
|
|
|
|
|
-- Fail if we have reached the end of the document.
|
|
|
|
|
parsed <- manyTill parseLineToken eof
|
|
|
|
|
parsed <- myMany1 parseLineToken
|
|
|
|
|
return (Line parsed)
|
|
|
|
|
|
|
|
|
|
-- Parse a paragraph, which is a 'Line' (can span multiple actual lines), separated by double-newlines.
|
|
|
|
|