safe-coloured-text 0.0.0.0 → 0.1.0.0
raw patch · 5 files changed
+27/−62 lines, 5 filesdep +validitydep +validity-bytestringdep +validity-textdep −terminfoPVP ok
version bump matches the API change (PVP)
Dependencies added: validity, validity-bytestring, validity-text
Dependencies removed: terminfo
API changes (from Hackage documentation)
- Text.Colour: getTerminalCapabilitiesFromEnv :: IO TerminalCapabilities
- Text.Colour: getTerminalCapabilitiesFromHandle :: Handle -> IO TerminalCapabilities
- Text.Colour: hPutChunks :: Handle -> [Chunk] -> IO ()
- Text.Colour: putChunks :: [Chunk] -> IO ()
- Text.Colour.Capabilities: getTerminalCapabilitiesFromEnv :: IO TerminalCapabilities
- Text.Colour.Capabilities: getTerminalCapabilitiesFromHandle :: Handle -> IO TerminalCapabilities
+ Text.Colour.Chunk: instance Data.Validity.Validity Text.Colour.Chunk.Chunk
+ Text.Colour.Chunk: instance Data.Validity.Validity Text.Colour.Chunk.Colour
+ Text.Colour.Code: instance Data.Validity.Validity Text.Colour.Code.CSI
+ Text.Colour.Code: instance Data.Validity.Validity Text.Colour.Code.ColourIntensity
+ Text.Colour.Code: instance Data.Validity.Validity Text.Colour.Code.ConsoleIntensity
+ Text.Colour.Code: instance Data.Validity.Validity Text.Colour.Code.ConsoleLayer
+ Text.Colour.Code: instance Data.Validity.Validity Text.Colour.Code.SGR
+ Text.Colour.Code: instance Data.Validity.Validity Text.Colour.Code.TerminalColour
+ Text.Colour.Code: instance Data.Validity.Validity Text.Colour.Code.Underlining
Files
- safe-coloured-text.cabal +4/−2
- src/Text/Colour.hs +0/−20
- src/Text/Colour/Capabilities.hs +0/−39
- src/Text/Colour/Chunk.hs +6/−1
- src/Text/Colour/Code.hs +17/−0
safe-coloured-text.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack name: safe-coloured-text-version: 0.0.0.0+version: 0.1.0.0 synopsis: Safely output coloured text category: User Interfaces homepage: https://github.com/NorfairKing/safe-coloured-text#readme@@ -34,6 +34,8 @@ build-depends: base >=4.7 && <5 , bytestring- , terminfo , text+ , validity+ , validity-bytestring+ , validity-text default-language: Haskell2010
src/Text/Colour.hs view
@@ -72,12 +72,8 @@ -- * IO TerminalCapabilities (..),- getTerminalCapabilitiesFromEnv,- getTerminalCapabilitiesFromHandle, -- ** Outputting chunks directly- putChunks,- hPutChunks, putChunksWith, hPutChunksWith, )@@ -87,22 +83,6 @@ import System.IO import Text.Colour.Capabilities import Text.Colour.Chunk---- | Print a list of chunks to 'stdout'.------ This function will use 'getTerminalCapabilitiesHandle' on 'stdout'.--- If you intend to use this function more than once, it is more efficient to use 'getTerminalCapabilitiesFromEnv' first and then use 'putChunksWith'.-putChunks :: [Chunk] -> IO ()-putChunks = hPutChunks stdout---- | Print a list of chunks to the given 'Handle'------ This function will use 'getTerminalCapabilitiesHandle' on the given handle.--- If you intend to use this function more than once, it is more efficient to use 'getTerminalCapabilitiesHandle' first and then use 'hPutChunksWith'.-hPutChunks :: Handle -> [Chunk] -> IO ()-hPutChunks h cs = do- tc <- getTerminalCapabilitiesFromHandle h- hPutChunksWith tc h cs -- | Print a list of chunks to stdout with given 'TerminalCapabilities'. putChunksWith :: TerminalCapabilities -> [Chunk] -> IO ()
src/Text/Colour/Capabilities.hs view
@@ -3,11 +3,7 @@ module Text.Colour.Capabilities where -import Control.Exception import GHC.Generics (Generic)-import qualified System.Console.Terminfo as Terminfo-import System.Environment (lookupEnv)-import System.IO -- Note that the order of these constructors matters! data TerminalCapabilities@@ -20,38 +16,3 @@ | -- | All 24-bit colours With24BitColours deriving (Show, Eq, Ord, Generic)---- | Try to detect how many colours the terminal can handle.------ This is based on the @colors@ capability of the terminfo detected based on the @TERM@ environment variable.--- If the terminal can handle 8-bit colours and also has the @COLORTERM@ environment variable set to @24bit@ or @truecolor@, then this function will return 'With24BitColours'.-getTerminalCapabilitiesFromEnv :: IO TerminalCapabilities-getTerminalCapabilitiesFromEnv = do- mTerm <- (Just <$> Terminfo.setupTermFromEnv) `catch` (\(_ :: Terminfo.SetupTermError) -> pure Nothing)- case mTerm of- Nothing -> pure WithoutColours- Just term -> do- -- To support 24-bit colour:- -- https://unix.stackexchange.com/questions/450365/check-if-terminal-supports-24-bit-true-color- mct <- lookupEnv "COLORTERM"- pure $ case mct of- Just "truecolor" -> With24BitColours- Just "24bit" -> With24BitColours- _ ->- case Terminfo.getCapability term (Terminfo.tiGetNum "colors") of- Nothing -> WithoutColours- Just c- | c > 256 -> With24BitColours- | c >= 256 -> With8BitColours- | c >= 8 -> With8Colours- | otherwise -> WithoutColours---- | Try to detect how many colours a given handle can handle.------ This function does the same as 'getTerminalCapabilitiesFromEnv' but returns 'WithoutColours' is not a terminal device.-getTerminalCapabilitiesFromHandle :: Handle -> IO TerminalCapabilities-getTerminalCapabilitiesFromHandle h = do- isTerm <- hIsTerminalDevice h- if isTerm- then getTerminalCapabilitiesFromEnv- else pure WithoutColours
src/Text/Colour/Chunk.hs view
@@ -12,6 +12,7 @@ import Data.String import Data.Text (Text) import qualified Data.Text.Encoding as TE+import Data.Validity import Data.Word import GHC.Generics (Generic) import Text.Colour.Capabilities@@ -27,6 +28,8 @@ } deriving (Show, Eq, Generic) +instance Validity Chunk+ instance IsString Chunk where fromString = chunk . fromString @@ -80,7 +83,7 @@ chunkBackground >>= colourSGR tc Background ] --- Turn a text into a plain chunk, without any styling+-- | Turn a text into a plain chunk, without any styling chunk :: Text -> Chunk chunk t = Chunk@@ -119,6 +122,8 @@ | Colour8Bit !Word8 -- The 8-bit colour | Colour24Bit !Word8 !Word8 !Word8 deriving (Show, Eq, Generic)++instance Validity Colour colourSGR :: TerminalCapabilities -> ConsoleLayer -> Colour -> Maybe SGR colourSGR tc layer =
src/Text/Colour/Code.hs view
@@ -9,6 +9,9 @@ import qualified Data.ByteString.Internal as SBI import qualified Data.ByteString.Lazy as LB import Data.List+import Data.Validity+import Data.Validity.ByteString ()+import Data.Validity.Text () import Data.Word import GHC.Generics (Generic) @@ -26,6 +29,8 @@ = SGR [SGR] deriving (Show, Eq, Generic) +instance Validity CSI+ -- | Render a CSI directly to bytestring. -- You probably want to use 'renderCSI' instead. -- This is just for testing.@@ -60,6 +65,8 @@ !Word8 -- Blue deriving (Show, Eq, Generic) +instance Validity SGR+ csiParamsToWords :: [Word8] -> Builder csiParamsToWords = mconcat . intersperse (SBB.word8 csiDelimiter) . map csiParamToWord @@ -117,6 +124,8 @@ | NoUnderline deriving (Show, Eq, Generic, Bounded, Enum) +instance Validity Underlining+ -- | ANSI general console intensity: usually treated as setting the font style -- (e.g. 'BoldIntensity' causes text to be bold) data ConsoleIntensity@@ -125,18 +134,24 @@ | NormalIntensity deriving (Show, Eq, Generic, Bounded, Enum) +instance Validity ConsoleIntensity+ -- | ANSI's standard colours come in two intensities data ColourIntensity = Dull | Bright deriving (Show, Eq, Generic, Enum, Bounded) +instance Validity ColourIntensity+ -- | ANSI colours can be set on two different layers data ConsoleLayer = Foreground | Background deriving (Show, Eq, Generic, Enum, Bounded) +instance Validity ConsoleLayer+ data TerminalColour = Black | Red@@ -147,6 +162,8 @@ | Cyan | White deriving (Show, Eq, Generic, Enum, Bounded)++instance Validity TerminalColour terminalColourSGRParameter :: TerminalColour -> Word8 terminalColourSGRParameter = \case