diff options
Diffstat (limited to 'src/libutil')
-rw-r--r-- | src/libutil/xml-writer.cc | 17 | ||||
-rw-r--r-- | src/libutil/xml-writer.hh | 5 |
2 files changed, 19 insertions, 3 deletions
diff --git a/src/libutil/xml-writer.cc b/src/libutil/xml-writer.cc index e5f0d9455e40..cd37dff5608f 100644 --- a/src/libutil/xml-writer.cc +++ b/src/libutil/xml-writer.cc @@ -3,8 +3,8 @@ #include "xml-writer.hh" -XMLWriter::XMLWriter(ostream & output) - : output(output) +XMLWriter::XMLWriter(bool indent, ostream & output) + : output(output), indent(indent) { output << "<?xml version='1.0' encoding='utf-8'?>\n"; closed = false; @@ -25,13 +25,22 @@ void XMLWriter::close() } +void XMLWriter::indent_(unsigned int depth) +{ + if (!indent) return; + output << string(depth * 2, ' '); +} + + void XMLWriter::openElement(const string & name, const XMLAttrs & attrs) { assert(!closed); + indent_(pendingElems.size()); output << "<" << name; writeAttrs(attrs); output << ">"; + if (indent) output << "\n"; pendingElems.push_back(name); } @@ -39,7 +48,9 @@ void XMLWriter::openElement(const string & name, void XMLWriter::closeElement() { assert(!pendingElems.empty()); + indent_(pendingElems.size() - 1); output << "</" << pendingElems.back() << ">"; + if (indent) output << "\n"; pendingElems.pop_back(); if (pendingElems.empty()) closed = true; } @@ -49,9 +60,11 @@ void XMLWriter::writeEmptyElement(const string & name, const XMLAttrs & attrs) { assert(!closed); + indent_(pendingElems.size()); output << "<" << name; writeAttrs(attrs); output << " />"; + if (indent) output << "\n"; } diff --git a/src/libutil/xml-writer.hh b/src/libutil/xml-writer.hh index ae6c76ff2c9b..8c203a3486f0 100644 --- a/src/libutil/xml-writer.hh +++ b/src/libutil/xml-writer.hh @@ -18,13 +18,14 @@ private: ostream & output; + bool indent; bool closed; list<string> pendingElems; public: - XMLWriter(ostream & output); + XMLWriter(bool indent, ostream & output); ~XMLWriter(); void close(); @@ -40,6 +41,8 @@ public: private: void writeAttrs(const XMLAttrs & attrs); + + void indent_(unsigned int depth); }; |