@@ -25,7 +25,7 @@ module GHRB.Core
2525 ) where
2626
2727import Control.Applicative (many , optional , (<|>) )
28- import Control.Monad (void )
28+ import Control.Monad (void , unless )
2929import qualified Data.ByteString as BS (ByteString )
3030import qualified Data.ByteString.Char8 as BS (pack )
3131import qualified Data.HashSet as Set (insert , member )
@@ -42,7 +42,8 @@ import Distribution.Portage.Types (Category (Category),
4242 getVersion , unwrapCategory ,
4343 unwrapPkgName )
4444import FlatParse.Basic (Parser , Result (OK ), char , eof ,
45- runParser , satisfy , string )
45+ runParser , satisfy , string , anyChar )
46+ import qualified FlatParse.Basic as FP (failed )
4647import GHRB.Core.Types (PackageSet , St (St ), completed ,
4748 downgrade , failed ,
4849 tried , unresolved , untried , installed )
@@ -59,11 +60,24 @@ parsePackageList packageList =
5960parsePackages :: Parser Void PackageSet
6061parsePackages = parsePackage <|> (eof >> return mempty )
6162
63+ stripANSI :: (Char -> Bool ) -> Parser Void String
64+ stripANSI terminator = parseANSI terminator <|> (satisfy terminator >> pure " " ) <|> parseChar terminator
65+
66+ parseChar :: (Char -> Bool ) -> Parser Void String
67+ parseChar terminator = anyChar >>= \ c -> (c : ) <$> stripANSI terminator
68+
69+ parseANSI :: (Char -> Bool ) -> Parser Void String
70+ parseANSI terminator = do
71+ $ (string " \\ [ESC" )
72+ void $ many (satisfy (/= ' m' ))
73+ $ (char ' m' )
74+ stripANSI terminator
75+
6276parsePackage :: Parser Void PackageSet
6377parsePackage = do
6478 category <- many (satisfy (/= ' /' ))
6579 $ (char ' /' )
66- name <- many (satisfy (/= ' \n ' ))
80+ name <- many (satisfy (/= ' \n ' ))
6781 void . optional $ $ (char ' \n ' )
6882 Set. insert
6983 Package
@@ -81,9 +95,9 @@ parseDowngrades = runParser parseDowngradeByLine
8195parseDowngradeByLine :: Parser Void Bool
8296parseDowngradeByLine =
8397 ($ (string " [ebuild" )
84- >> many (satisfy ( `notElem ` " ^\\ []D" ) )
98+ >> stripANSI ( `elem ` " ^\\ []D" )
8599 >> $ (char ' D' )
86- >> many (satisfy ( `notElem ` " ^\\ []" ) )
100+ >> stripANSI ( `elem ` " ^\\ []" )
87101 >> $ (char ' ]' )
88102 >> pure True )
89103 <|> (many (satisfy (/= ' \n ' )) >> $ (char ' \n ' ) >> parseDowngradeByLine)
0 commit comments