]> gitweb @ CieloNegro.org - Rakka.git/blob - Rakka/Wiki/Parser.hs
b5ec74d509f9ec8e2f840bbf8f9851499e0a1406
[Rakka.git] / Rakka / Wiki / Parser.hs
1 module Rakka.Wiki.Parser
2     ( wikiPage
3     )
4     where
5
6 import           Rakka.Wiki
7 import           Text.ParserCombinators.Parsec
8
9
10 wikiPage :: Parser WikiPage
11 wikiPage = do xs <- many wikiElement
12               eof
13               return xs
14
15
16 wikiElement :: Parser WikiElement
17 wikiElement = ( try (blockElement >>= return . Block)
18                 <|>
19                 try (inlineElement >>= return . Inline)
20               )
21
22
23 blockElement :: Parser BlockElement
24 blockElement = ( try header
25                  <|>
26                  try emptyLine
27                )
28
29
30 header :: Parser BlockElement
31 header = foldr (<|>) pzero (map (try . header') [1..5])
32     where
33       header' :: Int -> Parser BlockElement
34       header' n = do count n (char '=')
35                      notFollowedBy (char '=')
36                      ws
37                      x  <- notFollowedBy (char '=') >> anyChar
38                      xs <- manyTill anyChar (try $ ws >> (count n (char '=')))
39                      ws
40                      eol
41                      return (Header n (x:xs))
42
43
44 emptyLine :: Parser BlockElement
45 emptyLine = newline >> return EmptyLine
46
47
48 inlineElement :: Parser InlineElement
49 inlineElement = text
50
51
52 text :: Parser InlineElement
53 text = do xs <- many1 (noneOf symbols)
54           nl <- option "" (count 1 newline)
55           return $ Text (xs ++ nl)
56
57
58 symbols :: [Char]
59 symbols = "\n"
60
61
62 -- white space
63 ws :: Parser String
64 ws = many (oneOf " \t")
65
66 -- end of line
67 eol :: Parser ()
68 eol = ( (newline >> return ())
69         <|>
70         eof
71       )