lib: useColor, colorOption helpers usable anywhere
This commit is contained in:
		
							parent
							
								
									6af7a32076
								
							
						
					
					
						commit
						5e57cfb43e
					
				| @ -48,15 +48,12 @@ where | |||||||
| 
 | 
 | ||||||
| import Control.Applicative ((<|>)) | import Control.Applicative ((<|>)) | ||||||
| import Data.List.Extra (nubSort) | import Data.List.Extra (nubSort) | ||||||
| import Data.Maybe (fromMaybe, isJust, mapMaybe) | import Data.Maybe (fromMaybe, mapMaybe) | ||||||
| import qualified Data.Text as T | import qualified Data.Text as T | ||||||
| import Data.Time.Calendar (Day, addDays) | import Data.Time.Calendar (Day, addDays) | ||||||
| import Data.Default (Default(..)) | import Data.Default (Default(..)) | ||||||
| import Safe (headMay, lastDef, lastMay, maximumMay) | import Safe (headMay, lastDef, lastMay, maximumMay) | ||||||
| 
 | 
 | ||||||
| import System.Console.ANSI (hSupportsANSIColor) |  | ||||||
| import System.Environment (lookupEnv) |  | ||||||
| import System.IO (stdout) |  | ||||||
| import Text.Megaparsec.Custom | import Text.Megaparsec.Custom | ||||||
| 
 | 
 | ||||||
| import Hledger.Data | import Hledger.Data | ||||||
| @ -181,11 +178,8 @@ defreportopts = ReportOpts | |||||||
| rawOptsToReportOpts :: RawOpts -> IO ReportOpts | rawOptsToReportOpts :: RawOpts -> IO ReportOpts | ||||||
| rawOptsToReportOpts rawopts = do | rawOptsToReportOpts rawopts = do | ||||||
|     d <- getCurrentDay |     d <- getCurrentDay | ||||||
|     no_color <- isJust <$> lookupEnv "NO_COLOR" |  | ||||||
|     supports_color <- hSupportsANSIColor stdout |  | ||||||
| 
 | 
 | ||||||
|     let colorflag    = stringopt "color" rawopts |     let formatstring = T.pack <$> maybestringopt "format" rawopts | ||||||
|         formatstring = T.pack <$> maybestringopt "format" rawopts |  | ||||||
|         querystring  = map T.pack $ listofstringopt "args" rawopts  -- doesn't handle an arg like "" right |         querystring  = map T.pack $ listofstringopt "args" rawopts  -- doesn't handle an arg like "" right | ||||||
|         (costing, valuation) = valuationTypeFromRawOpts rawopts |         (costing, valuation) = valuationTypeFromRawOpts rawopts | ||||||
| 
 | 
 | ||||||
| @ -222,10 +216,7 @@ rawOptsToReportOpts rawopts = do | |||||||
|           ,percent_     = boolopt "percent" rawopts |           ,percent_     = boolopt "percent" rawopts | ||||||
|           ,invert_      = boolopt "invert" rawopts |           ,invert_      = boolopt "invert" rawopts | ||||||
|           ,pretty_tables_ = boolopt "pretty-tables" rawopts |           ,pretty_tables_ = boolopt "pretty-tables" rawopts | ||||||
|           ,color_       = and [not no_color |           ,color_       = useColor -- a lower-level helper | ||||||
|                               ,not $ colorflag `elem` ["never","no"] |  | ||||||
|                               ,colorflag `elem` ["always","yes"] || supports_color |  | ||||||
|                               ] |  | ||||||
|           ,forecast_    = forecastPeriodFromRawOpts d rawopts |           ,forecast_    = forecastPeriodFromRawOpts d rawopts | ||||||
|           ,transpose_   = boolopt "transpose" rawopts |           ,transpose_   = boolopt "transpose" rawopts | ||||||
|           } |           } | ||||||
|  | |||||||
| @ -94,7 +94,7 @@ module Hledger.Utils.Debug ( | |||||||
|   ,traceParse |   ,traceParse | ||||||
|   ,dbgparse |   ,dbgparse | ||||||
|   ,module Debug.Trace |   ,module Debug.Trace | ||||||
| ) | ,useColor) | ||||||
| where | where | ||||||
| 
 | 
 | ||||||
