diff options
| -rw-r--r-- | Parsers.hs | 102 | 
1 files changed, 46 insertions, 56 deletions
| @@ -12,18 +12,16 @@  --  ----------------------------------------------------------------------------- -module Parsers ( -               -- * Parsing -               -- $parser -               parseString -               , stringParser -               , defaultColors -               , colorsAndText -               , templateStringParser -               , templateCommandParser -               , templateParser -               , parseTemplate -               ) where +module Parsers +    ( parseString +    , stringParser +    , colorParser +    , colorsAndText +    , templateStringParser +    , templateCommandParser +    , templateParser +    , parseTemplate +    ) where  import Config  import Commands @@ -31,28 +29,20 @@ import Runnable  import Text.ParserCombinators.Parsec  import qualified Data.Map as Map - -{- $parser -These are the neede parsers. Don't trust them too much. - -There are parsers for the commands output and parsers for the -formatting template. - -} - --- | Runs the actual string parsers +-- | Runs the string parser  parseString :: Config -> String -> IO [(String, String)]  parseString c s = -    case (parse (stringParser c) "" s) of +    case parse (stringParser c) "" s of        Left  _ -> return [("Could not parse string: " ++ s, fgColor c)]        Right x -> return (concat x)  -- | Gets the string and combines the needed parsers  stringParser :: Config -> Parser [[(String, String)]] -stringParser c = manyTill (defaultColors c) eof +stringParser = flip manyTill eof . colorParser  -- | Parses a string with the default color (no color set) -defaultColors :: Config -> Parser [(String, String)] -defaultColors c = do +colorParser :: Config -> Parser [(String, String)] +colorParser c = do    s <- manyTill anyChar (tryString "<fc" <|> endOfLine "")    n <- colorsAndText <|> endOfLine ("","")    return [(s,fgColor c),n] @@ -60,58 +50,58 @@ defaultColors c = do  -- | Parses a string with a color set  colorsAndText :: Parser (String, String)  colorsAndText = do -  string "=" -  c <- colorSpec -  string ">" +  c <- inside (string "=") colors (string ">")    s <- manyTill anyChar (tryString "</fc>")    return (s,c) -endOfLine :: a -> Parser a -endOfLine r = eof >> return r - -tryString :: String -> Parser String -tryString = try . string -  -- | Parses a color specification (hex or named) -colorSpec :: Parser String -colorSpec = many1 (alphaNum <|> char ',' <|> char '#') +colors :: Parser String +colors = many1 (alphaNum <|> char ',' <|> char '#')  -- | Parses the output template string  templateStringParser :: Config -> Parser (String,String,String)  templateStringParser c = do -  s         <- many $ noneOf (sepChar c) -  (com,_,_) <- templateCommandParser  c -  ss        <- many $ noneOf (sepChar c) +  s   <- allTillSep c +  com <- templateCommandParser c +  ss  <- allTillSep c    return (com, s, ss)  -- | Parses the command part of the template string -templateCommandParser :: Config -> Parser (String,String,String) -templateCommandParser c = do -  let chr = head $ sepChar c -  char chr -  com <- many $ noneOf (sepChar c) -  char chr -  return $ (com,"","") +templateCommandParser :: Config -> Parser String +templateCommandParser c = +  let chr = char . head . sepChar +  in  inside (chr c) (allTillSep c) (chr c)  -- | Combines the template parsers  templateParser :: Config -> Parser [(String,String,String)] -templateParser c = many (templateStringParser c) +templateParser = many . templateStringParser  -- | Actually runs the template parsers  parseTemplate :: Config -> String -> IO [(Runnable,String,String)] -parseTemplate config s = -    do str <- case (parse (templateParser config) "" s) of +parseTemplate c s = +    do str <- case (parse (templateParser c) "" s) of                  Left _  -> return [("","","")]                  Right x -> return x -       let comList = map alias (commands config) -           m       = Map.fromList $ zip comList (commands config) -       return $ combine config m str +       let cl = map alias (commands c) +           m  = Map.fromList $ zip cl (commands c) +       return $ combine c m str  -- | Given a finite "Map" and a parsed templatet produces the  -- | resulting output string.  combine :: Config -> Map.Map String Runnable -> [(String, String, String)] -> [(Runnable,String,String)]  combine _ _ [] = [] -combine config m ((ts,s,ss):xs) = -    [(com, s, ss)] ++ combine config m xs -        where com  = Map.findWithDefault dflt ts m -              dflt = Run $ Com ts [] [] 10 +combine c m ((ts,s,ss):xs) = (com, s, ss) : combine c m xs +    where com  = Map.findWithDefault dflt ts m +          dflt = Run $ Com ts [] [] 10 + +endOfLine :: a -> Parser a +endOfLine r = eof >> return r + +tryString :: String -> Parser String +tryString = try . string + +allTillSep :: Config -> Parser String +allTillSep = many . noneOf . sepChar + +inside :: Parser a -> Parser b -> Parser c -> Parser b +inside pa pb pc = pa >> pb >>= \r -> pc >> return r | 
