module Text.Paint
( Color(..)
, Flag(..)
, Paint(..)
, paint
) where
import Data.List (intercalate)
data Color
= Black
| Maroon
| Green
| Olive
| Navy
| Purple
| Teal
| Silver
| Gray
| Red
| Lime
| Yellow
| Blue
| Fuchsia
| Aqua
| White
| Default
deriving (Eq, Ord, Enum, Show)
data Flag
= Bold
| Underline
| Blink
deriving (Eq, Ord, Show)
data Paint
= Paint Color Color [Flag]
deriving (Eq, Ord, Show)
flagCode
:: Flag
-> Int
flagCode Bold = 1
flagCode Underline = 4
flagCode Blink = 5
fgCode
:: Color
-> Int
fgCode Black = 30
fgCode Maroon = 31
fgCode Green = 32
fgCode Olive = 33
fgCode Navy = 34
fgCode Purple = 35
fgCode Teal = 36
fgCode Silver = 37
fgCode Default = 39
fgCode Gray = 90
fgCode Red = 91
fgCode Lime = 92
fgCode Yellow = 93
fgCode Blue = 94
fgCode Fuchsia = 95
fgCode Aqua = 96
fgCode White = 97
bgCode
:: Color
-> Int
bgCode Black = 40
bgCode Maroon = 41
bgCode Green = 42
bgCode Olive = 43
bgCode Navy = 44
bgCode Purple = 45
bgCode Teal = 46
bgCode Silver = 47
bgCode Default = 49
bgCode Gray = 100
bgCode Red = 101
bgCode Lime = 102
bgCode Yellow = 103
bgCode Blue = 104
bgCode Fuchsia = 105
bgCode Aqua = 106
bgCode White = 107
translate
:: Paint
-> String
translate (Paint fg bg flags) = concat ["\x1b[", codes, "m"]
where
codes = intercalate ";" $ map show codes'
codes' = map flagCode flags ++ [fgCode fg] ++ [bgCode bg]
paint
:: Paint
-> String
-> String
paint pnt text = concat [translate pnt, text, "\x1b[0m"]