------------------------------------------------------------------------------
-- |
-- Module: Xmobar.Text.Ansi
-- Copyright: (c) 2022 Jose Antonio Ortega Ruiz
-- License: BSD3-style (see LICENSE)
--
-- Maintainer: jao@gnu.org
-- Stability: unstable
-- Portability: portable
-- Created: Fri Feb 4, 2022 01:10
--
--
-- Codification with ANSI (color) escape codes
--
------------------------------------------------------------------------------

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"