| /* |
| * Created by Phil on 09/12/2010. |
| * Copyright 2010 Two Blue Cubes Ltd. All rights reserved. |
| * |
| * Distributed under the Boost Software License, Version 1.0. (See accompanying |
| * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
| */ |
| #ifndef TWOBLUECUBES_CATCH_XMLWRITER_HPP_INCLUDED |
| #define TWOBLUECUBES_CATCH_XMLWRITER_HPP_INCLUDED |
| |
| #include "catch_stream.h" |
| #include "catch_compiler_capabilities.h" |
| |
| #include <vector> |
| |
| namespace Catch { |
| |
| class XmlEncode { |
| public: |
| enum ForWhat { ForTextNodes, ForAttributes }; |
| |
| XmlEncode( std::string const& str, ForWhat forWhat = ForTextNodes ); |
| |
| void encodeTo( std::ostream& os ) const; |
| |
| friend std::ostream& operator << ( std::ostream& os, XmlEncode const& xmlEncode ); |
| |
| private: |
| std::string m_str; |
| ForWhat m_forWhat; |
| }; |
| |
| class XmlWriter { |
| public: |
| |
| class ScopedElement { |
| public: |
| ScopedElement( XmlWriter* writer ); |
| |
| ScopedElement( ScopedElement&& other ) noexcept; |
| ScopedElement& operator=( ScopedElement&& other ) noexcept; |
| |
| ~ScopedElement(); |
| |
| ScopedElement& writeText( std::string const& text, bool indent = true ); |
| |
| template<typename T> |
| ScopedElement& writeAttribute( std::string const& name, T const& attribute ) { |
| m_writer->writeAttribute( name, attribute ); |
| return *this; |
| } |
| |
| private: |
| mutable XmlWriter* m_writer = nullptr; |
| }; |
| |
| XmlWriter( std::ostream& os = Catch::cout() ); |
| ~XmlWriter(); |
| |
| XmlWriter( XmlWriter const& ) = delete; |
| XmlWriter& operator=( XmlWriter const& ) = delete; |
| |
| XmlWriter& startElement( std::string const& name ); |
| |
| ScopedElement scopedElement( std::string const& name ); |
| |
| XmlWriter& endElement(); |
| |
| XmlWriter& writeAttribute( std::string const& name, std::string const& attribute ); |
| |
| XmlWriter& writeAttribute( std::string const& name, bool attribute ); |
| |
| template<typename T> |
| XmlWriter& writeAttribute( std::string const& name, T const& attribute ) { |
| ReusableStringStream rss; |
| rss << attribute; |
| return writeAttribute( name, rss.str() ); |
| } |
| |
| XmlWriter& writeText( std::string const& text, bool indent = true ); |
| |
| XmlWriter& writeComment( std::string const& text ); |
| |
| void writeStylesheetRef( std::string const& url ); |
| |
| XmlWriter& writeBlankLine(); |
| |
| void ensureTagClosed(); |
| |
| private: |
| |
| void writeDeclaration(); |
| |
| void newlineIfNecessary(); |
| |
| bool m_tagIsOpen = false; |
| bool m_needsNewline = false; |
| std::vector<std::string> m_tags; |
| std::string m_indent; |
| std::ostream& m_os; |
| }; |
| |
| } |
| |
| #endif // TWOBLUECUBES_CATCH_XMLWRITER_HPP_INCLUDED |