packages feed

pretty-simple 1.1.0.3 → 2.0.0.0

raw patch · 5 files changed

+504/−149 lines, 5 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

- Text.Pretty.Simple: NoColor :: UseColor
- Text.Pretty.Simple: UseColor :: UseColor
- Text.Pretty.Simple: [outputOptionsUseColor] :: OutputOptions -> UseColor
- Text.Pretty.Simple: data UseColor
- Text.Pretty.Simple: defaultOutputOptions :: OutputOptions
- Text.Pretty.Simple: noColorOutputOptions :: OutputOptions
- Text.Pretty.Simple.Internal.OutputPrinter: NoColor :: UseColor
- Text.Pretty.Simple.Internal.OutputPrinter: UseColor :: UseColor
- Text.Pretty.Simple.Internal.OutputPrinter: [outputOptionsUseColor] :: OutputOptions -> UseColor
- Text.Pretty.Simple.Internal.OutputPrinter: appendColors :: MonadReader OutputOptions m => m Builder -> m Builder -> m Builder
- Text.Pretty.Simple.Internal.OutputPrinter: canUseColor :: MonadReader OutputOptions m => m Bool
- Text.Pretty.Simple.Internal.OutputPrinter: colorBold :: MonadReader OutputOptions m => m Builder
- Text.Pretty.Simple.Internal.OutputPrinter: colorError :: MonadReader OutputOptions m => m Builder
- Text.Pretty.Simple.Internal.OutputPrinter: colorHelper :: MonadReader OutputOptions m => ColorIntensity -> Color -> m Builder
- Text.Pretty.Simple.Internal.OutputPrinter: colorNum :: MonadReader OutputOptions m => m Builder
- Text.Pretty.Simple.Internal.OutputPrinter: colorQuote :: MonadReader OutputOptions m => m Builder
- Text.Pretty.Simple.Internal.OutputPrinter: colorReset :: MonadReader OutputOptions m => m Builder
- Text.Pretty.Simple.Internal.OutputPrinter: colorString :: MonadReader OutputOptions m => m Builder
- Text.Pretty.Simple.Internal.OutputPrinter: colorVividBlue :: MonadReader OutputOptions m => m Builder
- Text.Pretty.Simple.Internal.OutputPrinter: colorVividCyan :: MonadReader OutputOptions m => m Builder
- Text.Pretty.Simple.Internal.OutputPrinter: colorVividGreen :: MonadReader OutputOptions m => m Builder
- Text.Pretty.Simple.Internal.OutputPrinter: colorVividMagenta :: MonadReader OutputOptions m => m Builder
- Text.Pretty.Simple.Internal.OutputPrinter: colorVividRed :: MonadReader OutputOptions m => m Builder
- Text.Pretty.Simple.Internal.OutputPrinter: colorVividWhite :: MonadReader OutputOptions m => m Builder
- Text.Pretty.Simple.Internal.OutputPrinter: colorVividYellow :: MonadReader OutputOptions m => m Builder
- Text.Pretty.Simple.Internal.OutputPrinter: data UseColor
- Text.Pretty.Simple.Internal.OutputPrinter: defaultOutputOptions :: OutputOptions
- Text.Pretty.Simple.Internal.OutputPrinter: ifM :: Monad m => m Bool -> a -> a -> m a
- Text.Pretty.Simple.Internal.OutputPrinter: instance Data.Data.Data Text.Pretty.Simple.Internal.OutputPrinter.OutputOptions
- Text.Pretty.Simple.Internal.OutputPrinter: instance Data.Data.Data Text.Pretty.Simple.Internal.OutputPrinter.UseColor
- Text.Pretty.Simple.Internal.OutputPrinter: instance GHC.Classes.Eq Text.Pretty.Simple.Internal.OutputPrinter.UseColor
- Text.Pretty.Simple.Internal.OutputPrinter: instance GHC.Generics.Generic Text.Pretty.Simple.Internal.OutputPrinter.UseColor
- Text.Pretty.Simple.Internal.OutputPrinter: instance GHC.Read.Read Text.Pretty.Simple.Internal.OutputPrinter.OutputOptions
- Text.Pretty.Simple.Internal.OutputPrinter: instance GHC.Read.Read Text.Pretty.Simple.Internal.OutputPrinter.UseColor
- Text.Pretty.Simple.Internal.OutputPrinter: instance GHC.Show.Show Text.Pretty.Simple.Internal.OutputPrinter.UseColor
- Text.Pretty.Simple.Internal.OutputPrinter: rainbowParen :: forall m. MonadReader OutputOptions m => NestLevel -> m Builder
- Text.Pretty.Simple.Internal.OutputPrinter: setSGRCodeBuilder :: [SGR] -> Builder
+ Text.Pretty.Simple: [outputOptionsColorOptions] :: OutputOptions -> Maybe ColorOptions
+ Text.Pretty.Simple: defaultColorOptionsDarkBg :: ColorOptions
+ Text.Pretty.Simple: defaultColorOptionsLightBg :: ColorOptions
+ Text.Pretty.Simple: defaultOutputOptionsDarkBg :: OutputOptions
+ Text.Pretty.Simple: defaultOutputOptionsLightBg :: OutputOptions
+ Text.Pretty.Simple: defaultOutputOptionsNoColor :: OutputOptions
+ Text.Pretty.Simple: pPrintDarkBg :: (MonadIO m, Show a) => a -> m ()
+ Text.Pretty.Simple: pPrintLightBg :: (MonadIO m, Show a) => a -> m ()
+ Text.Pretty.Simple: pShowDarkBg :: Show a => a -> Text
+ Text.Pretty.Simple: pShowLightBg :: Show a => a -> Text
+ Text.Pretty.Simple: pStringDarkBg :: String -> Text
+ Text.Pretty.Simple: pStringLightBg :: String -> Text
+ Text.Pretty.Simple.Internal.Color: ColorOptions :: Builder -> Builder -> Builder -> Builder -> [Builder] -> ColorOptions
+ Text.Pretty.Simple.Internal.Color: [colorError] :: ColorOptions -> Builder
+ Text.Pretty.Simple.Internal.Color: [colorNum] :: ColorOptions -> Builder
+ Text.Pretty.Simple.Internal.Color: [colorQuote] :: ColorOptions -> Builder
+ Text.Pretty.Simple.Internal.Color: [colorRainbowParens] :: ColorOptions -> [Builder]
+ Text.Pretty.Simple.Internal.Color: [colorString] :: ColorOptions -> Builder
+ Text.Pretty.Simple.Internal.Color: colorBold :: Builder
+ Text.Pretty.Simple.Internal.Color: colorDullBlack :: Builder
+ Text.Pretty.Simple.Internal.Color: colorDullBlackBold :: Builder
+ Text.Pretty.Simple.Internal.Color: colorDullBlue :: Builder
+ Text.Pretty.Simple.Internal.Color: colorDullBlueBold :: Builder
+ Text.Pretty.Simple.Internal.Color: colorDullCyan :: Builder
+ Text.Pretty.Simple.Internal.Color: colorDullCyanBold :: Builder
+ Text.Pretty.Simple.Internal.Color: colorDullGreen :: Builder
+ Text.Pretty.Simple.Internal.Color: colorDullGreenBold :: Builder
+ Text.Pretty.Simple.Internal.Color: colorDullMagenta :: Builder
+ Text.Pretty.Simple.Internal.Color: colorDullMagentaBold :: Builder
+ Text.Pretty.Simple.Internal.Color: colorDullRed :: Builder
+ Text.Pretty.Simple.Internal.Color: colorDullRedBold :: Builder
+ Text.Pretty.Simple.Internal.Color: colorDullWhite :: Builder
+ Text.Pretty.Simple.Internal.Color: colorDullWhiteBold :: Builder
+ Text.Pretty.Simple.Internal.Color: colorDullYellow :: Builder
+ Text.Pretty.Simple.Internal.Color: colorDullYellowBold :: Builder
+ Text.Pretty.Simple.Internal.Color: colorHelper :: ColorIntensity -> Color -> Builder
+ Text.Pretty.Simple.Internal.Color: colorNull :: Builder
+ Text.Pretty.Simple.Internal.Color: colorReset :: Builder
+ Text.Pretty.Simple.Internal.Color: colorVividBlack :: Builder
+ Text.Pretty.Simple.Internal.Color: colorVividBlackBold :: Builder
+ Text.Pretty.Simple.Internal.Color: colorVividBlue :: Builder
+ Text.Pretty.Simple.Internal.Color: colorVividBlueBold :: Builder
+ Text.Pretty.Simple.Internal.Color: colorVividCyan :: Builder
+ Text.Pretty.Simple.Internal.Color: colorVividCyanBold :: Builder
+ Text.Pretty.Simple.Internal.Color: colorVividGreen :: Builder
+ Text.Pretty.Simple.Internal.Color: colorVividGreenBold :: Builder
+ Text.Pretty.Simple.Internal.Color: colorVividMagenta :: Builder
+ Text.Pretty.Simple.Internal.Color: colorVividMagentaBold :: Builder
+ Text.Pretty.Simple.Internal.Color: colorVividRed :: Builder
+ Text.Pretty.Simple.Internal.Color: colorVividRedBold :: Builder
+ Text.Pretty.Simple.Internal.Color: colorVividWhite :: Builder
+ Text.Pretty.Simple.Internal.Color: colorVividWhiteBold :: Builder
+ Text.Pretty.Simple.Internal.Color: colorVividYellow :: Builder
+ Text.Pretty.Simple.Internal.Color: colorVividYellowBold :: Builder
+ Text.Pretty.Simple.Internal.Color: data ColorOptions
+ Text.Pretty.Simple.Internal.Color: defaultColorErrorDarkBg :: Builder
+ Text.Pretty.Simple.Internal.Color: defaultColorErrorLightBg :: Builder
+ Text.Pretty.Simple.Internal.Color: defaultColorNumDarkBg :: Builder
+ Text.Pretty.Simple.Internal.Color: defaultColorNumLightBg :: Builder
+ Text.Pretty.Simple.Internal.Color: defaultColorOptionsDarkBg :: ColorOptions
+ Text.Pretty.Simple.Internal.Color: defaultColorOptionsLightBg :: ColorOptions
+ Text.Pretty.Simple.Internal.Color: defaultColorQuoteDarkBg :: Builder
+ Text.Pretty.Simple.Internal.Color: defaultColorQuoteLightBg :: Builder
+ Text.Pretty.Simple.Internal.Color: defaultColorRainbowParensDarkBg :: [Builder]
+ Text.Pretty.Simple.Internal.Color: defaultColorRainbowParensLightBg :: [Builder]
+ Text.Pretty.Simple.Internal.Color: defaultColorStringDarkBg :: Builder
+ Text.Pretty.Simple.Internal.Color: defaultColorStringLightBg :: Builder
+ Text.Pretty.Simple.Internal.Color: instance GHC.Classes.Eq Text.Pretty.Simple.Internal.Color.ColorOptions
+ Text.Pretty.Simple.Internal.Color: instance GHC.Generics.Generic Text.Pretty.Simple.Internal.Color.ColorOptions
+ Text.Pretty.Simple.Internal.Color: instance GHC.Show.Show Text.Pretty.Simple.Internal.Color.ColorOptions
+ Text.Pretty.Simple.Internal.Color: setSGRCodeBuilder :: [SGR] -> Builder
+ Text.Pretty.Simple.Internal.OutputPrinter: [outputOptionsColorOptions] :: OutputOptions -> Maybe ColorOptions
+ Text.Pretty.Simple.Internal.OutputPrinter: defaultOutputOptionsDarkBg :: OutputOptions
+ Text.Pretty.Simple.Internal.OutputPrinter: defaultOutputOptionsLightBg :: OutputOptions
+ Text.Pretty.Simple.Internal.OutputPrinter: defaultOutputOptionsNoColor :: OutputOptions
+ Text.Pretty.Simple.Internal.OutputPrinter: useColorError :: forall m. MonadReader OutputOptions m => m Builder
+ Text.Pretty.Simple.Internal.OutputPrinter: useColorNum :: forall m. MonadReader OutputOptions m => m Builder
+ Text.Pretty.Simple.Internal.OutputPrinter: useColorQuote :: forall m. MonadReader OutputOptions m => m Builder
+ Text.Pretty.Simple.Internal.OutputPrinter: useColorRainbowParens :: forall m. MonadReader OutputOptions m => NestLevel -> m Builder
+ Text.Pretty.Simple.Internal.OutputPrinter: useColorReset :: forall m. MonadReader OutputOptions m => m Builder
+ Text.Pretty.Simple.Internal.OutputPrinter: useColorString :: forall m. MonadReader OutputOptions m => m Builder
- Text.Pretty.Simple: OutputOptions :: Int -> UseColor -> OutputOptions
+ Text.Pretty.Simple: OutputOptions :: Int -> Maybe ColorOptions -> OutputOptions
- Text.Pretty.Simple.Internal.OutputPrinter: OutputOptions :: Int -> UseColor -> OutputOptions
+ Text.Pretty.Simple.Internal.OutputPrinter: OutputOptions :: Int -> Maybe ColorOptions -> OutputOptions

