14c14073ecfe469ec67d549cc8ee45057ea9b0b6
[hs-java.git] / Java / META / Parser.hs
1
2 module Java.META.Parser
3   (parseMetaFile) where
4
5 import qualified Data.Map as M
6 import Text.Parsec
7 import Text.Parsec.String
8
9 import Java.META.Types
10
11 pNewLine :: Parser ()
12 pNewLine = choice $ map try $ [
13               string "\r\n" >> return (),
14               char '\r' >> return (),
15               char '\n' >> return () ]
16
17 blankline :: Parser ()
18 blankline = do
19   pNewLine <?> "first newline in blankline"
20   return ()
21
22 pSection :: Parser Section
23 pSection = do
24   list <- many1 pHeader
25   blankline <?> "blank line"
26   return $ M.fromList list
27
28 pHeader :: Parser (String, String) 
29 pHeader = do
30     name <- many1 headerChar <?> "header name"
31     char ':'
32     value <- pValue
33     return (name, value)
34   where
35     headerChar = oneOf "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
36
37 pValue :: Parser String
38 pValue = do
39   list <- manyLines
40   return (concat list)
41
42 manyLines :: Parser [String]
43 manyLines = do
44   char ' '
45   many space
46   s <- many1 (noneOf "\n\r\0")
47   pNewLine <?> "new line at end of value line"
48   c <- lookAhead anyChar
49   if c == ' '
50     then do
51          next <- manyLines
52          return (s: next)
53     else return [s]
54
55 pMETA :: Parser META
56 pMETA = many1 pSection
57
58 parseMetaFile :: FilePath -> IO (Either ParseError META)
59 parseMetaFile path = do
60   str <- readFile path
61   return $ parse pMETA path (str ++ "\n\n")