lib: begin supporting colour
Add some basic helpers for working with ANSI colour codes, and make strWidth and the various string layout functions aware of them.
This commit is contained in:
parent
1af0f66e73
commit
9a86c9ee52
@ -24,6 +24,7 @@ module Hledger.Utils (---- provide these frequently used modules - or not, for c
|
||||
module Hledger.Utils.String,
|
||||
module Hledger.Utils.Text,
|
||||
module Hledger.Utils.Test,
|
||||
module Hledger.Utils.Color,
|
||||
module Hledger.Utils.Tree,
|
||||
-- Debug.Trace.trace,
|
||||
-- module Data.PPrint,
|
||||
@ -55,6 +56,7 @@ import Hledger.Utils.Regex
|
||||
import Hledger.Utils.String
|
||||
import Hledger.Utils.Text
|
||||
import Hledger.Utils.Test
|
||||
import Hledger.Utils.Color
|
||||
import Hledger.Utils.Tree
|
||||
-- import Prelude hiding (readFile,writeFile,appendFile,getContents,putStr,putStrLn)
|
||||
-- import Hledger.Utils.UTF8IOCompat (readFile,writeFile,appendFile,getContents,putStr,putStrLn)
|
||||
|
||||
23
hledger-lib/Hledger/Utils/Color.hs
Normal file
23
hledger-lib/Hledger/Utils/Color.hs
Normal file
@ -0,0 +1,23 @@
|
||||
-- | Basic color helpers for prettifying console output.
|
||||
|
||||
{-# LANGUAGE OverloadedStrings #-}
|
||||
|
||||
module Hledger.Utils.Color
|
||||
(
|
||||
color,
|
||||
bgColor,
|
||||
Color(..),
|
||||
ColorIntensity(..)
|
||||
)
|
||||
where
|
||||
|
||||
import System.Console.ANSI
|
||||
|
||||
|
||||
-- | Wrap a string in ANSI codes to set and reset foreground colour.
|
||||
color :: ColorIntensity -> Color -> String -> String
|
||||
color int col s = setSGRCode [SetColor Foreground int col] ++ s ++ setSGRCode []
|
||||
|
||||
-- | Wrap a string in ANSI codes to set and reset background colour.
|
||||
bgColor :: ColorIntensity -> Color -> String -> String
|
||||
bgColor int col s = setSGRCode [SetColor Background int col] ++ s ++ setSGRCode []
|
||||
@ -15,6 +15,7 @@ module Hledger.Utils.String (
|
||||
escapeQuotes,
|
||||
words',
|
||||
unwords',
|
||||
stripAnsi,
|
||||
-- * single-line layout
|
||||
strip,
|
||||
lstrip,
|
||||
@ -319,12 +320,17 @@ takeWidth w (c:cs) | cw <= w = c:takeWidth (w-cw) cs
|
||||
-- from Pandoc (copyright John MacFarlane, GPL)
|
||||
-- see also http://unicode.org/reports/tr11/#Description
|
||||
|
||||
-- | Calculate the designated render width of a string, taking into
|
||||
-- account wide characters and line breaks (the longest line within a
|
||||
-- multi-line string determines the width ).
|
||||
-- | Calculate the render width of a string, considering
|
||||
-- wide characters (counted as double width), ANSI escape codes
|
||||
-- (not counted), and line breaks (in a multi-line string, the longest
|
||||
-- line determines the width).
|
||||
strWidth :: String -> Int
|
||||
strWidth "" = 0
|
||||
strWidth s = maximum $ map (foldr (\a b -> charWidth a + b) 0) $ lines s
|
||||
strWidth s = maximum $ map (foldr (\a b -> charWidth a + b) 0) $ lines s'
|
||||
where s' = stripAnsi s
|
||||
|
||||
stripAnsi :: String -> String
|
||||
stripAnsi = regexReplace "\ESC\\[([0-9]+;)*([0-9]+)?[ABCDHJKfmsu]" ""
|
||||
|
||||
-- | Get the designated render width of a character: 0 for a combining
|
||||
-- character, 1 for a regular character, 2 for a wide character.
|
||||
|
||||
@ -59,6 +59,7 @@ library
|
||||
build-depends:
|
||||
base >=4.8 && <5
|
||||
, base-compat >=0.8.1
|
||||
, ansi-terminal >= 0.6.2.3 && < 0.7
|
||||
, array
|
||||
, blaze-markup >=0.5.1
|
||||
, bytestring
|
||||
@ -131,6 +132,7 @@ library
|
||||
Hledger.Reports.PostingsReport
|
||||
Hledger.Reports.TransactionsReports
|
||||
Hledger.Utils
|
||||
Hledger.Utils.Color
|
||||
Hledger.Utils.Debug
|
||||
Hledger.Utils.Parse
|
||||
Hledger.Utils.Regex
|
||||
@ -153,6 +155,7 @@ test-suite doctests
|
||||
build-depends:
|
||||
base >=4.8 && <5
|
||||
, base-compat >=0.8.1
|
||||
, ansi-terminal >= 0.6.2.3 && < 0.7
|
||||
, array
|
||||
, blaze-markup >=0.5.1
|
||||
, bytestring
|
||||
@ -218,6 +221,7 @@ test-suite doctests
|
||||
Hledger.Reports.ReportOptions
|
||||
Hledger.Reports.TransactionsReports
|
||||
Hledger.Utils
|
||||
Hledger.Utils.Color
|
||||
Hledger.Utils.Debug
|
||||
Hledger.Utils.Parse
|
||||
Hledger.Utils.Regex
|
||||
@ -238,6 +242,7 @@ test-suite hunittests
|
||||
build-depends:
|
||||
base >=4.8 && <5
|
||||
, base-compat >=0.8.1
|
||||
, ansi-terminal >= 0.6.2.3 && < 0.7
|
||||
, array
|
||||
, blaze-markup >=0.5.1
|
||||
, bytestring
|
||||
@ -312,6 +317,7 @@ test-suite hunittests
|
||||
Hledger.Reports.ReportOptions
|
||||
Hledger.Reports.TransactionsReports
|
||||
Hledger.Utils
|
||||
Hledger.Utils.Color
|
||||
Hledger.Utils.Debug
|
||||
Hledger.Utils.Parse
|
||||
Hledger.Utils.Regex
|
||||
|
||||
@ -41,6 +41,7 @@ flags:
|
||||
dependencies:
|
||||
- base >=4.8 && <5
|
||||
- base-compat >=0.8.1
|
||||
- ansi-terminal >= 0.6.2.3 && < 0.7
|
||||
- array
|
||||
- blaze-markup >=0.5.1
|
||||
- bytestring
|
||||
@ -117,6 +118,7 @@ library:
|
||||
- Hledger.Reports.PostingsReport
|
||||
- Hledger.Reports.TransactionsReports
|
||||
- Hledger.Utils
|
||||
- Hledger.Utils.Color
|
||||
- Hledger.Utils.Debug
|
||||
- Hledger.Utils.Parse
|
||||
- Hledger.Utils.Regex
|
||||
|
||||
@ -17,7 +17,7 @@ import Graphics.Vty (Event(..),Key(..),Color,Attr,currentAttr)
|
||||
import Lens.Micro.Platform
|
||||
import System.Process
|
||||
|
||||
import Hledger
|
||||
import Hledger hiding (Color)
|
||||
import Hledger.UI.UITypes
|
||||
import Hledger.UI.UIState
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user