| import           Control.Monad (when) | import           Control.Monad (when) | ||||||
| @ -105,12 +105,15 @@ import qualified Data.Text.Lazy as TL | |||||||
| import           Debug.Trace | import           Debug.Trace | ||||||
| import           Hledger.Utils.Parse | import           Hledger.Utils.Parse | ||||||
| import           Safe (readDef) | import           Safe (readDef) | ||||||
| import           System.Environment (getArgs) | import           System.Environment (getArgs, lookupEnv) | ||||||
| import           System.Exit | import           System.Exit | ||||||
| import           System.IO.Unsafe (unsafePerformIO) | import           System.IO.Unsafe (unsafePerformIO) | ||||||
| import           Text.Megaparsec | import           Text.Megaparsec | ||||||
| import           Text.Printf | import           Text.Printf | ||||||
| import           Text.Pretty.Simple  -- (defaultOutputOptionsDarkBg, OutputOptions(..), pShowOpt, pPrintOpt) | import           Text.Pretty.Simple  -- (defaultOutputOptionsDarkBg, OutputOptions(..), pShowOpt, pPrintOpt) | ||||||
|  | import Data.Maybe (isJust) | ||||||
|  | import System.Console.ANSI (hSupportsANSIColor) | ||||||
|  | import System.IO (stdout) | ||||||
| 
 | 
 | ||||||
| prettyopts =  | prettyopts =  | ||||||
|     defaultOutputOptionsDarkBg |     defaultOutputOptionsDarkBg | ||||||
| @ -139,6 +142,49 @@ ptrace = traceWith pshow | |||||||
| traceWith :: Show a => (a -> String) -> a -> a | traceWith :: Show a => (a -> String) -> a -> a | ||||||
| traceWith f a = trace (f a) a | traceWith f a = trace (f a) a | ||||||
| 
 | 
 | ||||||
|  | -- | Check the IO environment to see if ANSI colour codes should be used in output. | ||||||
|  | -- This is done using unsafePerformIO so it can be used anywhere, eg in  | ||||||
|  | -- low-level debug utilities, which should be ok since we are just reading. | ||||||
|  | -- (When running code in GHCI, this module must be reloaded to see a change.) | ||||||
|  | -- The logic is: use color if  | ||||||
|  | -- a NO_COLOR environment variable is not defined | ||||||
|  | -- and the program was not started with --color=no|never | ||||||
|  | -- and stdout supports ANSI color, or the program was started with --color=yes|always. | ||||||
|  | -- {-# OPTIONS_GHC -fno-cse #-} | ||||||
|  | -- {-# NOINLINE useColor #-} | ||||||
|  | useColor :: Bool | ||||||
|  | useColor = unsafePerformIO $ do | ||||||
|  |   no_color       <- isJust <$> lookupEnv "NO_COLOR" | ||||||
|  |   supports_color <- hSupportsANSIColor stdout | ||||||
|  |   let coloroption = colorOption | ||||||
|  |   return $ and [ | ||||||
|  |      not no_color | ||||||
|  |     ,not $ coloroption `elem` ["never","no"] | ||||||
|  |     ,coloroption `elem` ["always","yes"] || supports_color | ||||||
|  |     ] | ||||||
|  | 
 | ||||||
|  | -- | Read the value of the --color or --colour command line option provided at program startup | ||||||
|  | -- using unsafePerformIO. If this option was not provided, returns the empty string. | ||||||
|  | -- (When running code in GHCI, this module must be reloaded to see a change.) | ||||||
|  | -- {-# OPTIONS_GHC -fno-cse #-} | ||||||
|  | -- {-# NOINLINE colorOption #-} | ||||||
|  | colorOption :: String | ||||||
|  | colorOption =  | ||||||
|  |   -- similar to debugLevel | ||||||
|  |   let args = unsafePerformIO getArgs in | ||||||
|  |   case snd $ break (=="--color") args of | ||||||
|  |     "--color":v:_ -> v | ||||||
|  |     _ -> | ||||||
|  |       case take 1 $ filter ("--color=" `isPrefixOf`) args of | ||||||
|  |         ['-':'-':'c':'o':'l':'o':'r':'=':v] -> v | ||||||
|  |         _ -> | ||||||
|  |           case snd $ break (=="--colour") args of | ||||||
|  |             "--colour":v:_ -> v | ||||||
|  |             _ -> | ||||||
|  |               case take 1 $ filter ("--colour=" `isPrefixOf`) args of | ||||||
|  |                 ['-':'-':'c':'o':'l':'o':'u':'r':'=':v] -> v | ||||||
|  |                 _ -> "" | ||||||
|  | 
 | ||||||
| -- | Global debug level, which controls the verbosity of debug output | -- | Global debug level, which controls the verbosity of debug output | ||||||
| -- on the console. The default is 0 meaning no debug output. The | -- on the console. The default is 0 meaning no debug output. The | ||||||
| -- @--debug@ command line flag sets it to 1, or @--debug=N@ sets it to | -- @--debug@ command line flag sets it to 1, or @--debug=N@ sets it to | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user