keyword-args 0.1.0.5 → 0.2.0.1
raw patch · 3 files changed
+37/−29 lines, 3 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
- Data.KeywordArgs.Parse: configParser :: Parser [(String, String)]
+ Data.KeywordArgs.Parse: configParser :: Parser [(String, [String])]
Files
- keyword-args.cabal +1/−1
- src/Data/KeywordArgs/Parse.hs +30/−26
- src/Main.hs +6/−2
keyword-args.cabal view
@@ -1,5 +1,5 @@ name: keyword-args-version: 0.1.0.5+version: 0.2.0.1 synopsis: Extract data from a keyword-args config file format description: Extracts data from a configuration file with keywords
src/Data/KeywordArgs/Parse.hs view
@@ -2,10 +2,13 @@ import Data.Maybe (catMaybes) -import Text.Parsec ((<|>), many, try, manyTill, char, anyChar, many1)+import Text.Parsec+ ((<|>), many, try, lookAhead, manyTill, char, anyChar, many1)+ import Text.Parsec.String (Parser) import Text.ParserCombinators.Parsec.Prim (GenParser)+ import Text.ParserCombinators.Parsec.Char (space, newline, oneOf, noneOf) import Control.Monad (liftM2)@@ -14,40 +17,44 @@ import Control.Applicative ((<*), (*>), (<$>)) --- | Returns a parser for input of a keyword, followed by a space,--- followed by one or more arguments. Any comments (text preceeded--- by a '#') will be ignored until the end of the line.-configParser :: Parser [(String, String)]-configParser = catMaybes <$> many line+configParser :: Parser [(String, [String])]+configParser = catMaybes <$> many lineWithArguments -line :: Parser (Maybe (String, String))-line = comment *> return Nothing <|> Just <$> configurationOption+lineWithArguments :: Parser (Maybe (String, [String]))+lineWithArguments =+ comment *> return Nothing+ <|> newline *> return Nothing+ <|> many1 (oneOf "\t ") *> return Nothing+ <|> Just <$> configurationOptionWithArguments -configurationOption :: Parser (String, String)-configurationOption = do+configurationOptionWithArguments :: Parser (String, [String])+configurationOptionWithArguments = do _ <- many space - keyword <- manyTill1 anyChar keywordArgSeparator- val <- value+ keyword <- manyTill1 (noneOf "\n") keywordArgSeparator - return (keyword, val)+ arguments <- argumentParser -value :: Parser String-value =- unquotedValue <|> quotedValue+ return (keyword, arguments) - where- endOfOption = endOfLineOrInput <|> comment+argumentParser :: Parser [String]+argumentParser =+ manyTill1 (try quotedArgument <|> try unquotedArgument)+ (try endOfLineOrInput <|> try comment) - quotedValue = quote- *> manyTill1 argumentChar quote- <* endOfOption+quotedArgument :: Parser String+quotedArgument =+ many (oneOf " \t") *> quote *> manyTill1 (noneOf "#") quote - unquotedValue = manyTill1 argumentChar endOfOption+unquotedArgument :: Parser String+unquotedArgument =+ many (oneOf " \t") *> many1 (noneOf "\" \t\n#") <*+ (try comment <|> try (oneOf " \t") *> return () <|>+ lookAhead (try endOfLineOrInput)) comment :: Parser () comment =- try (many space *> char '#')+ try (many (oneOf " \t") *> char '#') *> manyTill anyChar endOfLineOrInput *> return () @@ -56,9 +63,6 @@ manyTill1 :: GenParser tok st a -> GenParser tok st end -> GenParser tok st [a] manyTill1 p end = liftM2 (:) p (manyTill p end)--argumentChar :: Parser Char-argumentChar = noneOf "#\"" keywordArgSeparator :: Parser () keywordArgSeparator = many1 (oneOf "\t ") *> return ()
src/Main.hs view
@@ -62,9 +62,12 @@ (_, _, errs) -> ioError (userError (concat errs ++ usageInfo (headerMessage name) options)) -parseConfig :: String -> Either ParseError [(String, String)]+parseConfig :: String -> Either ParseError [(String, [String])] parseConfig = parse configParser "(unknown)" +configToList :: [(String, [String])] -> [[String]]+configToList cfg = map (\line -> fst line : snd line) cfg+ runCheck :: IO () runCheck = do f <- getContents@@ -72,7 +75,8 @@ case parseConfig f of Left e -> ioError $ userError $ "Parse error: " ++ show e - Right config -> putStr $ unpack $ encode config+ Right config ->+ putStr $ unpack $ encode $ configToList config main :: IO () main = do