module Rakka.Wiki.Parser ( wikiPage ) where import Rakka.Wiki import Text.ParserCombinators.Parsec wikiPage :: Parser WikiPage wikiPage = do xs <- many wikiElement eof return xs wikiElement :: Parser WikiElement wikiElement = ( try (blockElement >>= return . Block) <|> try (inlineElement >>= return . Inline) ) blockElement :: Parser BlockElement blockElement = ( try header <|> try emptyLine ) header :: Parser BlockElement header = foldr (<|>) pzero (map (try . header') [1..5]) where header' :: Int -> Parser BlockElement header' n = do count n (char '=') notFollowedBy (char '=') ws x <- notFollowedBy (char '=') >> anyChar xs <- manyTill anyChar (try $ ws >> (count n (char '='))) ws eol return (Header n (x:xs)) emptyLine :: Parser BlockElement emptyLine = newline >> return EmptyLine inlineElement :: Parser InlineElement inlineElement = text text :: Parser InlineElement text = do xs <- many1 (noneOf symbols) nl <- option "" (count 1 newline) return $ Text (xs ++ nl) symbols :: [Char] symbols = "\n" -- white space ws :: Parser String ws = many (oneOf " \t") -- end of line eol :: Parser () eol = ( (newline >> return ()) <|> eof )