diff options
author | Craig Earls <enderw88@gmail.com> | 2013-01-29 09:42:10 -0700 |
---|---|---|
committer | Craig Earls <enderw88@gmail.com> | 2013-01-29 09:42:10 -0700 |
commit | 3e72a51dc3d296c9f647efaf4cbfbbdcf4bf6df1 (patch) | |
tree | 2d83e5a8d6a864ada5d9a948d322ca5254fe5e6d /src | |
parent | 5d1971ee51a18f927185d20fb0a4426d8f08aa86 (diff) | |
download | fork-ledger-3e72a51dc3d296c9f647efaf4cbfbbdcf4bf6df1.tar.gz fork-ledger-3e72a51dc3d296c9f647efaf4cbfbbdcf4bf6df1.tar.bz2 fork-ledger-3e72a51dc3d296c9f647efaf4cbfbbdcf4bf6df1.zip |
Addes tags command and --values option
Tags command reports all metadat tags in use. With the
values option it reports tags and their values.
Diffstat (limited to 'src')
-rw-r--r-- | src/output.cc | 28 | ||||
-rw-r--r-- | src/output.h | 27 | ||||
-rw-r--r-- | src/report.cc | 20 | ||||
-rw-r--r-- | src/report.h | 2 |
4 files changed, 67 insertions, 10 deletions
diff --git a/src/output.cc b/src/output.cc index f433f8d1..6ed7f861 100644 --- a/src/output.cc +++ b/src/output.cc @@ -318,6 +318,34 @@ void report_payees::operator()(post_t& post) (*i).second++; } +void report_tags::flush() +{ + std::ostream& out(report.output_stream); + + foreach (tags_pair& entry, tags) { + if (report.HANDLED(count)) + out << entry.second << ' '; + out << entry.first << '\n'; + } +} + +void report_tags::operator()(post_t& post) +{ + if(post.metadata){ + foreach (const item_t::string_map::value_type& data, *post.metadata){ + string tag=data.first; + if(report.HANDLED(values) && (data.second).first){ + tag+=": "+ (data.second).first.get().to_string(); + } + std::map<string, std::size_t>::iterator i = tags.find(tag); + if (i == tags.end()) + tags.insert(tags_pair(tag, 1)); + else + (*i).second++; + } + } +} + void report_commodities::flush() { std::ostream& out(report.output_stream); diff --git a/src/output.h b/src/output.h index 281f69b6..9895cb44 100644 --- a/src/output.h +++ b/src/output.h @@ -189,6 +189,33 @@ public: } }; +class report_tags : public item_handler<post_t> +{ +protected: + report_t& report; + + std::map<string, std::size_t> tags; + + typedef std::map<string, std::size_t>::value_type tags_pair; + +public: + report_tags(report_t& _report) : report(_report) { + TRACE_CTOR(report_tags, "report&"); + } + virtual ~report_tags() { + TRACE_DTOR(report_tags); + } + + virtual void flush(); + virtual void operator()(post_t& post); + + virtual void clear() { + tags.clear(); + item_handler<post_t>::clear(); + } +}; + + class report_commodities : public item_handler<post_t> { protected: diff --git a/src/report.cc b/src/report.cc index d4beaf2a..f7b71b94 100644 --- a/src/report.cc +++ b/src/report.cc @@ -1089,7 +1089,6 @@ option_t<report_t> * report_t::lookup_option(const char * p) else OPT(anon); else OPT_ALT(color, ansi); else OPT(auto_match); - else OPT(aux_date); else OPT(average); else OPT(account_width_); else OPT(amount_width_); @@ -1097,7 +1096,7 @@ option_t<report_t> * report_t::lookup_option(const char * p) case 'b': OPT(balance_format_); else OPT(base); - else OPT(basis); + else OPT_ALT(basis, cost); else OPT_(begin_); else OPT(bold_if_); else OPT(budget); @@ -1106,7 +1105,6 @@ option_t<report_t> * report_t::lookup_option(const char * p) break; case 'c': OPT(csv_format_); - else OPT_ALT(gain, change); else OPT(cleared); else OPT(collapse); else OPT(collapse_if_zero); @@ -1124,7 +1122,6 @@ option_t<report_t> * report_t::lookup_option(const char * p) else OPT(dc); else OPT(depth_); else OPT(deviation); - else OPT_ALT(rich_data, detail); else OPT_(display_); else OPT(display_amount_); else OPT(display_total_); @@ -1149,7 +1146,7 @@ option_t<report_t> * report_t::lookup_option(const char * p) else OPT_ALT(head_, first_); break; case 'g': - OPT(gain); + OPT_ALT(gain, change); else OPT(group_by_); else OPT(group_title_format_); else OPT(generated); @@ -1176,7 +1173,7 @@ option_t<report_t> * report_t::lookup_option(const char * p) else OPT_ALT(tail_, last_); break; case 'm': - OPT(market); + OPT_ALT(market, value); else OPT(monthly); else OPT(meta_); else OPT(meta_width_); @@ -1206,7 +1203,6 @@ option_t<report_t> * report_t::lookup_option(const char * p) else OPT(price); else OPT(prices_format_); else OPT(pricedb_format_); - else OPT(primary_date); else OPT(payee_width_); else OPT(prepend_format_); else OPT(prepend_width_); @@ -1224,7 +1220,7 @@ option_t<report_t> * report_t::lookup_option(const char * p) else OPT(revalued); else OPT(revalued_only); else OPT(revalued_total_); - else OPT(rich_data); + else OPT_ALT(rich_data, detail); break; case 's': OPT(sort_); @@ -1252,7 +1248,7 @@ option_t<report_t> * report_t::lookup_option(const char * p) else OPT(unround); break; case 'v': - OPT_ALT(market, value); + OPT(values); break; case 'w': OPT(weekly); @@ -1670,7 +1666,11 @@ expr_t::ptr_op_t report_t::lookup(const symbol_t::kind_t kind, else if (is_eq(p, "select")) return WRAP_FUNCTOR(select_command); break; - + case 't': + if (is_eq(p, "tags")) { + return POSTS_REPORTER(new report_tags(*this)); + } + break; case 'x': if (is_eq(p, "xact")) return WRAP_FUNCTOR(xact_command); diff --git a/src/report.h b/src/report.h index 2eac61fe..b0044f60 100644 --- a/src/report.h +++ b/src/report.h @@ -358,6 +358,7 @@ public: HANDLER(account_width_).report(out); HANDLER(amount_width_).report(out); HANDLER(total_width_).report(out); + HANDLER(values).report(out); } option_t<report_t> * lookup_option(const char * p); @@ -1043,6 +1044,7 @@ public: OPTION(report_t, account_width_); OPTION(report_t, amount_width_); OPTION(report_t, total_width_); + OPTION(report_t, values); }; template <class Type = post_t, |