Files

pretty-simple.cabal view
@@ -1,5 +1,5 @@ name:                pretty-simple-version:             1.1.0.3+version:             2.0.0.0 synopsis:            pretty printer for data types with a 'Show' instance. description:         Please see <https://github.com/cdepillabout/pretty-simple#readme README.md>. homepage:            https://github.com/cdepillabout/pretty-simple@@ -22,6 +22,7 @@   hs-source-dirs:      src   exposed-modules:     Text.Pretty.Simple                      , Text.Pretty.Simple.Internal+                     , Text.Pretty.Simple.Internal.Color                      , Text.Pretty.Simple.Internal.Expr                      , Text.Pretty.Simple.Internal.ExprParser                      , Text.Pretty.Simple.Internal.ExprToOutput
src/Text/Pretty/Simple.hs view
@@ -20,30 +20,52 @@ 'pPrint' is the main go-to function when debugging Haskell code.  'pShow' and 'pString' are slight variations on 'pPrint'. -The other variations of 'pPrint', 'pShow', and 'pString' are for printing-without color and changing the indentation amount.  Most users can ignore these.+'pPrint', 'pShow', and 'pString' will pretty-print in color using ANSI escape+codes.  They look good on a console with a dark (black) background. The+variations 'pPrintLightBg', 'pShowLightBg', and 'pStringLightBg' are for+printing in color to a console with a light (white) background.  The variations+'pPrintNoColor', 'pShowNoColor', and 'pStringNoColor' are for pretty-printing+without using color. +The variations 'pPrintOpt', 'pShowOpt', and 'pStringOpt' are used when+specifying the 'OutputOptions'.  Most users can ignore these.+ See the Examples section at the end of this module for examples of acutally-using 'pPrint'.+using 'pPrint'.  See the+<https://github.com/cdepillabout/pretty-simple#textprettysimple README.md>+for examples of printing in color. -} module Text.Pretty.Simple   (-  -- * Output With Color-    pShow-  , pPrint+  -- * Output with color on dark background+    pPrint+  , pShow   , pString-  -- * Output With NO Color-  , pShowNoColor+  -- * Aliases for output with color on dark background+  , pPrintDarkBg+  , pShowDarkBg+  , pStringDarkBg+  -- * Output with color on light background+  , pPrintLightBg+  , pShowLightBg+  , pStringLightBg+  -- * Output with NO color   , pPrintNoColor+  , pShowNoColor   , pStringNoColor-  -- * Output With Output Options-  , pShowOpt+  -- * Output With 'OutputOptions'   , pPrintOpt+  , pShowOpt   , pStringOpt+  -- * 'OutputOptions'   , OutputOptions(..)-  , UseColor(..)-  , defaultOutputOptions-  , noColorOutputOptions+  , defaultOutputOptionsDarkBg+  , defaultOutputOptionsLightBg+  , defaultOutputOptionsNoColor+  -- * 'ColorOptions'+  -- $colorOptions+  , defaultColorOptionsDarkBg+  , defaultColorOptionsLightBg   -- * Examples   -- $examples   ) where@@ -60,12 +82,14 @@ import Data.Text.Lazy.IO as LText  import Text.Pretty.Simple.Internal-       (OutputOptions(..), UseColor(..), defaultOutputOptions,+       (OutputOptions(..), defaultColorOptionsDarkBg,+        defaultColorOptionsLightBg, defaultOutputOptionsDarkBg,+        defaultOutputOptionsLightBg, defaultOutputOptionsNoColor,         expressionParse, expressionsToOutputs, render) ---------------------------------- normal (color) functions ---------------------------------+----------------------------------------------------------+-- functions for printing in color to a dark background --+----------------------------------------------------------  -- | Pretty-print any data type that has a 'Show' instance. --@@ -75,13 +99,17 @@ -- @ --  pPrint :: Show a => a -> IO () -- @+--+-- This function is for printing to a dark background. pPrint :: (MonadIO m, Show a) => a -> m ()-pPrint = pPrintOpt defaultOutputOptions+pPrint = pPrintOpt defaultOutputOptionsDarkBg  -- | Similar to 'pPrint', but just return the resulting pretty-printed data -- type as a 'Text' instead of printing it to the screen.+--+-- This function is for printing to a dark background. pShow :: Show a => a -> Text-pShow = pShowOpt defaultOutputOptions+pShow = pShowOpt defaultOutputOptionsDarkBg  -- | Similar to 'pShow', but the first argument is a 'String' representing a -- data type that has already been 'show'ed.@@ -90,13 +118,47 @@ -- only requirement is that the strings are quoted, and braces, parentheses, and -- brackets are correctly used to represent indentation.  For example, -- 'pString' will correctly pretty-print JSON.+--+-- This function is for printing to a dark background. pString :: String -> Text-pString = pStringOpt defaultOutputOptions+pString = pStringOpt defaultOutputOptionsDarkBg ---------------------------- no-color functions ---------------------------+--------------------------------------------------------+-- aliases for printing in color to a dark background --+-------------------------------------------------------- +-- | Alias for 'pPrint'.+pPrintDarkBg :: (MonadIO m, Show a) => a -> m ()+pPrintDarkBg = pPrint++-- | Alias for 'pShow'.+pShowDarkBg :: Show a => a -> Text+pShowDarkBg = pShow++-- | Alias for 'pString'.+pStringDarkBg :: String -> Text+pStringDarkBg = pString++-----------------------------------------------------------+-- functions for printing in color to a light background --+-----------------------------------------------------------++-- | Just like 'pPrintDarkBg', but for printing to a light background.+pPrintLightBg :: (MonadIO m, Show a) => a -> m ()+pPrintLightBg = pPrintOpt defaultOutputOptionsLightBg++-- | Just like 'pShowDarkBg', but for printing to a light background.+pShowLightBg :: Show a => a -> Text+pShowLightBg = pShowOpt defaultOutputOptionsLightBg++-- | Just like 'pStringDarkBg', but for printing to a light background.+pStringLightBg :: String -> Text+pStringLightBg = pStringOpt defaultOutputOptionsLightBg++------------------------------------------+-- functions for printing without color --+------------------------------------------+ -- | Similar to 'pPrint', but doesn't print in color.  However, data types -- will still be indented nicely. --@@ -106,20 +168,15 @@ --     , "bye" --     ] pPrintNoColor :: (MonadIO m, Show a) => a -> m ()-pPrintNoColor = pPrintOpt noColorOutputOptions+pPrintNoColor = pPrintOpt defaultOutputOptionsNoColor  -- | Like 'pShow', but without color. pShowNoColor :: Show a => a -> Text-pShowNoColor = pShowOpt noColorOutputOptions+pShowNoColor = pShowOpt defaultOutputOptionsNoColor  -- | LIke 'pString', but without color. pStringNoColor :: String -> Text-pStringNoColor = pStringOpt noColorOutputOptions---- | 'noColorOutputOptions' is just like 'defaultOutputOptions', but--- 'outputOptionsUseColor' is set to 'NoColor'.-noColorOutputOptions :: OutputOptions-noColorOutputOptions = defaultOutputOptions {outputOptionsUseColor = NoColor}+pStringNoColor = pStringOpt defaultOutputOptionsNoColor  --------------------------------- -- functions that take options --@@ -133,7 +190,7 @@ -- -- This is what the normal indentation looks like: ----- >>> pPrintOpt noColorOutputOptions $ Just ("hello", "bye")+-- >>> pPrintOpt defaultOutputOptionsNoColor $ Just ("hello", "bye") -- Just --     ( "hello" --     , "bye"@@ -141,7 +198,7 @@ -- -- This is what smaller indentation looks like: ----- >>> let smallIndent = noColorOutputOptions {outputOptionsIndentAmount = 1}+-- >>> let smallIndent = defaultOutputOptionsNoColor {outputOptionsIndentAmount = 1} -- >>> pPrintOpt smallIndent $ Just ("hello", "bye") -- Just --  ( "hello"@@ -163,6 +220,11 @@     Left _ -> pack string     Right expressions ->       render outputOptions . toList $ expressionsToOutputs expressions++-- $colorOptions+--+-- Additional settings for color options can be found in+-- 'Text.Pretty.Simple.Internal.Color'.  -- $examples --
src/Text/Pretty/Simple/Internal.hs view
@@ -11,6 +11,7 @@   ( module X   ) where +import Text.Pretty.Simple.Internal.Color as X import Text.Pretty.Simple.Internal.ExprParser as X import Text.Pretty.Simple.Internal.Expr as X import Text.Pretty.Simple.Internal.ExprToOutput as X
+ src/Text/Pretty/Simple/Internal/Color.hs view
@@ -0,0 +1,307 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TemplateHaskell #-}++{-|+Module      : Text.Pretty.Simple.Internal.OutputPrinter+Copyright   : (c) Dennis Gosnell, 2016+License     : BSD-style (see LICENSE file)+Maintainer  : cdep.illabout@gmail.com+Stability   : experimental+Portability : POSIX++-}+module Text.Pretty.Simple.Internal.Color+  where++#if __GLASGOW_HASKELL__ < 710+-- We don't need this import for GHC 7.10 as it exports all required functions+-- from Prelude+import Control.Applicative+#endif++import Data.Text.Lazy.Builder (Builder, fromString)+import Data.Typeable (Typeable)+import GHC.Generics (Generic)+import System.Console.ANSI+       (Color(..), ColorIntensity(..), ConsoleIntensity(..),+        ConsoleLayer(..), SGR(..), setSGRCode)++-- | These options are for colorizing the output of functions like 'pPrint'.+--+-- For example, if you set 'colorQuote' to something like 'colorVividBlueBold',+-- then the quote character (@\"@) will be output as bright blue in bold.+--+-- If you don't want to use a color for one of the options, use 'colorNull'.+data ColorOptions = ColorOptions+  { colorQuote :: Builder+  -- ^ Color to use for quote characters (@\"@) around strings.+  , colorString :: Builder+  -- ^ Color to use for strings.+  , colorError :: Builder+  -- ^ (currently not used)+  , colorNum :: Builder+  -- ^ (currently not used)+  , colorRainbowParens :: [Builder]+  -- ^ A list of 'Builder' colors to use for rainbow parenthesis output.  Use+  -- '[]' if you don't want rainbow parenthesis.  Use just a single item if you+  -- want all the rainbow parenthesis to be colored the same.+  } deriving (Eq, Generic, Show, Typeable)++------------------------------------+-- Dark background default colors --+------------------------------------++-- | Default color options for use on a dark background.+--+-- 'colorQuote' is 'defaultColorQuoteDarkBg'. 'colorString' is+-- 'defaultColorStringDarkBg'.  'colorError' is 'defaultColorErrorDarkBg'.+-- 'colorNum' is 'defaultColorNumDarkBg'.  'colorRainbowParens' is+-- 'defaultColorRainboxParensDarkBg'.+defaultColorOptionsDarkBg :: ColorOptions+defaultColorOptionsDarkBg =+  ColorOptions+  { colorQuote = defaultColorQuoteDarkBg+  , colorString = defaultColorStringDarkBg+  , colorError = defaultColorErrorDarkBg+  , colorNum = defaultColorNumDarkBg+  , colorRainbowParens = defaultColorRainbowParensDarkBg+  }++-- | Default color for 'colorQuote' for dark backgrounds. This is+-- 'colorVividWhiteBold'.+defaultColorQuoteDarkBg :: Builder+defaultColorQuoteDarkBg = colorVividWhiteBold++-- | Default color for 'colorString' for dark backgrounds. This is+-- 'colorVividBlueBold'.+defaultColorStringDarkBg :: Builder+defaultColorStringDarkBg = colorVividBlueBold++-- | Default color for 'colorError' for dark backgrounds.  This is+-- 'colorVividRedBold'.+defaultColorErrorDarkBg :: Builder+defaultColorErrorDarkBg = colorVividRedBold++-- | Default color for 'colorNum' for dark backgrounds.  This is+-- 'colorVividGreenBold'.+defaultColorNumDarkBg :: Builder+defaultColorNumDarkBg = colorVividGreenBold++-- | Default colors for 'colorRainbowParens' for dark backgrounds.+defaultColorRainbowParensDarkBg :: [Builder]+defaultColorRainbowParensDarkBg =+  [ colorVividMagentaBold+  , colorVividCyanBold+  , colorVividYellowBold+  , colorDullMagenta+  , colorDullCyan+  , colorDullYellow+  , colorDullMagentaBold+  , colorDullCyanBold+  , colorDullYellowBold+  , colorVividMagenta+  , colorVividCyan+  , colorVividYellow+  ]++-------------------------------------+-- Light background default colors --+-------------------------------------++-- | Default color options for use on a light background.+--+-- 'colorQuote' is 'defaultColorQuoteLightBg'. 'colorString' is+-- 'defaultColorStringLightBg'.  'colorError' is 'defaultColorErrorLightBg'.+-- 'colorNum' is 'defaultColorNumLightBg'.  'colorRainbowParens' is+-- 'defaultColorRainboxParensLightBg'.+defaultColorOptionsLightBg :: ColorOptions+defaultColorOptionsLightBg =+  ColorOptions+  { colorQuote = defaultColorQuoteLightBg+  , colorString = defaultColorStringLightBg+  , colorError = defaultColorErrorLightBg+  , colorNum = defaultColorNumLightBg+  , colorRainbowParens = defaultColorRainbowParensLightBg+  }++-- | Default color for 'colorQuote' for light backgrounds. This is+-- 'colorVividWhiteBold'.+defaultColorQuoteLightBg :: Builder+defaultColorQuoteLightBg = colorVividBlackBold++-- | Default color for 'colorString' for light backgrounds. This is+-- 'colorVividBlueBold'.+defaultColorStringLightBg :: Builder+defaultColorStringLightBg = colorVividBlueBold++-- | Default color for 'colorError' for light backgrounds.  This is+-- 'colorVividRedBold'.+defaultColorErrorLightBg :: Builder+defaultColorErrorLightBg = colorVividRedBold++-- | Default color for 'colorNum' for light backgrounds.  This is+-- 'colorVividGreenBold'.+defaultColorNumLightBg :: Builder+defaultColorNumLightBg = colorVividGreenBold++-- | Default colors for 'colorRainbowParens' for light backgrounds.+defaultColorRainbowParensLightBg :: [Builder]+defaultColorRainbowParensLightBg =+  [ colorVividMagentaBold+  , colorVividCyanBold+  , colorDullMagenta+  , colorDullCyan+  , colorDullMagentaBold+  , colorDullCyanBold+  , colorVividMagenta+  , colorVividCyan+  ]++-----------------------+-- Vivid Bold Colors --+-----------------------++colorVividBlackBold :: Builder+colorVividBlackBold = colorBold `mappend` colorVividBlack++colorVividBlueBold :: Builder+colorVividBlueBold = colorBold `mappend` colorVividBlue++colorVividCyanBold :: Builder+colorVividCyanBold = colorBold `mappend` colorVividCyan++colorVividGreenBold :: Builder+colorVividGreenBold = colorBold `mappend` colorVividGreen++colorVividMagentaBold :: Builder+colorVividMagentaBold = colorBold `mappend` colorVividMagenta++colorVividRedBold :: Builder+colorVividRedBold = colorBold `mappend` colorVividRed++colorVividWhiteBold :: Builder+colorVividWhiteBold = colorBold `mappend` colorVividWhite++colorVividYellowBold :: Builder+colorVividYellowBold = colorBold `mappend` colorVividYellow++-----------------------+-- Dull Bold Colors --+-----------------------++colorDullBlackBold :: Builder+colorDullBlackBold = colorBold `mappend` colorDullBlack++colorDullBlueBold :: Builder+colorDullBlueBold = colorBold `mappend` colorDullBlue++colorDullCyanBold :: Builder+colorDullCyanBold = colorBold `mappend` colorDullCyan++colorDullGreenBold :: Builder+colorDullGreenBold = colorBold `mappend` colorDullGreen++colorDullMagentaBold :: Builder+colorDullMagentaBold = colorBold `mappend` colorDullMagenta++colorDullRedBold :: Builder+colorDullRedBold = colorBold `mappend` colorDullRed++colorDullWhiteBold :: Builder+colorDullWhiteBold = colorBold `mappend` colorDullWhite++colorDullYellowBold :: Builder+colorDullYellowBold = colorBold `mappend` colorDullYellow++------------------+-- Vivid Colors --+------------------++colorVividBlack :: Builder+colorVividBlack = colorHelper Vivid Black++colorVividBlue :: Builder+colorVividBlue = colorHelper Vivid Blue++colorVividCyan :: Builder+colorVividCyan = colorHelper Vivid Cyan++colorVividGreen :: Builder+colorVividGreen = colorHelper Vivid Green++colorVividMagenta :: Builder+colorVividMagenta = colorHelper Vivid Magenta++colorVividRed :: Builder+colorVividRed = colorHelper Vivid Red++colorVividWhite :: Builder+colorVividWhite = colorHelper Vivid White++colorVividYellow :: Builder+colorVividYellow = colorHelper Vivid Yellow++------------------+-- Dull Colors --+------------------++colorDullBlack :: Builder+colorDullBlack = colorHelper Dull Black++colorDullBlue :: Builder+colorDullBlue = colorHelper Dull Blue++colorDullCyan :: Builder+colorDullCyan = colorHelper Dull Cyan++colorDullGreen :: Builder+colorDullGreen = colorHelper Dull Green++colorDullMagenta :: Builder+colorDullMagenta = colorHelper Dull Magenta++colorDullRed :: Builder+colorDullRed = colorHelper Dull Red++colorDullWhite :: Builder+colorDullWhite = colorHelper Dull White++colorDullYellow :: Builder+colorDullYellow = colorHelper Dull Yellow++--------------------+-- Special Colors --+--------------------++-- | Change the intensity to 'BoldIntensity'.+colorBold :: Builder+colorBold = setSGRCodeBuilder [SetConsoleIntensity BoldIntensity]++-- | 'Reset' the console color back to normal.+colorReset :: Builder+colorReset = setSGRCodeBuilder [Reset]++-- | Empty string.+colorNull :: Builder+colorNull = ""++-------------+-- Helpers --+-------------++-- | Helper for creating a 'Builder' for an ANSI escape sequence color based on+-- a 'ColorIntensity' and a 'Color'.+colorHelper :: ColorIntensity -> Color -> Builder+colorHelper colorIntensity color =+  setSGRCodeBuilder [SetColor Foreground colorIntensity color]++-- | Convert a list of 'SGR' to a 'Builder'.+setSGRCodeBuilder :: [SGR] -> Builder+setSGRCodeBuilder = fromString . setSGRCode+
src/Text/Pretty/Simple/Internal/OutputPrinter.hs view
@@ -2,6 +2,7 @@ {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-}@@ -26,46 +27,64 @@ #endif  import Control.Monad.Reader (MonadReader(reader), runReader)-import Data.Data (Data) import Data.Foldable (fold, foldlM) import Data.Text.Lazy (Text) import Data.Text.Lazy.Builder (Builder, fromString, toLazyText) import Data.Typeable (Typeable) import GHC.Generics (Generic)-import System.Console.ANSI-       (Color(..), ColorIntensity(..), ConsoleIntensity(..),-        ConsoleLayer(..), SGR(..), setSGRCode) +import Text.Pretty.Simple.Internal.Color+       (ColorOptions(..), colorReset, defaultColorOptionsDarkBg,+        defaultColorOptionsLightBg) import Text.Pretty.Simple.Internal.Output        (NestLevel(..), Output(..), OutputType(..)) --- | 'UseColor' describes whether or not we want to use color when printing the--- 'Output' list.-data UseColor-  = NoColor-  | UseColor-  deriving (Data, Eq, Generic, Read, Show, Typeable)- -- | Data-type wrapping up all the options available when rendering the list -- of 'Output's. data OutputOptions = OutputOptions   { outputOptionsIndentAmount :: Int   -- ^ Number of spaces to use when indenting.  It should probably be either 2   -- or 4.-  , outputOptionsUseColor :: UseColor-  -- ^ Whether or not to use ansi escape sequences to print colors.-  } deriving (Data, Eq, Generic, Read, Show, Typeable)+  , outputOptionsColorOptions :: Maybe ColorOptions+  -- ^ If this is 'Nothing', then don't colorize the output.  If this is+  -- @'Just' colorOptions@, then use @colorOptions@ to colorize the output.+  } deriving (Eq, Generic, Show, Typeable) --- | Default values for 'OutputOptions'.  'outputOptionsIndentAmount' defaults--- to 4, and 'outputOptionsUseColor' defaults to 'UseColor'.-defaultOutputOptions :: OutputOptions-defaultOutputOptions =+-- | Default values for 'OutputOptions' when printing to a console with a dark+-- background.  'outputOptionsIndentAmount' is 4, and+-- 'outputOptionsColorOptions' is 'defaultColorOptionsDarkBg'.+defaultOutputOptionsDarkBg :: OutputOptions+defaultOutputOptionsDarkBg =   OutputOptions-  {outputOptionsIndentAmount = 4, outputOptionsUseColor = UseColor}+  { outputOptionsIndentAmount = 4+  , outputOptionsColorOptions = Just defaultColorOptionsDarkBg+  } +-- | Default values for 'OutputOptions' when printing to a console with a light+-- background.  'outputOptionsIndentAmount' is 4, and+-- 'outputOptionsColorOptions' is 'defaultColorOptionsLightBg'.+defaultOutputOptionsLightBg :: OutputOptions+defaultOutputOptionsLightBg =+  OutputOptions+  { outputOptionsIndentAmount = 4+  , outputOptionsColorOptions = Just defaultColorOptionsLightBg+  }++-- | Default values for 'OutputOptions' when printing using using ANSI escape+-- sequences for color.  'outputOptionsIndentAmount' is 4, and+-- 'outputOptionsColorOptions' is 'Nothing'.+defaultOutputOptionsNoColor :: OutputOptions+defaultOutputOptionsNoColor =+  OutputOptions+  {outputOptionsIndentAmount = 4, outputOptionsColorOptions = Nothing}++-- | Given 'OutputOptions' and a list of 'Output', turn the 'Output' into a+-- lazy 'Text'. render :: OutputOptions -> [Output] -> Text render options outputs = toLazyText $ runReader (renderOutputs outputs) options +-- | Turn a list of 'Output' into a 'Builder', using the options specified in+-- the 'OutputOptions'. renderOutputs   :: forall m.      MonadReader OutputOptions m@@ -75,12 +94,8 @@     foldFunc :: Builder -> Output -> m Builder     foldFunc accum output = mappend accum <$> renderOutput output -renderRaibowParenFor-  :: MonadReader OutputOptions m-  => NestLevel -> Builder -> m Builder-renderRaibowParenFor nest string =-  sequenceFold [rainbowParen nest, pure string, colorReset]-+-- | Render a single 'Output' as a 'Builder', using the options specified in+-- the 'OutputOptions'. renderOutput :: MonadReader OutputOptions m => Output -> m Builder renderOutput (Output nest OutputCloseBrace) = renderRaibowParenFor nest "}" renderOutput (Output nest OutputCloseBracket) = renderRaibowParenFor nest "]"@@ -98,16 +113,71 @@   pure $ fromString string renderOutput (Output _ (OutputStringLit string)) = do   sequenceFold-    [ colorQuote+    [ useColorQuote     , pure "\""-    , colorString+    , useColorReset+    , useColorString     -- TODO: This probably shouldn't be a string to begin with.     , pure $ fromString string-    , colorQuote+    , useColorReset+    , useColorQuote     , pure "\""-    , colorReset+    , useColorReset     ] +-- | Produce a 'Builder' corresponding to the ANSI escape sequence for the+-- color for the @\"@, based on whether or not 'outputOptionsColorOptions' is+-- 'Just' or 'Nothing', and the value of 'colorQuote'.+useColorQuote :: forall m. MonadReader OutputOptions m => m Builder+useColorQuote = maybe "" colorQuote <$> reader outputOptionsColorOptions++-- | Produce a 'Builder' corresponding to the ANSI escape sequence for the+-- color for the characters of a string, based on whether or not+-- 'outputOptionsColorOptions' is 'Just' or 'Nothing', and the value of+-- 'colorString'.+useColorString :: forall m. MonadReader OutputOptions m => m Builder+useColorString = maybe "" colorString <$> reader outputOptionsColorOptions++useColorError :: forall m. MonadReader OutputOptions m => m Builder+useColorError = maybe "" colorError <$> reader outputOptionsColorOptions++useColorNum :: forall m. MonadReader OutputOptions m => m Builder+useColorNum = maybe "" colorNum <$> reader outputOptionsColorOptions++-- | Produce a 'Builder' corresponding to the ANSI escape sequence for+-- resetting the console color back to the default. Produces an empty 'Builder'+-- if 'outputOptionsColorOptions' is 'Nothing'.+useColorReset :: forall m. MonadReader OutputOptions m => m Builder+useColorReset = maybe "" (const colorReset) <$> reader outputOptionsColorOptions++-- | Produce a 'Builder' representing the ANSI escape sequence for the color of+-- the rainbow parenthesis, given an input 'NestLevel' and 'Builder' to use as+-- the input character.+--+-- If 'outputOptionsColorOptions' is 'Nothing', then just return the input+-- character.  If it is 'Just', then return the input character colorized.+renderRaibowParenFor+  :: MonadReader OutputOptions m+  => NestLevel -> Builder -> m Builder+renderRaibowParenFor nest string =+  sequenceFold [useColorRainbowParens nest, pure string, useColorReset]++useColorRainbowParens+  :: forall m.+     MonadReader OutputOptions m+  => NestLevel -> m Builder+useColorRainbowParens nest = do+  maybeOutputColor <- reader outputOptionsColorOptions+  pure $+    case maybeOutputColor of+      Just ColorOptions {colorRainbowParens} -> do+        let choicesLen = length colorRainbowParens+        if choicesLen == 0+          then ""+          else colorRainbowParens !! (unNestLevel nest `mod` choicesLen)+      Nothing -> ""++-- | This is simply @'fmap' 'fold' '.' 'sequence'@. sequenceFold :: (Monad f, Monoid a, Traversable t) => t (f a) -> f a sequenceFold = fmap fold . sequence @@ -155,89 +225,3 @@ shrinkWhitespace (' ':' ':t) = shrinkWhitespace (' ':t) shrinkWhitespace (h:t) = h : shrinkWhitespace t shrinkWhitespace "" = ""---------------------------- High-level colors ----------------------------colorQuote :: MonadReader OutputOptions m => m Builder-colorQuote = appendColors colorBold colorVividWhite--colorString :: MonadReader OutputOptions m => m Builder-colorString = appendColors colorBold colorVividBlue--colorError :: MonadReader OutputOptions m => m Builder-colorError = appendColors colorBold colorVividRed--colorNum :: MonadReader OutputOptions m => m Builder-colorNum = appendColors colorBold colorVividGreen--rainbowParen-  :: forall m.-     MonadReader OutputOptions m-  => NestLevel -> m Builder-rainbowParen (NestLevel nestLevel) =-  let choicesLen = length rainbowParenChoices-  in rainbowParenChoices !! (nestLevel `mod` choicesLen)-  where-    rainbowParenChoices :: [m Builder]-    rainbowParenChoices =-        [ appendColors colorBold colorVividMagenta-        , appendColors colorBold colorVividCyan-        , appendColors colorBold colorVividYellow-        ]--------------------------- Low-level Colors ---------------------------canUseColor :: MonadReader OutputOptions m => m Bool-canUseColor = do-  color <- reader outputOptionsUseColor-  case color of-    NoColor -> pure False-    UseColor -> pure True--ifM :: Monad m => m Bool -> a -> a -> m a-ifM comparisonM thenValue elseValue = do-  res <- comparisonM-  case res of-    True -> pure thenValue-    False -> pure elseValue--colorBold :: MonadReader OutputOptions m => m Builder-colorBold = ifM canUseColor (setSGRCodeBuilder [SetConsoleIntensity BoldIntensity]) ""--colorReset :: MonadReader OutputOptions m => m Builder-colorReset = ifM canUseColor (setSGRCodeBuilder [Reset]) ""--colorVividBlue :: MonadReader OutputOptions m => m Builder-colorVividBlue = colorHelper Vivid Blue--colorVividCyan :: MonadReader OutputOptions m => m Builder-colorVividCyan = colorHelper Vivid Cyan--colorVividGreen :: MonadReader OutputOptions m => m Builder-colorVividGreen = colorHelper Vivid Green--colorVividMagenta :: MonadReader OutputOptions m => m Builder-colorVividMagenta = colorHelper Vivid Magenta--colorVividRed :: MonadReader OutputOptions m => m Builder-colorVividRed = colorHelper Vivid Red--colorVividWhite :: MonadReader OutputOptions m => m Builder-colorVividWhite = colorHelper Vivid White--colorVividYellow :: MonadReader OutputOptions m => m Builder-colorVividYellow = colorHelper Vivid Yellow--colorHelper :: MonadReader OutputOptions m => ColorIntensity -> Color -> m Builder-colorHelper colorIntensity color =-  ifM canUseColor (setSGRCodeBuilder [SetColor Foreground colorIntensity color]) ""--appendColors :: MonadReader OutputOptions m => m Builder -> m Builder -> m Builder-appendColors color1 color2 = mappend <$> color1 <*> color2--setSGRCodeBuilder :: [SGR] -> Builder-setSGRCodeBuilder = fromString . setSGRCode