add a color argument to most amount show helpers, drop cshow variants
This is an API change, but it seems better than having additional colour-supporting variants and trying to avoid duplicated code. I stopped short of changing showAmount, so cshowAmount still exists.
This commit is contained in:
parent
2739a70a38
commit
44c3eb1904
@ -122,9 +122,6 @@ module Hledger.Data.Amount (
|
||||
showMixedAmountWithoutPrice,
|
||||
showMixedAmountOneLineWithoutPrice,
|
||||
showMixedAmountElided,
|
||||
cshowMixedAmountWithoutPrice,
|
||||
cshowMixedAmountOneLineWithoutPrice,
|
||||
cshowMixedAmountElided,
|
||||
showMixedAmountWithZeroCommodity,
|
||||
showMixedAmountWithPrecision,
|
||||
setMixedAmountPrecision,
|
||||
@ -150,7 +147,6 @@ import Hledger.Data.Types
|
||||
import Hledger.Data.Commodity
|
||||
import Hledger.Utils
|
||||
|
||||
|
||||
deriving instance Show MarketPrice
|
||||
|
||||
|
||||
@ -272,7 +268,7 @@ digits = "123456789" :: String
|
||||
-- | Does mixed amount appear to be zero when rendered with its
|
||||
-- display precision ?
|
||||
amountLooksZero :: Amount -> Bool
|
||||
amountLooksZero = not . any (`elem` digits) . showAmountWithoutPriceOrCommodity
|
||||
amountLooksZero = not . any (`elem` digits) . (showAmountWithoutPriceOrCommodity False)
|
||||
|
||||
-- | Is this amount exactly zero, ignoring its display precision ?
|
||||
amountIsZero :: Amount -> Bool
|
||||
@ -325,8 +321,11 @@ showAmountDebug Amount{acommodity="AUTO"} = "(missing)"
|
||||
showAmountDebug Amount{..} = printf "Amount {acommodity=%s, aquantity=%s, aprice=%s, astyle=%s}" (show acommodity) (show aquantity) (showAmountPriceDebug aprice) (show astyle)
|
||||
|
||||
-- | Get the string representation of an amount, without any \@ price.
|
||||
showAmountWithoutPrice :: Amount -> String
|
||||
showAmountWithoutPrice a = showAmount a{aprice=Nothing}
|
||||
-- With a True argument, adds ANSI codes to show negative amounts in red.
|
||||
showAmountWithoutPrice :: Bool -> Amount -> String
|
||||
showAmountWithoutPrice c a = showamt a{aprice=Nothing}
|
||||
where
|
||||
showamt = if c then cshowAmount else showAmount
|
||||
|
||||
-- | Set an amount's internal precision, ie rounds the Decimal representing
|
||||
-- the amount's quantity to some number of decimal places.
|
||||
@ -353,13 +352,12 @@ setAmountDecimalPoint mc a@Amount{ astyle=s } = a{ astyle=s{asdecimalpoint=mc} }
|
||||
withDecimalPoint :: Amount -> Maybe Char -> Amount
|
||||
withDecimalPoint = flip setAmountDecimalPoint
|
||||
|
||||
-- | Colour version.
|
||||
cshowAmountWithoutPrice :: Amount -> String
|
||||
cshowAmountWithoutPrice a = cshowAmount a{aprice=Nothing}
|
||||
|
||||
-- | Get the string representation of an amount, without any price or commodity symbol.
|
||||
showAmountWithoutPriceOrCommodity :: Amount -> String
|
||||
showAmountWithoutPriceOrCommodity a = showAmount a{acommodity="", aprice=Nothing}
|
||||
-- With a True argument, adds ANSI codes to show negative amounts in red.
|
||||
showAmountWithoutPriceOrCommodity :: Bool -> Amount -> String
|
||||
showAmountWithoutPriceOrCommodity c a = showamt a{acommodity="", aprice=Nothing}
|
||||
where
|
||||
showamt = if c then cshowAmount else showAmount
|
||||
|
||||
showAmountPrice :: Maybe AmountPrice -> String
|
||||
showAmountPrice Nothing = ""
|
||||
@ -700,23 +698,14 @@ showMixedAmountDebug m | m == missingmixedamt = "(missing)"
|
||||
-- TODO these and related fns are comically complicated:
|
||||
|
||||
-- | Get the string representation of a mixed amount, without showing any transaction prices.
|
||||
showMixedAmountWithoutPrice :: MixedAmount -> String
|
||||
showMixedAmountWithoutPrice m = intercalate "\n" $ map showamt as
|
||||
where
|
||||
Mixed as = normaliseMixedAmountSquashPricesForDisplay $ mixedAmountStripPrices m
|
||||
showamt = printf (printf "%%%ds" width) . showAmountWithoutPrice
|
||||
where
|
||||
width = maximumDef 0 $ map (length . showAmount) as
|
||||
|
||||
-- | Colour version of showMixedAmountWithoutPrice. Any individual Amount
|
||||
-- which is negative is wrapped in ANSI codes to make it display in red.
|
||||
cshowMixedAmountWithoutPrice :: MixedAmount -> String
|
||||
cshowMixedAmountWithoutPrice m = intercalate "\n" $ map showamt as
|
||||
-- With a True argument, adds ANSI codes to show negative amounts in red.
|
||||
showMixedAmountWithoutPrice :: Bool -> MixedAmount -> String
|
||||
showMixedAmountWithoutPrice c m = intercalate "\n" $ map showamt as
|
||||
where
|
||||
Mixed as = normaliseMixedAmountSquashPricesForDisplay $ mixedAmountStripPrices m
|
||||
showamt a =
|
||||
(if isNegativeAmount a then color Dull Red else id) $
|
||||
printf (printf "%%%ds" width) $ showAmountWithoutPrice a
|
||||
(if c && isNegativeAmount a then color Dull Red else id) $
|
||||
printf (printf "%%%ds" width) $ showAmountWithoutPrice c a
|
||||
where
|
||||
width = maximumDef 0 $ map (length . showAmount) as
|
||||
|
||||
@ -725,41 +714,21 @@ mixedAmountStripPrices (Mixed as) = Mixed $ map (\a -> a{aprice=Nothing}) as
|
||||
|
||||
-- | Get the one-line string representation of a mixed amount, but without
|
||||
-- any \@ prices.
|
||||
showMixedAmountOneLineWithoutPrice :: MixedAmount -> String
|
||||
showMixedAmountOneLineWithoutPrice m = intercalate ", " $ map showAmountWithoutPrice as
|
||||
where
|
||||
(Mixed as) = normaliseMixedAmountSquashPricesForDisplay $ stripPrices m
|
||||
stripPrices (Mixed as) = Mixed $ map stripprice as where stripprice a = a{aprice=Nothing}
|
||||
|
||||
-- | Colour version.
|
||||
cshowMixedAmountOneLineWithoutPrice :: MixedAmount -> String
|
||||
cshowMixedAmountOneLineWithoutPrice m = intercalate ", " $ map cshowAmountWithoutPrice as
|
||||
-- With a True argument, adds ANSI codes to show negative amounts in red.
|
||||
showMixedAmountOneLineWithoutPrice :: Bool -> MixedAmount -> String
|
||||
showMixedAmountOneLineWithoutPrice c m =
|
||||
intercalate ", " $ map (showAmountWithoutPrice c) as
|
||||
where
|
||||
(Mixed as) = normaliseMixedAmountSquashPricesForDisplay $ stripPrices m
|
||||
stripPrices (Mixed as) = Mixed $ map stripprice as where stripprice a = a{aprice=Nothing}
|
||||
|
||||
-- | Like showMixedAmountOneLineWithoutPrice, but show at most two commodities,
|
||||
-- with a elision indicator if there are more.
|
||||
showMixedAmountElided :: MixedAmount -> String
|
||||
showMixedAmountElided m = intercalate ", " $ take 2 astrs ++ elisionstr
|
||||
-- With a True argument, adds ANSI codes to show negative amounts in red.
|
||||
showMixedAmountElided :: Bool -> MixedAmount -> String
|
||||
showMixedAmountElided c m = intercalate ", " $ take 2 astrs ++ elisionstr
|
||||
where
|
||||
astrs = map showAmountWithoutPrice as
|
||||
where
|
||||
(Mixed as) = normaliseMixedAmountSquashPricesForDisplay $ stripPrices m
|
||||
where
|
||||
stripPrices (Mixed as) = Mixed $ map stripprice as
|
||||
where
|
||||
stripprice a = a{aprice=Nothing}
|
||||
elisionstr | n > 2 = [show (n - 2) ++ " more.."]
|
||||
| otherwise = []
|
||||
where
|
||||
n = length astrs
|
||||
|
||||
-- | Colour version.
|
||||
cshowMixedAmountElided :: MixedAmount -> String
|
||||
cshowMixedAmountElided m = intercalate ", " $ take 2 astrs ++ elisionstr
|
||||
where
|
||||
astrs = map cshowAmountWithoutPrice as
|
||||
astrs = map (showAmountWithoutPrice c) as
|
||||
where
|
||||
(Mixed as) = normaliseMixedAmountSquashPricesForDisplay $ stripPrices m
|
||||
where
|
||||
@ -846,8 +815,8 @@ tests_Amount = tests "Amount" [
|
||||
|
||||
,test "showMixedAmountWithoutPrice" $ do
|
||||
let a = usd 1 `at` eur 2
|
||||
showMixedAmountWithoutPrice (Mixed [a]) @?= "$1.00"
|
||||
showMixedAmountWithoutPrice (Mixed [a, -a]) @?= "0"
|
||||
showMixedAmountWithoutPrice False (Mixed [a]) @?= "$1.00"
|
||||
showMixedAmountWithoutPrice False (Mixed [a, -a]) @?= "0"
|
||||
|
||||
,tests "normaliseMixedAmount" [
|
||||
test "a missing amount overrides any other amounts" $
|
||||
|
||||
@ -263,7 +263,7 @@ budgetReportAsText ropts@ReportOpts{..} budgetr =
|
||||
budgetwidth = maximum' $ map snd amountsAndGoals
|
||||
amountsAndGoals = map (\(a,g) -> (amountLength a, amountLength g))
|
||||
. concatMap prrAmounts $ prRows budgetr
|
||||
where amountLength = maybe 0 (length . showMixedAmountOneLineWithoutPrice)
|
||||
where amountLength = maybe 0 (length . showMixedAmountOneLineWithoutPrice False)
|
||||
-- XXX lay out actual, percentage and/or goal in the single table cell for now, should probably use separate cells
|
||||
showcell :: BudgetCell -> String
|
||||
showcell (mactual, mbudget) = actualstr ++ " " ++ budgetstr
|
||||
@ -296,12 +296,10 @@ budgetReportAsText ropts@ReportOpts{..} budgetr =
|
||||
Nothing
|
||||
where
|
||||
maybecost = if valuationTypeIsCost ropts then mixedAmountCost else id
|
||||
showamt :: MixedAmount -> String
|
||||
showamt | color_ = cshowMixedAmountOneLineWithoutPrice
|
||||
| otherwise = showMixedAmountOneLineWithoutPrice
|
||||
showamt = showMixedAmountOneLineWithoutPrice color_
|
||||
|
||||
-- don't show the budget amount in color, it messes up alignment
|
||||
showbudgetamt = showMixedAmountOneLineWithoutPrice
|
||||
-- don't show the budget amount in color, it messes up alignment (XXX)
|
||||
showbudgetamt = showMixedAmountOneLineWithoutPrice False
|
||||
|
||||
maybetranspose | transpose_ = \(Table rh ch vals) -> Table ch rh (transpose vals)
|
||||
| otherwise = id
|
||||
|
||||
@ -108,7 +108,7 @@ asInit d reset ui@UIState{
|
||||
AccountsScreenItem{asItemIndentLevel = indent
|
||||
,asItemAccountName = fullacct
|
||||
,asItemDisplayAccountName = replaceHiddenAccountsNameWith "All" $ if tree_ ropts' then shortacct else fullacct
|
||||
,asItemRenderedAmounts = map showAmountWithoutPrice amts -- like showMixedAmountOneLineWithoutPrice
|
||||
,asItemRenderedAmounts = map (showAmountWithoutPrice False) amts
|
||||
}
|
||||
where
|
||||
Mixed amts = normaliseMixedAmountSquashPricesForDisplay $ stripPrices bal
|
||||
|
||||
@ -95,8 +95,8 @@ rsInit d reset ui@UIState{aopts=_uopts@UIOpts{cliopts_=CliOpts{reportopts_=ropts
|
||||
[s] -> s
|
||||
ss -> intercalate ", " ss
|
||||
-- _ -> "<split>" -- should do this if accounts field width < 30
|
||||
,rsItemChangeAmount = showMixedAmountOneLineWithoutPrice change
|
||||
,rsItemBalanceAmount = showMixedAmountOneLineWithoutPrice bal
|
||||
,rsItemChangeAmount = showMixedAmountOneLineWithoutPrice False change
|
||||
,rsItemBalanceAmount = showMixedAmountOneLineWithoutPrice False bal
|
||||
,rsItemTransaction = t
|
||||
}
|
||||
-- blank items are added to allow more control of scroll position; we won't allow movement over these
|
||||
|
||||
@ -102,7 +102,7 @@ accountOnlyQuery = ("inacctonly:" <>) . quoteIfSpaced
|
||||
|
||||
mixedAmountAsHtml :: MixedAmount -> HtmlUrl a
|
||||
mixedAmountAsHtml b _ =
|
||||
for_ (lines (showMixedAmountWithoutPrice b)) $ \t -> do
|
||||
for_ (lines (showMixedAmountWithoutPrice False b)) $ \t -> do
|
||||
H.span ! A.class_ c $ toHtml t
|
||||
H.br
|
||||
where
|
||||
|
||||
@ -349,11 +349,11 @@ balance opts@CliOpts{rawopts_=rawopts,reportopts_=ropts@ReportOpts{..}} j = do
|
||||
balanceReportAsCsv :: ReportOpts -> BalanceReport -> CSV
|
||||
balanceReportAsCsv opts (items, total) =
|
||||
["account","balance"] :
|
||||
[[T.unpack a, showMixedAmountOneLineWithoutPrice b] | (a, _, _, b) <- items]
|
||||
[[T.unpack a, showMixedAmountOneLineWithoutPrice False b] | (a, _, _, b) <- items]
|
||||
++
|
||||
if no_total_ opts
|
||||
then []
|
||||
else [["total", showMixedAmountOneLineWithoutPrice total]]
|
||||
else [["total", showMixedAmountOneLineWithoutPrice False total]]
|
||||
|
||||
-- | Render a single-column balance report as plain text.
|
||||
balanceReportAsText :: ReportOpts -> BalanceReport -> String
|
||||
@ -426,10 +426,7 @@ renderComponent opts (acctname, depth, total) (FormatField ljust min max field)
|
||||
Just m -> depth * m
|
||||
Nothing -> depth
|
||||
AccountField -> formatString ljust min max (T.unpack acctname)
|
||||
TotalField -> fitStringMulti min max True False $ showamt total
|
||||
where
|
||||
showamt | color_ opts = cshowMixedAmountWithoutPrice
|
||||
| otherwise = showMixedAmountWithoutPrice
|
||||
TotalField -> fitStringMulti min max True False $ showMixedAmountWithoutPrice (color_ opts) total
|
||||
_ -> ""
|
||||
|
||||
-- | Render one StringFormat component for a balance report item.
|
||||
@ -446,8 +443,7 @@ renderComponent1 opts (acctname, depth, total) (FormatField ljust min max field)
|
||||
indented = ((replicate (depth*2) ' ')++)
|
||||
TotalField -> fitStringMulti min max True False $ ((intercalate ", " . map strip . lines) (showamt total))
|
||||
where
|
||||
showamt | color_ opts = cshowMixedAmountWithoutPrice
|
||||
| otherwise = showMixedAmountWithoutPrice
|
||||
showamt = showMixedAmountWithoutPrice (color_ opts)
|
||||
_ -> ""
|
||||
|
||||
-- rendering multi-column balance reports
|
||||
@ -464,7 +460,7 @@ multiBalanceReportAsCsv opts@ReportOpts{average_, row_total_}
|
||||
++ ["Average" | average_]
|
||||
) :
|
||||
[T.unpack (displayFull a) :
|
||||
map showMixedAmountOneLineWithoutPrice
|
||||
map (showMixedAmountOneLineWithoutPrice False)
|
||||
(amts
|
||||
++ [rowtot | row_total_]
|
||||
++ [rowavg | average_])
|
||||
@ -473,7 +469,7 @@ multiBalanceReportAsCsv opts@ReportOpts{average_, row_total_}
|
||||
if no_total_ opts
|
||||
then []
|
||||
else ["Total:" :
|
||||
map showMixedAmountOneLineWithoutPrice (
|
||||
map (showMixedAmountOneLineWithoutPrice False) (
|
||||
coltotals
|
||||
++ [tot | row_total_]
|
||||
++ [avg | average_]
|
||||
@ -635,10 +631,8 @@ balanceReportTableAsText :: ReportOpts -> Table String String MixedAmount -> Str
|
||||
balanceReportTableAsText ropts@ReportOpts{..} = tableAsText ropts showamt
|
||||
where
|
||||
showamt
|
||||
| no_elide_ && color_ = cshowMixedAmountOneLineWithoutPrice
|
||||
| no_elide_ = showMixedAmountOneLineWithoutPrice
|
||||
| color_ = cshowMixedAmountElided
|
||||
| otherwise = showMixedAmountElided
|
||||
| no_elide_ = showMixedAmountOneLineWithoutPrice color_
|
||||
| otherwise = showMixedAmountElided color_
|
||||
|
||||
|
||||
tests_Balance = tests "Balance" [
|
||||
|
||||
@ -86,8 +86,8 @@ postingsReportItemAsCsvRecord (_, _, _, p, b) = [idx,date,code,desc,acct,amt,bal
|
||||
BalancedVirtualPosting -> (\s -> "["++s++"]")
|
||||
VirtualPosting -> (\s -> "("++s++")")
|
||||
_ -> id
|
||||
amt = showMixedAmountOneLineWithoutPrice $ pamount p
|
||||
bal = showMixedAmountOneLineWithoutPrice b
|
||||
amt = showMixedAmountOneLineWithoutPrice False $ pamount p
|
||||
bal = showMixedAmountOneLineWithoutPrice False b
|
||||
|
||||
-- | Render a register report as plain text suitable for console output.
|
||||
postingsReportAsText :: CliOpts -> PostingsReport -> String
|
||||
@ -179,8 +179,7 @@ postingsReportItemAsText opts preferredamtwidth preferredbalwidth (mdate, mendda
|
||||
BalancedVirtualPosting -> (\s -> "["++s++"]", acctwidth-2)
|
||||
VirtualPosting -> (\s -> "("++s++")", acctwidth-2)
|
||||
_ -> (id,acctwidth)
|
||||
showamt | color_ (reportopts_ opts) = cshowMixedAmountWithoutPrice
|
||||
| otherwise = showMixedAmountWithoutPrice
|
||||
showamt = showMixedAmountWithoutPrice (color_ $ reportopts_ opts)
|
||||
amt = showamt $ pamount p
|
||||
bal = showamt b
|
||||
-- alternate behaviour, show null amounts as 0 instead of blank
|
||||
|
||||
@ -262,7 +262,7 @@ compoundBalanceReportAsCsv ropts (CompoundPeriodicReport title colspans subrepor
|
||||
| no_total_ ropts || length subreports == 1 = id
|
||||
| otherwise = (++
|
||||
["Net:" :
|
||||
map showMixedAmountOneLineWithoutPrice (
|
||||
map (showMixedAmountOneLineWithoutPrice False) (
|
||||
coltotals
|
||||
++ (if row_total_ ropts then [grandtotal] else [])
|
||||
++ (if average_ ropts then [grandavg] else [])
|
||||
@ -309,9 +309,9 @@ compoundBalanceReportAsHtml ropts cbr =
|
||||
in
|
||||
[tr_ $ mconcat $
|
||||
th_ [class_ "", style_ "text-align:left"] "Net:"
|
||||
: [th_ [class_ "amount coltotal", defstyle] (toHtml $ showMixedAmountOneLineWithoutPrice a) | a <- coltotals]
|
||||
++ (if row_total_ ropts then [th_ [class_ "amount coltotal", defstyle] $ toHtml $ showMixedAmountOneLineWithoutPrice $ grandtotal] else [])
|
||||
++ (if average_ ropts then [th_ [class_ "amount colaverage", defstyle] $ toHtml $ showMixedAmountOneLineWithoutPrice $ grandavg] else [])
|
||||
: [th_ [class_ "amount coltotal", defstyle] (toHtml $ showMixedAmountOneLineWithoutPrice False a) | a <- coltotals]
|
||||
++ (if row_total_ ropts then [th_ [class_ "amount coltotal", defstyle] $ toHtml $ showMixedAmountOneLineWithoutPrice False grandtotal] else [])
|
||||
++ (if average_ ropts then [th_ [class_ "amount colaverage", defstyle] $ toHtml $ showMixedAmountOneLineWithoutPrice False grandavg] else [])
|
||||
]
|
||||
|
||||
in do
|
||||
|
||||
Loading…
Reference in New Issue
Block a user