module Xmobar.Text.Ansi (withAnsiColor) where
import Data.List (intercalate)
import Data.Char (toLower)
asInt :: String -> String
asInt :: String -> String
asInt String
x = case (ReadS Integer
forall a. Read a => ReadS a
reads ReadS Integer -> ReadS Integer
forall a b. (a -> b) -> a -> b
$ String
"0x" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
x) :: [(Integer, String)] of
[(Integer
v, String
"") ] -> Integer -> String
forall a. Show a => a -> String
show Integer
v
[(Integer, String)]
_ -> String
""
namedColor :: String -> String
namedColor :: String -> String
namedColor String
c =
case (Char -> Char) -> String -> String
forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower String
c of
String
"black" -> String
"0"; String
"red" -> String
"1"; String
"green" -> String
"2"; String
"yellow" -> String
"3"; String
"blue" -> String
"4";
String
"magenta" -> String
"5"; String
"cyan" -> String
"6"; String
"white" -> String
"7";
String
"brightblack" -> String
"8"; String
"brightred" -> String
"9"; String
"brightgreen" -> String
"10";
String
"brightyellow" -> String
"11"; String
"brightblue" -> String
"12";
String
"brightmagenta" -> String
"13"; String
"brightcyan" -> String
"14"; String
"brightwhite" -> String
"15";
String
_ -> String
""
ansiCode :: String -> String
ansiCode :: String -> String
ansiCode (Char
'#':Char
r:Char
g:[Char
b]) = String -> String
ansiCode [Char
'#', Char
'0', Char
r, Char
'0', Char
g, Char
'0', Char
b]
ansiCode (Char
'#':Char
r0:Char
r1:Char
g0:Char
g1:Char
b0:[Char
b1]) =
String
"2;" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate String
";" ((String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map String -> String
asInt [[Char
r0,Char
r1], [Char
g0,Char
g1], [Char
b0,Char
b1]])
ansiCode (Char
'#':String
n) = String -> String
ansiCode String
n
ansiCode String
c = String
"5;" String -> String -> String
forall a. [a] -> [a] -> [a]
++ if String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
i then String -> String
namedColor String
c else String
i where i :: String
i = String -> String
asInt String
c
withAnsiColor :: (String, String) -> String -> String
withAnsiColor :: (String, String) -> String -> String
withAnsiColor (String
fg, String
bg) String
s = String -> String -> String -> String
wrap String
"38;" String
fg (String -> String -> String -> String
wrap String
"48;" String
bg String
s)
where wrap :: String -> String -> String -> String
wrap String
cd String
cl String
w =
if String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
cl
then String
w
else String
"\x1b[" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
cd String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
ansiCode String
cl String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"m" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
w String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\x1b[0m"