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