added a custom transaction formatter, format_entries, used by "print"
This commit is contained in:
parent
2f16a82132
commit
d110df6741
6 changed files with 111 additions and 24 deletions
40
format.cc
40
format.cc
|
|
@ -332,11 +332,14 @@ void format_t::format(std::ostream& out, const details_t& details) const
|
|||
= details.entry->transactions.begin();
|
||||
i != details.entry->transactions.end();
|
||||
i++) {
|
||||
xacts_count++;
|
||||
if (transaction_has_xdata(**i) &&
|
||||
transaction_xdata(**i).dflags & TRANSACTION_TO_DISPLAY) {
|
||||
xacts_count++;
|
||||
|
||||
if (! first)
|
||||
first = *i;
|
||||
last = *i;
|
||||
if (! first)
|
||||
first = *i;
|
||||
last = *i;
|
||||
}
|
||||
}
|
||||
|
||||
use_disp = (xacts_count == 2 && details.xact == last &&
|
||||
|
|
@ -406,6 +409,35 @@ void format_transactions::operator()(transaction_t& xact)
|
|||
}
|
||||
}
|
||||
|
||||
void format_entries::format_last_entry()
|
||||
{
|
||||
bool first = true;
|
||||
for (transactions_list::const_iterator i = last_entry->transactions.begin();
|
||||
i != last_entry->transactions.end();
|
||||
i++) {
|
||||
if (transaction_has_xdata(**i) &&
|
||||
transaction_xdata(**i).dflags & TRANSACTION_TO_DISPLAY) {
|
||||
if (first) {
|
||||
first_line_format.format(output_stream, details_t(**i));
|
||||
first = false;
|
||||
} else {
|
||||
next_lines_format.format(output_stream, details_t(**i));
|
||||
}
|
||||
transaction_xdata(**i).dflags |= TRANSACTION_DISPLAYED;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void format_entries::operator()(transaction_t& xact)
|
||||
{
|
||||
if (last_entry && xact.entry != last_entry)
|
||||
format_last_entry();
|
||||
|
||||
transaction_xdata(xact).dflags |= TRANSACTION_TO_DISPLAY;
|
||||
|
||||
last_entry = xact.entry;
|
||||
}
|
||||
|
||||
bool disp_subaccounts_p(const account_t& account,
|
||||
const item_predicate<account_t>& disp_pred,
|
||||
const account_t *& to_show)
|
||||
|
|
|
|||
19
format.h
19
format.h
|
|
@ -90,6 +90,7 @@ struct format_t
|
|||
|
||||
class format_transactions : public item_handler<transaction_t>
|
||||
{
|
||||
protected:
|
||||
std::ostream& output_stream;
|
||||
format_t first_line_format;
|
||||
format_t next_lines_format;
|
||||
|
|
@ -102,7 +103,23 @@ class format_transactions : public item_handler<transaction_t>
|
|||
virtual void flush() {
|
||||
output_stream.flush();
|
||||
}
|
||||
virtual void operator()(transaction_t& xact);
|
||||
};
|
||||
|
||||
class format_entries : public format_transactions
|
||||
{
|
||||
public:
|
||||
format_entries(std::ostream& output_stream, const std::string& format)
|
||||
: format_transactions(output_stream, format) {}
|
||||
|
||||
void format_last_entry();
|
||||
|
||||
virtual void flush() {
|
||||
format_last_entry();
|
||||
last_entry = NULL;
|
||||
|
||||
format_transactions::flush();
|
||||
}
|
||||
virtual void operator()(transaction_t& xact);
|
||||
};
|
||||
|
||||
|
|
@ -113,7 +130,7 @@ bool disp_subaccounts_p(const account_t& account,
|
|||
inline bool disp_subaccounts_p(const account_t& account) {
|
||||
const account_t * temp;
|
||||
return disp_subaccounts_p(account, item_predicate<account_t>(NULL), temp);
|
||||
}
|
||||
}
|
||||
|
||||
bool display_account(const account_t& account,
|
||||
const item_predicate<account_t>& disp_pred);
|
||||
|
|
|
|||
11
main.cc
11
main.cc
|
|
@ -248,13 +248,14 @@ int parse_and_report(int argc, char * argv[], char * envp[])
|
|||
item_handler<transaction_t> * formatter;
|
||||
std::list<item_handler<transaction_t> *> formatter_ptrs;
|
||||
|
||||
if (command == "b" || command == "E") {
|
||||
if (command == "b" || command == "E")
|
||||
formatter = new set_account_value;
|
||||
formatter = chain_formatters(command, formatter, formatter_ptrs);
|
||||
} else {
|
||||
else if (command == "p")
|
||||
formatter = new format_entries(*out, *format);
|
||||
else
|
||||
formatter = new format_transactions(*out, *format);
|
||||
formatter = chain_formatters(command, formatter, formatter_ptrs);
|
||||
}
|
||||
|
||||
formatter = chain_formatters(command, formatter, formatter_ptrs);
|
||||
|
||||
if (command == "e")
|
||||
walk_transactions(new_entry->transactions, *formatter);
|
||||
|
|
|
|||
45
main.py
45
main.py
|
|
@ -18,6 +18,8 @@ import os
|
|||
import sys
|
||||
import string
|
||||
|
||||
true, false = 1, 0
|
||||
|
||||
from ledger import *
|
||||
|
||||
# Create the main journal object, into which all entries will be
|
||||
|
|
@ -141,7 +143,7 @@ else:
|
|||
# these, but they rely on I/O streams, which Boost.Python does not
|
||||
# provide a conversion layer for.
|
||||
|
||||
class FormatTransaction (TransactionHandler):
|
||||
class FormatTransactions (TransactionHandler):
|
||||
last_entry = None
|
||||
output = None
|
||||
|
||||
|
|
@ -176,10 +178,41 @@ class FormatTransaction (TransactionHandler):
|
|||
if self.nformatter is not None and \
|
||||
self.last_entry is not None and \
|
||||
xact.entry == self.last_entry:
|
||||
self.output.write(self.nformatter.format(xact))
|
||||
self.output.write (self.nformatter.format (xact))
|
||||
else:
|
||||
self.output.write(self.formatter.format(xact))
|
||||
self.output.write (self.formatter.format (xact))
|
||||
self.last_entry = xact.entry
|
||||
transaction_xdata (xact).dflags |= TRANSACTION_DISPLAYED
|
||||
|
||||
class FormatEntries (FormatTransactions):
|
||||
def __init__ (self, fmt):
|
||||
self.last_entry = None
|
||||
FormatTransactions.__init__(self, fmt)
|
||||
|
||||
def flush (self):
|
||||
self.format_last_entry ()
|
||||
self.last_entry = None
|
||||
FormatTransactions.flush (self)
|
||||
|
||||
def format_last_entry (self):
|
||||
first = true
|
||||
for x in self.last_entry:
|
||||
if transaction_has_xdata (x) and \
|
||||
transaction_xdata (x).dflags & TRANSACTION_TO_DISPLAY:
|
||||
if first or self.nformatter is None:
|
||||
self.output.write (self.formatter.format (x))
|
||||
first = false
|
||||
else:
|
||||
self.output.write (self.nformatter.format (x))
|
||||
transaction_xdata (x).dflags |= TRANSACTION_TO_DISPLAY
|
||||
|
||||
def __call__ (self, xact):
|
||||
if self.last_entry and self.last_entry != xact.entry:
|
||||
self.format_last_entry ()
|
||||
|
||||
transaction_xdata (xact).dflags |= TRANSACTION_TO_DISPLAY
|
||||
|
||||
self.last_entry = xact.entry;
|
||||
|
||||
class FormatAccount (AccountHandler):
|
||||
output = None
|
||||
|
|
@ -218,8 +251,10 @@ class FormatAccount (AccountHandler):
|
|||
|
||||
if command == "b" or command == "E":
|
||||
handler = SetAccountValue()
|
||||
elif command == "p":
|
||||
handler = FormatEntries(format)
|
||||
else:
|
||||
handler = FormatTransaction(format)
|
||||
handler = FormatTransactions(format)
|
||||
|
||||
# Chain transaction filters on top of the base handler. Most of these
|
||||
# filters customize the output for reporting. None of this is done
|
||||
|
|
@ -286,7 +321,7 @@ handler.flush ()
|
|||
# the transactions that were just walked.
|
||||
|
||||
if command == "b":
|
||||
acct_formatter = FormatAccount (format, config.display_predicate)
|
||||
acct_formatter = FormatAccounts (format, config.display_predicate)
|
||||
sum_accounts (journal.master)
|
||||
walk_accounts (journal.master, acct_formatter, config.sort_string)
|
||||
acct_formatter.flush ()
|
||||
|
|
|
|||
9
walk.cc
9
walk.cc
|
|
@ -456,9 +456,10 @@ void export_walk()
|
|||
{
|
||||
typedef item_handler<transaction_t> xact_handler_t;
|
||||
|
||||
scope().attr("TRANSACTION_HANDLED") = TRANSACTION_HANDLED;
|
||||
scope().attr("TRANSACTION_DISPLAYED") = TRANSACTION_DISPLAYED;
|
||||
scope().attr("TRANSACTION_NO_TOTAL") = TRANSACTION_NO_TOTAL;
|
||||
scope().attr("TRANSACTION_HANDLED") = TRANSACTION_HANDLED;
|
||||
scope().attr("TRANSACTION_TO_DISPLAY") = TRANSACTION_TO_DISPLAY;
|
||||
scope().attr("TRANSACTION_DISPLAYED") = TRANSACTION_DISPLAYED;
|
||||
scope().attr("TRANSACTION_NO_TOTAL") = TRANSACTION_NO_TOTAL;
|
||||
|
||||
class_< transaction_xdata_t > ("TransactionXData")
|
||||
.def_readwrite("total", &transaction_xdata_t::total)
|
||||
|
|
@ -565,8 +566,8 @@ void export_walk()
|
|||
|
||||
typedef item_handler<account_t> account_handler_t;
|
||||
|
||||
scope().attr("ACCOUNT_DISPLAYED") = ACCOUNT_DISPLAYED;
|
||||
scope().attr("ACCOUNT_TO_DISPLAY") = ACCOUNT_TO_DISPLAY;
|
||||
scope().attr("ACCOUNT_DISPLAYED") = ACCOUNT_DISPLAYED;
|
||||
|
||||
class_< account_xdata_t > ("AccountXData")
|
||||
.def_readwrite("value", &account_xdata_t::value)
|
||||
|
|
|
|||
11
walk.h
11
walk.h
|
|
@ -65,9 +65,10 @@ class compare_items {
|
|||
// Transaction handlers
|
||||
//
|
||||
|
||||
#define TRANSACTION_HANDLED 0x0001
|
||||
#define TRANSACTION_DISPLAYED 0x0002
|
||||
#define TRANSACTION_NO_TOTAL 0x0004
|
||||
#define TRANSACTION_HANDLED 0x0001
|
||||
#define TRANSACTION_TO_DISPLAY 0x0002
|
||||
#define TRANSACTION_DISPLAYED 0x0004
|
||||
#define TRANSACTION_NO_TOTAL 0x0008
|
||||
|
||||
struct transaction_xdata_t
|
||||
{
|
||||
|
|
@ -404,8 +405,8 @@ class related_transactions : public item_handler<transaction_t>
|
|||
// Account walking functions
|
||||
//
|
||||
|
||||
#define ACCOUNT_DISPLAYED 0x1
|
||||
#define ACCOUNT_TO_DISPLAY 0x2
|
||||
#define ACCOUNT_TO_DISPLAY 0x1
|
||||
#define ACCOUNT_DISPLAYED 0x2
|
||||
|
||||
struct account_xdata_t
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue