1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218
|
#ifndef _FORMAT_H
#define _FORMAT_H
#include "journal.h"
#include "valexpr.h"
#include "walk.h"
namespace ledger {
std::string truncated(const std::string& str, unsigned int width,
const int style = 2);
std::string partial_account_name(const account_t& account,
const unsigned int start_depth);
#define ELEMENT_ALIGN_LEFT 0x01
#define ELEMENT_HIGHLIGHT 0x02
struct element_t
{
enum kind_t {
STRING,
VALUE_EXPR,
SOURCE,
ENTRY_BEG_POS,
ENTRY_BEG_LINE,
ENTRY_END_POS,
ENTRY_END_LINE,
XACT_BEG_POS,
XACT_BEG_LINE,
XACT_END_POS,
XACT_END_LINE,
DATE_STRING,
COMPLETE_DATE_STRING,
CLEARED,
ENTRY_CLEARED,
CODE,
PAYEE,
OPT_ACCOUNT,
ACCOUNT_NAME,
ACCOUNT_FULLNAME,
AMOUNT,
OPT_AMOUNT,
TOTAL,
NOTE,
OPT_NOTE,
SPACER,
DEPTH_SPACER
};
kind_t type;
unsigned char flags;
std::string chars;
unsigned char min_width;
unsigned char max_width;
value_expr val_expr;
struct element_t * next;
element_t() : type(STRING), flags(false),
min_width(0), max_width(0), next(NULL) {
DEBUG_PRINT("ledger.memory.ctors", "ctor element_t");
}
~element_t() {
DEBUG_PRINT("ledger.memory.dtors", "dtor element_t");
if (next) delete next; // recursive, but not too deep
}
};
struct format_t
{
std::string format_string;
element_t * elements;
enum elision_style_t {
TRUNCATE_TRAILING,
TRUNCATE_MIDDLE,
TRUNCATE_LEADING,
ABBREVIATE
};
static elision_style_t elision_style;
static int abbrev_length;
static bool ansi_codes;
static bool ansi_invert;
format_t() : elements(NULL) {
DEBUG_PRINT("ledger.memory.ctors", "ctor format_t");
}
format_t(const std::string& _format) : elements(NULL) {
DEBUG_PRINT("ledger.memory.ctors", "ctor format_t");
reset(_format);
}
~format_t() {
DEBUG_PRINT("ledger.memory.dtors", "dtor format_t");
if (elements) delete elements;
}
void reset(const std::string& _format) {
if (elements)
delete elements;
elements = parse_elements(_format);
format_string = _format;
}
static element_t * parse_elements(const std::string& fmt);
static std::string truncate(const std::string& str, unsigned int width,
const bool is_account = false);
void format(std::ostream& out, const details_t& details) const;
};
class format_transactions : public item_handler<transaction_t>
{
protected:
std::ostream& output_stream;
format_t first_line_format;
format_t next_lines_format;
entry_t * last_entry;
transaction_t * last_xact;
public:
format_transactions(std::ostream& _output_stream,
const std::string& format);
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) {}
virtual void format_last_entry();
virtual void flush() {
if (last_entry) {
format_last_entry();
last_entry = NULL;
}
format_transactions::flush();
}
virtual void operator()(transaction_t& xact);
};
void print_entry(std::ostream& out, const entry_base_t& entry,
const std::string& prefix = "");
bool disp_subaccounts_p(const account_t& account,
const item_predicate<account_t>& disp_pred,
const account_t *& to_show);
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);
class format_account : public item_handler<account_t>
{
std::ostream& output_stream;
item_predicate<account_t> disp_pred;
public:
format_t format;
format_account(std::ostream& _output_stream,
const std::string& _format,
const std::string& display_predicate = NULL)
: output_stream(_output_stream), disp_pred(display_predicate),
format(_format) {}
virtual void flush() {
output_stream.flush();
}
virtual void operator()(account_t& account);
};
class format_equity : public item_handler<account_t>
{
std::ostream& output_stream;
format_t first_line_format;
format_t next_lines_format;
item_predicate<account_t> disp_pred;
mutable value_t total;
public:
format_equity(std::ostream& _output_stream,
const std::string& _format,
const std::string& display_predicate);
virtual void flush();
virtual void operator()(account_t& account);
};
class format_error : public error {
public:
format_error(const std::string& reason, error_context * ctxt = NULL) throw()
: error(reason, ctxt) {}
virtual ~format_error() throw() {}
};
} // namespace ledger
#endif // _FORMAT_H
|