{-# LANGUAGE CPP #-}
{-# LANGUAGE OverloadedStrings #-}
module Data.Text.ANSI
(
black
, red
, green
, yellow
, blue
, magenta
, cyan
, white
, brightBlack
, brightRed
, brightGreen
, brightYellow
, brightBlue
, brightMagenta
, brightCyan
, brightWhite
, rgb
, blackBg
, redBg
, greenBg
, yellowBg
, blueBg
, magentaBg
, cyanBg
, whiteBg
, brightBlackBg
, brightRedBg
, brightGreenBg
, brightYellowBg
, brightBlueBg
, brightMagentaBg
, brightCyanBg
, brightWhiteBg
, rgbBg
, bold
, faint
, italic
, underline
, doubleUnderline
, strikethrough
, frame
, encircle
, overline
) where
#if !MIN_VERSION_base(4,13,0)
import Data.Semigroup ((<>))
#endif
import Data.Text
import Data.Text.Lazy.Builder (Builder)
import Data.Word (Word8)
import Foreign.C (CInt(CInt))
import System.IO.Unsafe (unsafePerformIO)
import qualified Data.Text.Lazy as Text.Lazy
import qualified Data.Text.Lazy.Builder as Builder
import qualified Data.Text.Lazy.Builder.Int as Builder
{-# INLINABLE black #-}
{-# INLINABLE red #-}
{-# INLINABLE green #-}
{-# INLINABLE yellow #-}
{-# INLINABLE blue #-}
{-# INLINABLE magenta #-}
{-# INLINABLE cyan #-}
{-# INLINABLE white #-}
{-# INLINABLE brightBlack #-}
{-# INLINABLE brightRed #-}
{-# INLINABLE brightGreen #-}
{-# INLINABLE brightYellow #-}
{-# INLINABLE brightBlue #-}
{-# INLINABLE brightMagenta #-}
{-# INLINABLE brightCyan #-}
{-# INLINABLE brightWhite #-}
{-# INLINABLE blackBg #-}
{-# INLINABLE redBg #-}
{-# INLINABLE greenBg #-}
{-# INLINABLE yellowBg #-}
{-# INLINABLE blueBg #-}
{-# INLINABLE magentaBg #-}
{-# INLINABLE cyanBg #-}
{-# INLINABLE whiteBg #-}
{-# INLINABLE brightBlackBg #-}
{-# INLINABLE brightRedBg #-}
{-# INLINABLE brightGreenBg #-}
{-# INLINABLE brightYellowBg #-}
{-# INLINABLE brightBlueBg #-}
{-# INLINABLE brightMagentaBg #-}
{-# INLINABLE brightCyanBg #-}
{-# INLINABLE brightWhiteBg #-}
black, red, green, yellow, blue, magenta, cyan, white, brightBlack, brightRed,
brightGreen, brightYellow, brightBlue, brightMagenta, brightCyan,
brightWhite, blackBg, redBg, greenBg,
yellowBg, blueBg, magentaBg, cyanBg,
whiteBg, brightBlackBg, brightRedBg,
brightGreenBg, brightYellowBg, brightBlueBg,
brightMagentaBg, brightCyanBg,
brightWhiteBg :: Text -> Text
black :: Text -> Text
black = Builder -> Builder -> Text -> Text
surround Builder
"30" Builder
"39"
red :: Text -> Text
red = Builder -> Builder -> Text -> Text
surround Builder
"31" Builder
"39"
green :: Text -> Text
green = Builder -> Builder -> Text -> Text
surround Builder
"32" Builder
"39"
yellow :: Text -> Text
yellow = Builder -> Builder -> Text -> Text
surround Builder
"33" Builder
"39"
blue :: Text -> Text
blue = Builder -> Builder -> Text -> Text
surround Builder
"34" Builder
"39"
magenta :: Text -> Text
magenta = Builder -> Builder -> Text -> Text
surround Builder
"35" Builder
"39"
cyan :: Text -> Text
cyan = Builder -> Builder -> Text -> Text
surround Builder
"36" Builder
"39"
white :: Text -> Text
white = Builder -> Builder -> Text -> Text
surround Builder
"37" Builder
"39"
brightBlack :: Text -> Text
brightBlack = Builder -> Builder -> Text -> Text
surround Builder
"90" Builder
"39"
brightRed :: Text -> Text
brightRed = Builder -> Builder -> Text -> Text
surround Builder
"91" Builder
"39"
brightGreen :: Text -> Text
brightGreen = Builder -> Builder -> Text -> Text
surround Builder
"92" Builder
"39"
brightYellow :: Text -> Text
brightYellow = Builder -> Builder -> Text -> Text
surround Builder
"93" Builder
"39"
brightBlue :: Text -> Text
brightBlue = Builder -> Builder -> Text -> Text
surround Builder
"94" Builder
"39"
brightMagenta :: Text -> Text
brightMagenta = Builder -> Builder -> Text -> Text
surround Builder
"95" Builder
"39"
brightCyan :: Text -> Text
brightCyan = Builder -> Builder -> Text -> Text
surround Builder
"96" Builder
"39"
brightWhite :: Text -> Text
brightWhite = Builder -> Builder -> Text -> Text
surround Builder
"97" Builder
"39"
blackBg :: Text -> Text
blackBg = Builder -> Builder -> Text -> Text
surround Builder
"40" Builder
"49"
redBg :: Text -> Text
redBg = Builder -> Builder -> Text -> Text
surround Builder
"41" Builder
"49"
greenBg :: Text -> Text
greenBg = Builder -> Builder -> Text -> Text
surround Builder
"42" Builder
"49"
yellowBg :: Text -> Text
yellowBg = Builder -> Builder -> Text -> Text
surround Builder
"43" Builder
"49"
blueBg :: Text -> Text
blueBg = Builder -> Builder -> Text -> Text
surround Builder
"44" Builder
"49"
magentaBg :: Text -> Text
magentaBg = Builder -> Builder -> Text -> Text
surround Builder
"45" Builder
"49"
cyanBg :: Text -> Text
cyanBg = Builder -> Builder -> Text -> Text
surround Builder
"46" Builder
"49"
whiteBg :: Text -> Text
whiteBg = Builder -> Builder -> Text -> Text
surround Builder
"47" Builder
"49"
brightBlackBg :: Text -> Text
brightBlackBg = Builder -> Builder -> Text -> Text
surround Builder
"100" Builder
"49"
brightRedBg :: Text -> Text
brightRedBg = Builder -> Builder -> Text -> Text
surround Builder
"101" Builder
"49"
brightGreenBg :: Text -> Text
brightGreenBg = Builder -> Builder -> Text -> Text
surround Builder
"102" Builder
"49"
brightYellowBg :: Text -> Text
brightYellowBg = Builder -> Builder -> Text -> Text
surround Builder
"103" Builder
"49"
brightBlueBg :: Text -> Text
brightBlueBg = Builder -> Builder -> Text -> Text
surround Builder
"104" Builder
"49"
brightMagentaBg :: Text -> Text
brightMagentaBg = Builder -> Builder -> Text -> Text
surround Builder
"105" Builder
"49"
brightCyanBg :: Text -> Text
brightCyanBg = Builder -> Builder -> Text -> Text
surround Builder
"106" Builder
"49"
brightWhiteBg :: Text -> Text
brightWhiteBg = Builder -> Builder -> Text -> Text
surround Builder
"107" Builder
"49"
{-# INLINABLE rgb #-}
rgb :: Word8 -> Word8 -> Word8 -> Text -> Text
rgb :: Word8 -> Word8 -> Word8 -> Text -> Text
rgb Word8
r Word8
g Word8
b =
Builder -> Builder -> Text -> Text
surround
(Builder
"38;2;" Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word8 -> Builder
forall a. Integral a => a -> Builder
Builder.decimal Word8
r Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Builder
semi Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word8 -> Builder
forall a. Integral a => a -> Builder
Builder.decimal Word8
g Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Builder
semi Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word8 -> Builder
forall a. Integral a => a -> Builder
Builder.decimal Word8
b)
Builder
"39"
{-# INLINABLE rgbBg #-}
rgbBg :: Word8 -> Word8 -> Word8 -> Text -> Text
rgbBg :: Word8 -> Word8 -> Word8 -> Text -> Text
rgbBg Word8
r Word8
g Word8
b =
Builder -> Builder -> Text -> Text
surround
(Builder
"48;2;" Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word8 -> Builder
forall a. Integral a => a -> Builder
Builder.decimal Word8
r Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Builder
semi Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word8 -> Builder
forall a. Integral a => a -> Builder
Builder.decimal Word8
g Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Builder
semi Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<>
Word8 -> Builder
forall a. Integral a => a -> Builder
Builder.decimal Word8
b)
Builder
"49"
{-# INLINABLE bold #-}
{-# INLINABLE faint #-}
{-# INLINABLE italic #-}
{-# INLINABLE underline #-}
{-# INLINABLE doubleUnderline #-}
{-# INLINABLE strikethrough #-}
{-# INLINABLE frame #-}
{-# INLINABLE encircle #-}
{-# INLINABLE overline #-}
bold, faint, italic, underline, doubleUnderline, strikethrough, frame,
encircle, overline :: Text -> Text
bold :: Text -> Text
bold = Builder -> Builder -> Text -> Text
surround Builder
"1" Builder
"22"
faint :: Text -> Text
faint = Builder -> Builder -> Text -> Text
surround Builder
"2" Builder
"22"
italic :: Text -> Text
italic = Builder -> Builder -> Text -> Text
surround Builder
"3" Builder
"32"
underline :: Text -> Text
underline = Builder -> Builder -> Text -> Text
surround Builder
"4" Builder
"24"
doubleUnderline :: Text -> Text
doubleUnderline = Builder -> Builder -> Text -> Text
surround Builder
"21" Builder
"24"
strikethrough :: Text -> Text
strikethrough = Builder -> Builder -> Text -> Text
surround Builder
"9" Builder
"29"
frame :: Text -> Text
frame = Builder -> Builder -> Text -> Text
surround Builder
"51" Builder
"54"
encircle :: Text -> Text
encircle = Builder -> Builder -> Text -> Text
surround Builder
"52" Builder
"54"
overline :: Text -> Text
overline = Builder -> Builder -> Text -> Text
surround Builder
"53" Builder
"55"
{-# NOINLINE [1] surround #-}
surround :: Builder -> Builder -> Text -> Text
surround :: Builder -> Builder -> Text -> Text
surround Builder
open Builder
close Text
text
| Bool
isatty = Text -> Text
Text.Lazy.toStrict (Builder -> Text
Builder.toLazyText (Builder
esc Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
open Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
m Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Text -> Builder
Builder.fromText Text
text Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
esc Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
close Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
m))
| Bool
otherwise = Text
text
esc :: Builder
esc :: Builder
esc = Builder
"\ESC["
m, semi :: Builder
m :: Builder
m = Char -> Builder
Builder.singleton Char
'm'
semi :: Builder
semi = Char -> Builder
Builder.singleton Char
';'
{-# NOINLINE isatty #-}
isatty :: Bool
isatty :: Bool
isatty =
IO CInt -> CInt
forall a. IO a -> a
unsafePerformIO (CInt -> IO CInt
c_isatty CInt
1) CInt -> CInt -> Bool
forall a. Eq a => a -> a -> Bool
== CInt
1
foreign import ccall unsafe "isatty"
c_isatty :: CInt -> IO CInt
{-# RULES
"surround/surround" [~1]
forall a b c d s.
surround a b (surround c d s) =
surround (a <> semi <> c) (b <> semi <> d) s
#-}