diff options
author | randomdan <randomdan@localhost> | 2012-02-17 19:44:04 +0000 |
---|---|---|
committer | randomdan <randomdan@localhost> | 2012-02-17 19:44:04 +0000 |
commit | b5dd4ebbebe50e999431409e186f699458f43225 (patch) | |
tree | bb21c00cb04fcb7cbb2e67aebf7c347f2dbb8e25 /project2/json/presenter.cpp | |
parent | Turn script values inside out to avoid throwing internally (diff) | |
download | project2-b5dd4ebbebe50e999431409e186f699458f43225.tar.bz2 project2-b5dd4ebbebe50e999431409e186f699458f43225.tar.xz project2-b5dd4ebbebe50e999431409e186f699458f43225.zip |
Finer control over output to presenters, addresses issues with JSON output and makes some other bits more sensible
Tweaks to XSLT as some things have moved
Diffstat (limited to 'project2/json/presenter.cpp')
-rw-r--r-- | project2/json/presenter.cpp | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/project2/json/presenter.cpp b/project2/json/presenter.cpp index f50c322..00ed334 100644 --- a/project2/json/presenter.cpp +++ b/project2/json/presenter.cpp @@ -13,36 +13,51 @@ class JsonPresenter : public MultiRowSetPresenter, public ContentPresenter, publ SourceOf<json::Object>(s), SourceOf<WritableContent>(s) { curRowSet.push(&object); + vaStack.push(&JsonPresenter::addValueToObject); } + typedef void (JsonPresenter::*ValueAdder)(const Glib::ustring &, const VariableType &) const; + typedef std::stack<ValueAdder> ValueAdderStack; + mutable ValueAdderStack vaStack; void addNamedValue(const Glib::ustring & name, const VariableType & value) const { + (this->*vaStack.top())(name, value); + } + void addValueToObject(const Glib::ustring & name, const VariableType & value) const { (*curRowSet.top())[name] = json::ValuePtr(new json::Value(boost::apply_visitor(Project2ToJson(), value))); } - void addNewRow(const Glib::ustring & name) const { - if (!curRowArray.top()) { - json::Value * v = new json::Value(json::Array()); - curRowArray.top() = boost::get<json::Array>(v); - (*curRowSet.top())[name] = json::ValuePtr(v); - } + void addValueToArray(const Glib::ustring &, const VariableType & value) const { + curRowArray.top()->push_back(json::ValuePtr(new json::Value(boost::apply_visitor(Project2ToJson(), value)))); + } + void addNewRow(const Glib::ustring &) const { json::Value * v = new json::Value(json::Object()); curRowSet.push(boost::get<json::Object>(v)); curRowArray.top()->push_back(json::ValuePtr(v)); + vaStack.push(&JsonPresenter::addValueToObject); } void finishRow() const { + vaStack.pop(); curRowSet.pop(); } void addNewRowSet(const Glib::ustring & name) const { json::Value * v = new json::Value(json::Object()); (*curRowSet.top())[name] = json::ValuePtr(v); curRowSet.push(boost::get<json::Object>(v)); - curRowArray.push(NULL); } void addNewRowSet(const Glib::ustring & name, const Glib::ustring & ns) const { addNewRowSet(ns + ":" + name); } void finishRowSet() const { - curRowArray.pop(); curRowSet.pop(); } + void addNewArray(const Glib::ustring & name, bool) const { + json::Value * v = new json::Value(json::Array()); + curRowArray.push(boost::get<json::Array>(v)); + (*curRowSet.top())[name] = json::ValuePtr(v); + vaStack.push(&JsonPresenter::addValueToArray); + } + void finishArray(bool) const { + vaStack.pop(); + curRowArray.pop(); + } operator const json::Object *() const { return &object; } |