1 module Rakka.Wiki.Parser
7 import Text.ParserCombinators.Parsec
10 wikiPage :: Parser WikiPage
11 wikiPage = do xs <- many wikiElement
16 wikiElement :: Parser WikiElement
17 wikiElement = ( try (blockElement >>= return . Block)
19 try (inlineElement >>= return . Inline)
23 blockElement :: Parser BlockElement
24 blockElement = ( try header
30 header :: Parser BlockElement
31 header = foldr (<|>) pzero (map (try . header') [1..5])
33 header' :: Int -> Parser BlockElement
34 header' n = do count n (char '=')
35 notFollowedBy (char '=')
37 x <- notFollowedBy (char '=') >> anyChar
38 xs <- manyTill anyChar (try $ ws >> (count n (char '=')))
41 return (Header n (x:xs))
44 emptyLine :: Parser BlockElement
45 emptyLine = newline >> return EmptyLine
48 inlineElement :: Parser InlineElement
52 text :: Parser InlineElement
53 text = do xs <- many1 (noneOf symbols)
54 nl <- option "" (count 1 newline)
55 return $ Text (xs ++ nl)
64 ws = many (oneOf " \t")
68 eol = ( (newline >> return ())