skylighting-format-ansi (empty) → 0.1
raw patch · 4 files changed
+479/−0 lines, 4 filesdep +ansi-terminaldep +basedep +binary
Dependencies added: ansi-terminal, base, binary, colour, containers, skylighting-core, text
Files
- LICENSE +30/−0
- README.md +5/−0
- skylighting-format-ansi.cabal +39/−0
- src/Skylighting/Format/ANSI.hs +405/−0
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright (c) 2016-2018, John MacFarlane.+All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are+met:++ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.++ * Redistributions in binary form must reproduce the above+ copyright notice, this list of conditions and the following+ disclaimer in the documentation and/or other materials provided+ with the distribution.++ * The names of the contributors may not be used to endorse or+ promote products derived from this software without specific+ prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ README.md view
@@ -0,0 +1,5 @@+# skylighting-format-ansi++This package provides functions to render syntax-highlighting+as ANSI text.+
+ skylighting-format-ansi.cabal view
@@ -0,0 +1,39 @@+name: skylighting-format-ansi+version: 0.1+synopsis: ANSI formatter for skylighting syntax highlighting library+description: This module allows tokens produced by skylighting-core+ to be rendered as ANSI colored text.+homepage: https://github.com/jgm/skylighting+license: BSD3+license-file: LICENSE+author: John MacFarlane+maintainer: jgm@berkeley.edu+copyright: (C) 2016-2022 John MacFarlane+category: Text+build-type: Simple+extra-source-files: README.md++cabal-version: >=1.10++source-repository head+ type: git+ location: https://github.com/jgm/skylighting.git++library+ exposed-modules: Skylighting.Format.ANSI+ other-extensions: CPP+ build-depends: base >= 4.8 && < 5.0,+ skylighting-core,+ text,+ containers,+ binary,+ ansi-terminal >= 0.7,+ colour >= 2.0+ hs-source-dirs: src+ ghc-prof-options: -fprof-auto-exported+ default-language: Haskell2010+ ghc-options: -Wall+ if impl(ghc >= 8.4)+ ghc-options: -fhide-source-paths+ if impl(ghc >= 8.10)+ ghc-options: -Wunused-packages
+ src/Skylighting/Format/ANSI.hs view
@@ -0,0 +1,405 @@+{-# OPTIONS_GHC -fno-warn-orphans #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+module Skylighting.Format.ANSI (+ formatANSI+ ) where+import Data.Data+import GHC.Generics+import Data.Int+import Data.Word+import Data.Binary+import Data.Ord+import Data.List+import Control.Monad (mplus)+import qualified Data.Map as Map+import Data.Maybe (fromMaybe, isNothing, maybeToList)+import Data.Text (Text)+import qualified Data.Text as Text+import Skylighting.Types+import qualified System.Console.ANSI.Codes as ANSI+#if !MIN_VERSION_base(4,11,0)+import Data.Semigroup+#endif++formatANSI :: FormatOptions -> Style -> [SourceLine] -> Text+formatANSI opts sty = (beforeText <>)+ . (<> afterText)+ . Text.intercalate (Text.singleton '\n')+ . zipWith (sourceLineToANSI opts sty) [startNum..]+ where beforeText = ansiResetText <> ansiStyleText clv (defaultColor sty) (backgroundColor sty) False False False+ afterText = ansiResetText+ startNum = LineNo $ startNumber opts+ clv = ansiColorLevel opts++sourceLineToANSI :: FormatOptions -> Style -> LineNo -> SourceLine -> Text+sourceLineToANSI opts sty lno = prependLineNoText+ . mconcat+ . map (tokenToANSI clv sty)+ where prependLineNoText = if numberLines opts+ then (lineNoText <>)+ else id+ lineNoText = ansiStyleText clv lineNoFgc lineNoBgc False False False+ <> Text.pack (show $ lineNo lno)+ <> ansiStyleText clv (defaultColor sty) (backgroundColor sty) False False False+ <> "\t"+ lineNoFgc = lineNumberColor sty `mplus` defaultColor sty+ lineNoBgc = lineNumberBackgroundColor sty `mplus` backgroundColor sty+ clv = ansiColorLevel opts++tokenToANSI :: ANSIColorLevel -> Style -> Token -> Text+tokenToANSI clv sty (tokTy, tokText) = ansiStyleText clv tokFgc tokBgc tokB tokI tokU+ <> tokText+ <> ansiStyleText clv (defaultColor sty) (backgroundColor sty) False False False+ where TokenStyle tokFgcRaw tokBgcRaw tokB tokI tokU = fromMaybe defStyle . Map.lookup tokTy $ tokenStyles sty+ tokFgc = tokFgcRaw `mplus` defaultColor sty+ tokBgc = tokBgcRaw `mplus` backgroundColor sty++ansiStyleText :: ANSIColorLevel -- ^ color support level+ -> Maybe Color -- ^ foreground+ -> Maybe Color -- ^ background+ -> Bool -- ^ bold+ -> Bool -- ^ italic+ -> Bool -- ^ underlined+ -> Text+ansiStyleText clv fgc bgc b i u = optReset <> sgrTextFg <> sgrTextBg+ <> (Text.pack . ANSI.setSGRCode $ concat [sgrCodeFg,+ sgrCodeBg,+ sgrCodeBold,+ sgrCodeItal,+ sgrCodeUndl])+ -- FIXME: the @ansi-terminal@ library should do the 256-color parts more cleanly someday+ where (sgrCodeFg, sgrTextFg) = case clv of+ ANSITrueColor -> (maybeToList $ fmap (ANSI.SetRGBColor ANSI.Foreground . fromColor) fgc, "")+ ANSI256Color -> ([], fromMaybe "" $ fmap (\c -> Text.pack $ ANSI.csi [38, 5,+ fromIntegral . getXterm256ColorCode $ fromColor c] "m") fgc)+ ANSI16Color -> (maybeToList $ fmap (uncurry (ANSI.SetColor ANSI.Foreground) . fromColor) fgc, "")+ (sgrCodeBg, sgrTextBg) = case clv of+ ANSITrueColor -> (maybeToList $ fmap (ANSI.SetRGBColor ANSI.Background . fromColor) bgc, "")+ ANSI256Color -> ([], fromMaybe "" $ fmap (\c -> Text.pack $ ANSI.csi [48, 5,+ fromIntegral . getXterm256ColorCode $ fromColor c] "m") bgc)+ ANSI16Color -> (maybeToList $ fmap (uncurry (ANSI.SetColor ANSI.Background) . fromColor) bgc, "")+ optReset = if isNothing fgc && isNothing bgc then ansiResetText else ""+ sgrCodeBold = [ANSI.SetConsoleIntensity $ if b then ANSI.BoldIntensity else ANSI.NormalIntensity]+ sgrCodeItal = [ANSI.SetItalicized i] -- FIXME: Not very widely supported in terminals+ sgrCodeUndl = [ANSI.SetUnderlining $ if u then ANSI.SingleUnderline else ANSI.NoUnderline]++ansiResetText :: Text+ansiResetText = Text.pack $ ANSI.setSGRCode [ANSI.Reset]++-- | Standard values taken from https://jonasjacek.github.io/colors/+ansi16ColorList :: [((ANSI.ColorIntensity, ANSI.Color), Color)]+ansi16ColorList = [ ((ANSI.Dull , ANSI.Black ), RGB 0 0 0 )+ , ((ANSI.Dull , ANSI.Red ), RGB 128 0 0 )+ , ((ANSI.Dull , ANSI.Green ), RGB 0 128 0 )+ , ((ANSI.Dull , ANSI.Yellow ), RGB 128 128 0 )+ , ((ANSI.Dull , ANSI.Blue ), RGB 0 0 128)+ , ((ANSI.Dull , ANSI.Magenta), RGB 128 0 128)+ , ((ANSI.Dull , ANSI.Cyan ), RGB 0 128 128)+ , ((ANSI.Dull , ANSI.White ), RGB 192 192 192)+ , ((ANSI.Vivid, ANSI.Black ), RGB 128 128 128)+ , ((ANSI.Vivid, ANSI.Red ), RGB 255 0 0 )+ , ((ANSI.Vivid, ANSI.Green ), RGB 0 255 0 )+ , ((ANSI.Vivid, ANSI.Yellow ), RGB 255 255 0 )+ , ((ANSI.Vivid, ANSI.Blue ), RGB 0 0 255)+ , ((ANSI.Vivid, ANSI.Magenta), RGB 255 0 255)+ , ((ANSI.Vivid, ANSI.Cyan ), RGB 0 255 255)+ , ((ANSI.Vivid, ANSI.White ), RGB 255 255 255)+ ]++newtype Xterm256ColorCode = Xterm256ColorCode { getXterm256ColorCode :: Word8 }+ deriving (Show, Read, Eq, Ord, Enum, Bounded, Data, Typeable, Generic)++instance Binary Xterm256ColorCode++-- | Converted from https://jonasjacek.github.io/colors/data.json, then slightly rearranged+ansi256ColorList :: [(Xterm256ColorCode, Color)]+ansi256ColorList = [ (Xterm256ColorCode 232, RGB 8 8 8) -- grayscale colors+ , (Xterm256ColorCode 233, RGB 18 18 18)+ , (Xterm256ColorCode 234, RGB 28 28 28)+ , (Xterm256ColorCode 235, RGB 38 38 38)+ , (Xterm256ColorCode 236, RGB 48 48 48)+ , (Xterm256ColorCode 237, RGB 58 58 58)+ , (Xterm256ColorCode 238, RGB 68 68 68)+ , (Xterm256ColorCode 239, RGB 78 78 78)+ , (Xterm256ColorCode 240, RGB 88 88 88)+ , (Xterm256ColorCode 241, RGB 98 98 98)+ , (Xterm256ColorCode 242, RGB 108 108 108)+ , (Xterm256ColorCode 243, RGB 118 118 118)+ , (Xterm256ColorCode 244, RGB 128 128 128)+ , (Xterm256ColorCode 245, RGB 138 138 138)+ , (Xterm256ColorCode 246, RGB 148 148 148)+ , (Xterm256ColorCode 247, RGB 158 158 158)+ , (Xterm256ColorCode 248, RGB 168 168 168)+ , (Xterm256ColorCode 249, RGB 178 178 178)+ , (Xterm256ColorCode 250, RGB 188 188 188)+ , (Xterm256ColorCode 251, RGB 198 198 198)+ , (Xterm256ColorCode 252, RGB 208 208 208)+ , (Xterm256ColorCode 253, RGB 218 218 218)+ , (Xterm256ColorCode 254, RGB 228 228 228)+ , (Xterm256ColorCode 255, RGB 238 238 238)+ , (Xterm256ColorCode 16, RGB 0 0 0) -- RGB cube colors+ , (Xterm256ColorCode 17, RGB 0 0 95)+ , (Xterm256ColorCode 18, RGB 0 0 135)+ , (Xterm256ColorCode 19, RGB 0 0 175)+ , (Xterm256ColorCode 20, RGB 0 0 215)+ , (Xterm256ColorCode 21, RGB 0 0 255)+ , (Xterm256ColorCode 22, RGB 0 95 0)+ , (Xterm256ColorCode 23, RGB 0 95 95)+ , (Xterm256ColorCode 24, RGB 0 95 135)+ , (Xterm256ColorCode 25, RGB 0 95 175)+ , (Xterm256ColorCode 26, RGB 0 95 215)+ , (Xterm256ColorCode 27, RGB 0 95 255)+ , (Xterm256ColorCode 28, RGB 0 135 0)+ , (Xterm256ColorCode 29, RGB 0 135 95)+ , (Xterm256ColorCode 30, RGB 0 135 135)+ , (Xterm256ColorCode 31, RGB 0 135 175)+ , (Xterm256ColorCode 32, RGB 0 135 215)+ , (Xterm256ColorCode 33, RGB 0 135 255)+ , (Xterm256ColorCode 34, RGB 0 175 0)+ , (Xterm256ColorCode 35, RGB 0 175 95)+ , (Xterm256ColorCode 36, RGB 0 175 135)+ , (Xterm256ColorCode 37, RGB 0 175 175)+ , (Xterm256ColorCode 38, RGB 0 175 215)+ , (Xterm256ColorCode 39, RGB 0 175 255)+ , (Xterm256ColorCode 40, RGB 0 215 0)+ , (Xterm256ColorCode 41, RGB 0 215 95)+ , (Xterm256ColorCode 42, RGB 0 215 135)+ , (Xterm256ColorCode 43, RGB 0 215 175)+ , (Xterm256ColorCode 44, RGB 0 215 215)+ , (Xterm256ColorCode 45, RGB 0 215 255)+ , (Xterm256ColorCode 46, RGB 0 255 0)+ , (Xterm256ColorCode 47, RGB 0 255 95)+ , (Xterm256ColorCode 48, RGB 0 255 135)+ , (Xterm256ColorCode 49, RGB 0 255 175)+ , (Xterm256ColorCode 50, RGB 0 255 215)+ , (Xterm256ColorCode 51, RGB 0 255 255)+ , (Xterm256ColorCode 52, RGB 95 0 0)+ , (Xterm256ColorCode 53, RGB 95 0 95)+ , (Xterm256ColorCode 54, RGB 95 0 135)+ , (Xterm256ColorCode 55, RGB 95 0 175)+ , (Xterm256ColorCode 56, RGB 95 0 215)+ , (Xterm256ColorCode 57, RGB 95 0 255)+ , (Xterm256ColorCode 58, RGB 95 95 0)+ , (Xterm256ColorCode 59, RGB 95 95 95)+ , (Xterm256ColorCode 60, RGB 95 95 135)+ , (Xterm256ColorCode 61, RGB 95 95 175)+ , (Xterm256ColorCode 62, RGB 95 95 215)+ , (Xterm256ColorCode 63, RGB 95 95 255)+ , (Xterm256ColorCode 64, RGB 95 135 0)+ , (Xterm256ColorCode 65, RGB 95 135 95)+ , (Xterm256ColorCode 66, RGB 95 135 135)+ , (Xterm256ColorCode 67, RGB 95 135 175)+ , (Xterm256ColorCode 68, RGB 95 135 215)+ , (Xterm256ColorCode 69, RGB 95 135 255)+ , (Xterm256ColorCode 70, RGB 95 175 0)+ , (Xterm256ColorCode 71, RGB 95 175 95)+ , (Xterm256ColorCode 72, RGB 95 175 135)+ , (Xterm256ColorCode 73, RGB 95 175 175)+ , (Xterm256ColorCode 74, RGB 95 175 215)+ , (Xterm256ColorCode 75, RGB 95 175 255)+ , (Xterm256ColorCode 76, RGB 95 215 0)+ , (Xterm256ColorCode 77, RGB 95 215 95)+ , (Xterm256ColorCode 78, RGB 95 215 135)+ , (Xterm256ColorCode 79, RGB 95 215 175)+ , (Xterm256ColorCode 80, RGB 95 215 215)+ , (Xterm256ColorCode 81, RGB 95 215 255)+ , (Xterm256ColorCode 82, RGB 95 255 0)+ , (Xterm256ColorCode 83, RGB 95 255 95)+ , (Xterm256ColorCode 84, RGB 95 255 135)+ , (Xterm256ColorCode 85, RGB 95 255 175)+ , (Xterm256ColorCode 86, RGB 95 255 215)+ , (Xterm256ColorCode 87, RGB 95 255 255)+ , (Xterm256ColorCode 88, RGB 135 0 0)+ , (Xterm256ColorCode 89, RGB 135 0 95)+ , (Xterm256ColorCode 90, RGB 135 0 135)+ , (Xterm256ColorCode 91, RGB 135 0 175)+ , (Xterm256ColorCode 92, RGB 135 0 215)+ , (Xterm256ColorCode 93, RGB 135 0 255)+ , (Xterm256ColorCode 94, RGB 135 95 0)+ , (Xterm256ColorCode 95, RGB 135 95 95)+ , (Xterm256ColorCode 96, RGB 135 95 135)+ , (Xterm256ColorCode 97, RGB 135 95 175)+ , (Xterm256ColorCode 98, RGB 135 95 215)+ , (Xterm256ColorCode 99, RGB 135 95 255)+ , (Xterm256ColorCode 100, RGB 135 135 0)+ , (Xterm256ColorCode 101, RGB 135 135 95)+ , (Xterm256ColorCode 102, RGB 135 135 135)+ , (Xterm256ColorCode 103, RGB 135 135 175)+ , (Xterm256ColorCode 104, RGB 135 135 215)+ , (Xterm256ColorCode 105, RGB 135 135 255)+ , (Xterm256ColorCode 106, RGB 135 175 0)+ , (Xterm256ColorCode 107, RGB 135 175 95)+ , (Xterm256ColorCode 108, RGB 135 175 135)+ , (Xterm256ColorCode 109, RGB 135 175 175)+ , (Xterm256ColorCode 110, RGB 135 175 215)+ , (Xterm256ColorCode 111, RGB 135 175 255)+ , (Xterm256ColorCode 112, RGB 135 215 0)+ , (Xterm256ColorCode 113, RGB 135 215 95)+ , (Xterm256ColorCode 114, RGB 135 215 135)+ , (Xterm256ColorCode 115, RGB 135 215 175)+ , (Xterm256ColorCode 116, RGB 135 215 215)+ , (Xterm256ColorCode 117, RGB 135 215 255)+ , (Xterm256ColorCode 118, RGB 135 255 0)+ , (Xterm256ColorCode 119, RGB 135 255 95)+ , (Xterm256ColorCode 120, RGB 135 255 135)+ , (Xterm256ColorCode 121, RGB 135 255 175)+ , (Xterm256ColorCode 122, RGB 135 255 215)+ , (Xterm256ColorCode 123, RGB 135 255 255)+ , (Xterm256ColorCode 124, RGB 175 0 0)+ , (Xterm256ColorCode 125, RGB 175 0 95)+ , (Xterm256ColorCode 126, RGB 175 0 135)+ , (Xterm256ColorCode 127, RGB 175 0 175)+ , (Xterm256ColorCode 128, RGB 175 0 215)+ , (Xterm256ColorCode 129, RGB 175 0 255)+ , (Xterm256ColorCode 130, RGB 175 95 0)+ , (Xterm256ColorCode 131, RGB 175 95 95)+ , (Xterm256ColorCode 132, RGB 175 95 135)+ , (Xterm256ColorCode 133, RGB 175 95 175)+ , (Xterm256ColorCode 134, RGB 175 95 215)+ , (Xterm256ColorCode 135, RGB 175 95 255)+ , (Xterm256ColorCode 136, RGB 175 135 0)+ , (Xterm256ColorCode 137, RGB 175 135 95)+ , (Xterm256ColorCode 138, RGB 175 135 135)+ , (Xterm256ColorCode 139, RGB 175 135 175)+ , (Xterm256ColorCode 140, RGB 175 135 215)+ , (Xterm256ColorCode 141, RGB 175 135 255)+ , (Xterm256ColorCode 142, RGB 175 175 0)+ , (Xterm256ColorCode 143, RGB 175 175 95)+ , (Xterm256ColorCode 144, RGB 175 175 135)+ , (Xterm256ColorCode 145, RGB 175 175 175)+ , (Xterm256ColorCode 146, RGB 175 175 215)+ , (Xterm256ColorCode 147, RGB 175 175 255)+ , (Xterm256ColorCode 148, RGB 175 215 0)+ , (Xterm256ColorCode 149, RGB 175 215 95)+ , (Xterm256ColorCode 150, RGB 175 215 135)+ , (Xterm256ColorCode 151, RGB 175 215 175)+ , (Xterm256ColorCode 152, RGB 175 215 215)+ , (Xterm256ColorCode 153, RGB 175 215 255)+ , (Xterm256ColorCode 154, RGB 175 255 0)+ , (Xterm256ColorCode 155, RGB 175 255 95)+ , (Xterm256ColorCode 156, RGB 175 255 135)+ , (Xterm256ColorCode 157, RGB 175 255 175)+ , (Xterm256ColorCode 158, RGB 175 255 215)+ , (Xterm256ColorCode 159, RGB 175 255 255)+ , (Xterm256ColorCode 160, RGB 215 0 0)+ , (Xterm256ColorCode 161, RGB 215 0 95)+ , (Xterm256ColorCode 162, RGB 215 0 135)+ , (Xterm256ColorCode 163, RGB 215 0 175)+ , (Xterm256ColorCode 164, RGB 215 0 215)+ , (Xterm256ColorCode 165, RGB 215 0 255)+ , (Xterm256ColorCode 166, RGB 215 95 0)+ , (Xterm256ColorCode 167, RGB 215 95 95)+ , (Xterm256ColorCode 168, RGB 215 95 135)+ , (Xterm256ColorCode 169, RGB 215 95 175)+ , (Xterm256ColorCode 170, RGB 215 95 215)+ , (Xterm256ColorCode 171, RGB 215 95 255)+ , (Xterm256ColorCode 172, RGB 215 135 0)+ , (Xterm256ColorCode 173, RGB 215 135 95)+ , (Xterm256ColorCode 174, RGB 215 135 135)+ , (Xterm256ColorCode 175, RGB 215 135 175)+ , (Xterm256ColorCode 176, RGB 215 135 215)+ , (Xterm256ColorCode 177, RGB 215 135 255)+ , (Xterm256ColorCode 178, RGB 215 175 0)+ , (Xterm256ColorCode 179, RGB 215 175 95)+ , (Xterm256ColorCode 180, RGB 215 175 135)+ , (Xterm256ColorCode 181, RGB 215 175 175)+ , (Xterm256ColorCode 182, RGB 215 175 215)+ , (Xterm256ColorCode 183, RGB 215 175 255)+ , (Xterm256ColorCode 184, RGB 215 215 0)+ , (Xterm256ColorCode 185, RGB 215 215 95)+ , (Xterm256ColorCode 186, RGB 215 215 135)+ , (Xterm256ColorCode 187, RGB 215 215 175)+ , (Xterm256ColorCode 188, RGB 215 215 215)+ , (Xterm256ColorCode 189, RGB 215 215 255)+ , (Xterm256ColorCode 190, RGB 215 255 0)+ , (Xterm256ColorCode 191, RGB 215 255 95)+ , (Xterm256ColorCode 192, RGB 215 255 135)+ , (Xterm256ColorCode 193, RGB 215 255 175)+ , (Xterm256ColorCode 194, RGB 215 255 215)+ , (Xterm256ColorCode 195, RGB 215 255 255)+ , (Xterm256ColorCode 196, RGB 255 0 0)+ , (Xterm256ColorCode 197, RGB 255 0 95)+ , (Xterm256ColorCode 198, RGB 255 0 135)+ , (Xterm256ColorCode 199, RGB 255 0 175)+ , (Xterm256ColorCode 200, RGB 255 0 215)+ , (Xterm256ColorCode 201, RGB 255 0 255)+ , (Xterm256ColorCode 202, RGB 255 95 0)+ , (Xterm256ColorCode 203, RGB 255 95 95)+ , (Xterm256ColorCode 204, RGB 255 95 135)+ , (Xterm256ColorCode 205, RGB 255 95 175)+ , (Xterm256ColorCode 206, RGB 255 95 215)+ , (Xterm256ColorCode 207, RGB 255 95 255)+ , (Xterm256ColorCode 208, RGB 255 135 0)+ , (Xterm256ColorCode 209, RGB 255 135 95)+ , (Xterm256ColorCode 210, RGB 255 135 135)+ , (Xterm256ColorCode 211, RGB 255 135 175)+ , (Xterm256ColorCode 212, RGB 255 135 215)+ , (Xterm256ColorCode 213, RGB 255 135 255)+ , (Xterm256ColorCode 214, RGB 255 175 0)+ , (Xterm256ColorCode 215, RGB 255 175 95)+ , (Xterm256ColorCode 216, RGB 255 175 135)+ , (Xterm256ColorCode 217, RGB 255 175 175)+ , (Xterm256ColorCode 218, RGB 255 175 215)+ , (Xterm256ColorCode 219, RGB 255 175 255)+ , (Xterm256ColorCode 220, RGB 255 215 0)+ , (Xterm256ColorCode 221, RGB 255 215 95)+ , (Xterm256ColorCode 222, RGB 255 215 135)+ , (Xterm256ColorCode 223, RGB 255 215 175)+ , (Xterm256ColorCode 224, RGB 255 215 215)+ , (Xterm256ColorCode 225, RGB 255 215 255)+ , (Xterm256ColorCode 226, RGB 255 255 0)+ , (Xterm256ColorCode 227, RGB 255 255 95)+ , (Xterm256ColorCode 228, RGB 255 255 135)+ , (Xterm256ColorCode 229, RGB 255 255 175)+ , (Xterm256ColorCode 230, RGB 255 255 215)+ , (Xterm256ColorCode 231, RGB 255 255 255)+ , (Xterm256ColorCode 0, RGB 0 0 0) -- “system” colors+ , (Xterm256ColorCode 1, RGB 128 0 0)+ , (Xterm256ColorCode 2, RGB 0 128 0)+ , (Xterm256ColorCode 3, RGB 128 128 0)+ , (Xterm256ColorCode 4, RGB 0 0 128)+ , (Xterm256ColorCode 5, RGB 128 0 128)+ , (Xterm256ColorCode 6, RGB 0 128 128)+ , (Xterm256ColorCode 7, RGB 192 192 192)+ , (Xterm256ColorCode 8, RGB 128 128 128)+ , (Xterm256ColorCode 9, RGB 255 0 0)+ , (Xterm256ColorCode 10, RGB 0 255 0)+ , (Xterm256ColorCode 11, RGB 255 255 0)+ , (Xterm256ColorCode 12, RGB 0 0 255)+ , (Xterm256ColorCode 13, RGB 255 0 255)+ , (Xterm256ColorCode 14, RGB 0 255 255)+ , (Xterm256ColorCode 15, RGB 255 255 255)+ ]++instance ToColor Xterm256ColorCode where+ toColor = flip lookup ansi256ColorList -- cannot actually fail++instance ToColor (ANSI.ColorIntensity, ANSI.Color) where+ toColor = flip lookup ansi16ColorList -- cannot actually fail++-- | Warning: this conversion is extremely approximate!+instance FromColor (ANSI.ColorIntensity, ANSI.Color) where+ fromColor = findApproximateColor ansi16ColorList++-- | Warning: this conversion is noticeably approximate!+instance FromColor Xterm256ColorCode where+ -- Same algorithm as above+ fromColor = findApproximateColor ansi256ColorList++colorDistance :: Color -> Color -> Int16+colorDistance (RGB r1 g1 b1) (RGB r2 g2 b2) = abs (fromIntegral r1 - fromIntegral r2)+ + abs (fromIntegral g1 - fromIntegral g2)+ + abs (fromIntegral b1 - fromIntegral b2)++-- This is the most naïve possible nearest-neighbor search;+-- it could almost certainly be optimized, if its speed matters at all.+findApproximateColor :: [(a, Color)] -> Color -> a+findApproximateColor acs c = let ranked = map (\ac -> (ac, colorDistance c $ snd ac)) acs+ in fst . fst $ minimumBy (comparing snd) ranked++