{-
Copyright (C) 2021 Dr. Alistair Ward
This file is part of BishBosh.
BishBosh is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
BishBosh is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with BishBosh. If not, see .
-}
{- |
[@AUTHOR@] Dr. Alistair Ward
[@DESCRIPTION@] Defines the encoding of colours for rendering on a terminal; .
-}
module BishBosh.Colour.ANSIColourCode(
-- * Types
-- ** Type-synonyms
-- ANSIColourCode(),
-- IsBold,
GraphicsRendition,
-- * Functions
selectGraphicsRendition,
bracket,
-- ** Constructors
mkFgColourCode,
mkBgColourCode
) where
import qualified BishBosh.Colour.PhysicalColour as Colour.PhysicalColour
import qualified Data.Default
-- | A colour-code as used by terminal-emulators.
newtype ANSIColourCode = MkANSIColourCode {
deconstruct :: Int
}
instance Show ANSIColourCode where
showsPrec precedence MkANSIColourCode { deconstruct = i } = showsPrec precedence i
instance Data.Default.Default ANSIColourCode where
def = MkANSIColourCode 0
-- | The font-weight of a character.
type IsBold = Bool
-- | An escape-sequence used to control a terminal.
type GraphicsRendition = String
-- | Constructor: offset the specified colour-code, so that it applies to the foreground.
mkFgColourCode :: Colour.PhysicalColour.PhysicalColour -> ANSIColourCode
mkFgColourCode = MkANSIColourCode . (+ 30) . fromEnum {-CAVEAT: relies on the PhysicalColour's constructor-order-}
-- | Constructor: offset the specified colour-code, so that it applies to the background.
mkBgColourCode :: Colour.PhysicalColour.PhysicalColour -> ANSIColourCode
mkBgColourCode = MkANSIColourCode . (+ 40) . fromEnum {-CAVEAT: relies on the PhysicalColour's constructor-order-}
-- | Generate the escape-sequence required to change a terminal to the specified physical colour.
selectGraphicsRendition :: IsBold -> ANSIColourCode -> GraphicsRendition
selectGraphicsRendition isBold parameter = showString "\x1b[" . shows parameter $ (if isBold then showString ";1" else id) "m"
-- | Render the specified string according to instructions, then revert to the default.
bracket :: GraphicsRendition -> String -> ShowS
bracket graphicsRendition s = showString graphicsRendition . showString s . showString (
selectGraphicsRendition False Data.Default.def
)