wikiParser :: Parser Document
wikiParser = many1 pMain
+firstInLineChars = "#*="
+
pPara :: Parser Markup
-pPara = count 2 pEol >> return (Paragraph)
+pPara = do
+ count 2 pEol
+ notFollowedBy $ oneOf firstInLineChars
+ return (Paragraph)
pLink :: Parser Markup
pLink = do
pListItem :: Bool -> Parser [Markup]
pListItem enum = do
- many1 pEol
+ pEol
char $ listToken enum
- many pOneLine
+ many (pOneLine <|> try (pOneEol))
+
+pOneEol = do
+ c <- pEol
+ notFollowedBy (oneOf $ firstInLineChars++"\r\n")
+ return c
listToken True = '#'
listToken False = '*'
pHeading :: Parser Markup
pHeading = do
- many1 pEol
+ pEol
level <- many1 $ char '='
s <- pStopAt level
return (Heading (length level) s)