Move amount colorization deeper into the core
This is necessary in order to redden negative amounts correctly under all circumstances, such as component amounts of a multi-commodity balance. Fixes 727B2DF8-A2A1-4716-9C15-547F20D5F933
This commit is contained in:
parent
995c94ef17
commit
298a4faef3
8 changed files with 127 additions and 30 deletions
|
|
@ -243,7 +243,8 @@ balance_t::strip_annotations(const keep_details_t& what_to_keep) const
|
||||||
void balance_t::print(std::ostream& out,
|
void balance_t::print(std::ostream& out,
|
||||||
const int first_width,
|
const int first_width,
|
||||||
const int latter_width,
|
const int latter_width,
|
||||||
const bool right_justify) const
|
const bool right_justify,
|
||||||
|
const bool colorize) const
|
||||||
{
|
{
|
||||||
bool first = true;
|
bool first = true;
|
||||||
int lwidth = latter_width;
|
int lwidth = latter_width;
|
||||||
|
|
@ -272,7 +273,8 @@ void balance_t::print(std::ostream& out,
|
||||||
|
|
||||||
std::ostringstream buf;
|
std::ostringstream buf;
|
||||||
buf << *amount;
|
buf << *amount;
|
||||||
justify(out, buf.str(), width, right_justify);
|
justify(out, buf.str(), width, right_justify,
|
||||||
|
colorize && amount->sign() < 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (first) {
|
if (first) {
|
||||||
|
|
|
||||||
|
|
@ -483,7 +483,8 @@ public:
|
||||||
void print(std::ostream& out,
|
void print(std::ostream& out,
|
||||||
const int first_width = -1,
|
const int first_width = -1,
|
||||||
const int latter_width = -1,
|
const int latter_width = -1,
|
||||||
const bool right_justify = true) const;
|
const bool right_justify = true,
|
||||||
|
const bool colorize = true) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Debugging methods. There are two methods defined to help with
|
* Debugging methods. There are two methods defined to help with
|
||||||
|
|
|
||||||
|
|
@ -230,13 +230,14 @@ value_t report_t::fn_truncated(call_scope_t& scope)
|
||||||
|
|
||||||
value_t report_t::fn_justify(call_scope_t& scope)
|
value_t report_t::fn_justify(call_scope_t& scope)
|
||||||
{
|
{
|
||||||
interactive_t args(scope, "vl&lbs");
|
interactive_t args(scope, "vl&lbbs");
|
||||||
std::ostringstream out;
|
std::ostringstream out;
|
||||||
args.value_at(0)
|
args.value_at(0)
|
||||||
.print(out, args.get<long>(1),
|
.print(out, args.get<long>(1),
|
||||||
args.has(2) ? args.get<long>(2) : -1,
|
args.has(2) ? args.get<long>(2) : -1,
|
||||||
args.has(3),
|
args.has(3) ? args.get<bool>(3) : false,
|
||||||
args.has(4) ? args.get<string>(4) :
|
args.has(4) ? args.get<bool>(4) : false,
|
||||||
|
args.has(5) ? args.get<string>(5) :
|
||||||
(HANDLED(date_format_) ?
|
(HANDLED(date_format_) ?
|
||||||
HANDLER(date_format_).str() : optional<string>()));
|
HANDLER(date_format_).str() : optional<string>()));
|
||||||
return string_value(out.str());
|
return string_value(out.str());
|
||||||
|
|
|
||||||
26
src/report.h
26
src/report.h
|
|
@ -333,12 +333,10 @@ public:
|
||||||
|
|
||||||
OPTION__(report_t, balance_format_, CTOR(report_t, balance_format_) {
|
OPTION__(report_t, balance_format_, CTOR(report_t, balance_format_) {
|
||||||
on(none,
|
on(none,
|
||||||
"%(ansify_if(justify(scrub(display_total), 20, -1, true), "
|
"%(justify(scrub(display_total), 20, -1, true, color))"
|
||||||
" red if color & scrub(display_total) < 0))"
|
|
||||||
" %(!options.flat ? depth_spacer : \"\")"
|
" %(!options.flat ? depth_spacer : \"\")"
|
||||||
"%-(ansify_if(partial_account(options.flat), blue if color))\n%/"
|
"%-(ansify_if(partial_account(options.flat), blue if color))\n%/"
|
||||||
"%(ansify_if(justify(scrub(display_total), 20, -1, true), "
|
"%(justify(scrub(display_total), 20, -1, true, color))\n%/"
|
||||||
" red if color & scrub(display_total) < 0))\n%/"
|
|
||||||
"--------------------\n");
|
"--------------------\n");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -668,21 +666,21 @@ public:
|
||||||
" bold if color & !cleared))"
|
" bold if color & !cleared))"
|
||||||
" %(ansify_if(justify(truncated(account, account_width, abbrev_len), "
|
" %(ansify_if(justify(truncated(account, account_width, abbrev_len), "
|
||||||
" account_width), blue if color))"
|
" account_width), blue if color))"
|
||||||
" %(ansify_if(justify(scrub(display_amount), amount_width, "
|
" %(justify(scrub(display_amount), amount_width, "
|
||||||
" 3 + date_width + payee_width + account_width + amount_width, true), "
|
" 3 + date_width + payee_width + account_width + amount_width, "
|
||||||
" red if color & scrub(display_amount) < 0))"
|
" true, color))"
|
||||||
" %(ansify_if(justify(scrub(display_total), total_width, "
|
" %(justify(scrub(display_total), total_width, "
|
||||||
" 4 + date_width + payee_width + account_width + amount_width "
|
" 4 + date_width + payee_width + account_width + amount_width "
|
||||||
" + total_width, true), red if color & scrub(display_amount) < 0))\n%/"
|
" + total_width, true, color))\n%/"
|
||||||
"%(justify(\" \", 2 + date_width + payee_width))"
|
"%(justify(\" \", 2 + date_width + payee_width))"
|
||||||
"%(ansify_if(justify(truncated(account, account_width, abbrev_len), "
|
"%(ansify_if(justify(truncated(account, account_width, abbrev_len), "
|
||||||
" account_width), blue if color))"
|
" account_width), blue if color))"
|
||||||
" %(ansify_if(justify(scrub(display_amount), amount_width, "
|
" %(justify(scrub(display_amount), amount_width, "
|
||||||
" 3 + date_width + payee_width + account_width + amount_width, true), "
|
" 3 + date_width + payee_width + account_width + amount_width, "
|
||||||
" red if color & scrub(display_amount) < 0))"
|
" true, color))"
|
||||||
" %(ansify_if(justify(scrub(display_total), total_width, "
|
" %(justify(scrub(display_total), total_width, "
|
||||||
" 4 + date_width + payee_width + account_width + amount_width "
|
" 4 + date_width + payee_width + account_width + amount_width "
|
||||||
" + total_width, true), red if color & scrub(display_amount) < 0))\n");
|
" + total_width, true, color))\n");
|
||||||
});
|
});
|
||||||
|
|
||||||
OPTION(report_t, related); // -r
|
OPTION(report_t, related); // -r
|
||||||
|
|
|
||||||
|
|
@ -99,10 +99,14 @@ public:
|
||||||
inline void justify(std::ostream& out,
|
inline void justify(std::ostream& out,
|
||||||
const std::string& str,
|
const std::string& str,
|
||||||
int width,
|
int width,
|
||||||
bool right = false)
|
bool right = false,
|
||||||
|
bool redden = false)
|
||||||
{
|
{
|
||||||
if (! right)
|
if (! right) {
|
||||||
|
if (redden) out << "\e[31m";
|
||||||
out << str;
|
out << str;
|
||||||
|
if (redden) out << "\e[0m";
|
||||||
|
}
|
||||||
|
|
||||||
unistring temp(str);
|
unistring temp(str);
|
||||||
|
|
||||||
|
|
@ -110,8 +114,11 @@ inline void justify(std::ostream& out,
|
||||||
while (spacing-- > 0)
|
while (spacing-- > 0)
|
||||||
out << ' ';
|
out << ' ';
|
||||||
|
|
||||||
if (right)
|
if (right) {
|
||||||
|
if (redden) out << "\e[31m";
|
||||||
out << str;
|
out << str;
|
||||||
|
if (redden) out << "\e[0m";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace ledger
|
} // namespace ledger
|
||||||
|
|
|
||||||
20
src/value.cc
20
src/value.cc
|
|
@ -1424,10 +1424,12 @@ void value_t::print(std::ostream& out,
|
||||||
const int first_width,
|
const int first_width,
|
||||||
const int latter_width,
|
const int latter_width,
|
||||||
const bool right_justify,
|
const bool right_justify,
|
||||||
|
const bool colorize,
|
||||||
const optional<string>& date_format) const
|
const optional<string>& date_format) const
|
||||||
{
|
{
|
||||||
if (first_width > 0 &&
|
if (first_width > 0 &&
|
||||||
! is_amount() && ! is_balance() && ! is_string()) {
|
(! is_amount() || as_amount().is_zero()) &&
|
||||||
|
! is_balance() && ! is_string()) {
|
||||||
out.width(first_width);
|
out.width(first_width);
|
||||||
|
|
||||||
if (right_justify)
|
if (right_justify)
|
||||||
|
|
@ -1460,17 +1462,20 @@ void value_t::print(std::ostream& out,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case INTEGER:
|
case INTEGER:
|
||||||
out << std::right << as_long();
|
if (colorize && as_long() < 0)
|
||||||
|
justify(out, to_string(), first_width, right_justify, true);
|
||||||
|
else
|
||||||
|
out << as_long();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AMOUNT: {
|
case AMOUNT: {
|
||||||
if (as_amount().is_zero()) {
|
if (as_amount().is_zero()) {
|
||||||
out.width(first_width);
|
out << 0;
|
||||||
out << (right_justify ? std::right : std::left) << 0;
|
|
||||||
} else {
|
} else {
|
||||||
std::ostringstream buf;
|
std::ostringstream buf;
|
||||||
buf << as_amount();
|
buf << as_amount();
|
||||||
justify(out, buf.str(), first_width, right_justify);
|
justify(out, buf.str(), first_width, right_justify,
|
||||||
|
colorize && as_amount().sign() < 0);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -1493,14 +1498,15 @@ void value_t::print(std::ostream& out,
|
||||||
out << ", ";
|
out << ", ";
|
||||||
|
|
||||||
value.print(out, first_width, latter_width, right_justify,
|
value.print(out, first_width, latter_width, right_justify,
|
||||||
date_format);
|
colorize, date_format);
|
||||||
}
|
}
|
||||||
out << ')';
|
out << ')';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case BALANCE:
|
case BALANCE:
|
||||||
as_balance().print(out, first_width, latter_width, right_justify);
|
as_balance().print(out, first_width, latter_width, right_justify,
|
||||||
|
colorize);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case POINTER:
|
case POINTER:
|
||||||
|
|
|
||||||
|
|
@ -915,6 +915,7 @@ public:
|
||||||
const int first_width = -1,
|
const int first_width = -1,
|
||||||
const int latter_width = -1,
|
const int latter_width = -1,
|
||||||
const bool right_justify = false,
|
const bool right_justify = false,
|
||||||
|
const bool colorize = false,
|
||||||
const optional<string>& date_format = none) const;
|
const optional<string>& date_format = none) const;
|
||||||
void dump(std::ostream& out, const bool relaxed = true) const;
|
void dump(std::ostream& out, const bool relaxed = true) const;
|
||||||
|
|
||||||
|
|
|
||||||
81
test/regress/727B2DF8.test
Normal file
81
test/regress/727B2DF8.test
Normal file
|
|
@ -0,0 +1,81 @@
|
||||||
|
reg --color
|
||||||
|
<<<
|
||||||
|
N $
|
||||||
|
|
||||||
|
= account =~ /^Expenses:Books/
|
||||||
|
(Liabilities:Taxes) -0.10
|
||||||
|
|
||||||
|
~ Monthly
|
||||||
|
Assets:Bank:Checking $500.00
|
||||||
|
Income:Salary
|
||||||
|
|
||||||
|
2004/05/01 * Checking balance
|
||||||
|
Assets:Bank:Checking $1,000.00
|
||||||
|
Equity:Opening Balances
|
||||||
|
|
||||||
|
2004/05/03=2004/05/01 * Investment balance
|
||||||
|
Assets:Brokerage 50 AAPL @ $30.00
|
||||||
|
Equity:Opening Balances
|
||||||
|
|
||||||
|
2004/05/14 * Páy dày
|
||||||
|
Assets:Bank:Checking 500.00€
|
||||||
|
Income:Salary
|
||||||
|
|
||||||
|
2004/05/14 * Another dày in which there is Páying
|
||||||
|
Asséts:Bánk:Chécking:Asséts:Bánk:Chécking $500.00
|
||||||
|
Income:Salary
|
||||||
|
|
||||||
|
2004/05/14 * Another dày in which there is Páying
|
||||||
|
Русский язык:Русский язык:Русский язык:Русский язык $1000.00
|
||||||
|
Income:Salary
|
||||||
|
|
||||||
|
2004/05/27 Book Store
|
||||||
|
Expenses:Books $20.00
|
||||||
|
Expenses:Cards $40.00
|
||||||
|
Expenses:Docs $30.00
|
||||||
|
Liabilities:MasterCard
|
||||||
|
|
||||||
|
2004/05/27 (100) Credit card company
|
||||||
|
; This is an xact note!
|
||||||
|
; Sample: Value
|
||||||
|
Liabilities:MasterCard $20.00
|
||||||
|
; This is a posting note!
|
||||||
|
; Sample: Another Value
|
||||||
|
; :MyTag:
|
||||||
|
Assets:Bank:Checking
|
||||||
|
; :AnotherTag:
|
||||||
|
>>>1
|
||||||
|
04-May-01 Checking balance [34mAssets:Bank:Checking [0m $1,000.00 $1,000.00
|
||||||
|
[34mEq:Opening Balances [0m [31m$-1,000.00[0m 0
|
||||||
|
04-May-03 Investment balance [34mAssets:Brokerage [0m 50 AAPL 50 AAPL
|
||||||
|
[34mEq:Opening Balances [0m [31m$-1,500.00[0m [31m$-1,500.00[0m
|
||||||
|
50 AAPL
|
||||||
|
04-May-14 Páy dày [34mAssets:Bank:Checking [0m 500.00€ [31m$-1,500.00[0m
|
||||||
|
50 AAPL
|
||||||
|
500.00€
|
||||||
|
[34mIncome:Salary [0m [31m-500.00€[0m [31m$-1,500.00[0m
|
||||||
|
50 AAPL
|
||||||
|
04-May-14 Another dày in whic.. [34m..Bá:Ch:As:Bá:Chécking[0m $500.00 [31m$-1,000.00[0m
|
||||||
|
50 AAPL
|
||||||
|
[34mIncome:Salary [0m [31m$-500.00[0m [31m$-1,500.00[0m
|
||||||
|
50 AAPL
|
||||||
|
04-May-14 Another dày in whic.. [34mРу:Ру:Ру:Русский язык [0m $1,000.00 [31m$-500.00[0m
|
||||||
|
50 AAPL
|
||||||
|
[34mIncome:Salary [0m [31m$-1,000.00[0m [31m$-1,500.00[0m
|
||||||
|
50 AAPL
|
||||||
|
04-May-27 [1mBook Store [0m [34mExpenses:Books [0m $20.00 [31m$-1,480.00[0m
|
||||||
|
50 AAPL
|
||||||
|
[34mExpenses:Cards [0m $40.00 [31m$-1,440.00[0m
|
||||||
|
50 AAPL
|
||||||
|
[34mExpenses:Docs [0m $30.00 [31m$-1,410.00[0m
|
||||||
|
50 AAPL
|
||||||
|
[34mLiabilities:MasterCard[0m [31m$-90.00[0m [31m$-1,500.00[0m
|
||||||
|
50 AAPL
|
||||||
|
[34m(Liabilities:Taxes) [0m [31m$-2.00[0m [31m$-1,502.00[0m
|
||||||
|
50 AAPL
|
||||||
|
04-May-27 [1mCredit card company [0m [34mLiabilities:MasterCard[0m $20.00 [31m$-1,482.00[0m
|
||||||
|
50 AAPL
|
||||||
|
[34mAssets:Bank:Checking [0m [31m$-20.00[0m [31m$-1,502.00[0m
|
||||||
|
50 AAPL
|
||||||
|
>>>2
|
||||||
|
=== 0
|
||||||
Loading…
Add table
Reference in a new issue