/************************************************************************* ** XMLNode.h ** ** ** ** This file is part of dvisvgm -- the DVI to SVG converter ** ** Copyright (C) 2005-2013 Martin Gieseking ** ** ** ** This program is free software; you can redistribute it and/or ** ** modify it under the terms of the GNU General Public License as ** ** published by the Free Software Foundation; either version 3 of ** ** the License, or (at your option) any later version. ** ** ** ** This program is distributed in the hope that it will be useful, but ** ** WITHOUT ANY WARRANTY; without even the implied warranty of ** ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** ** GNU General Public License for more details. ** ** ** ** You should have received a copy of the GNU General Public License ** ** along with this program; if not, see . ** *************************************************************************/ #ifndef XMLNODE_H #define XMLNODE_H #include #include #include #include #include "SpecialActions.h" struct XMLNode { virtual ~XMLNode () {} virtual XMLNode* clone () const =0; virtual std::ostream& write (std::ostream &os) const =0; virtual bool emit (std::ostream &os, XMLNode *stopElement); virtual void append (XMLNode *child) {} virtual void prepend (XMLNode *child) {} }; class XMLElementNode : public XMLNode { typedef std::map AttribMap; typedef std::list ChildList; public: XMLElementNode (const std::string &name); XMLElementNode (const XMLElementNode &node); ~XMLElementNode (); XMLNode* clone () const {return new XMLElementNode(*this);} void addAttribute (const std::string &name, const std::string &value); void addAttribute (const std::string &name, double value); void append (XMLNode *child); void append (const std::string &str); void prepend (XMLNode *child); bool insertAfter (XMLNode *child, XMLNode *sibling); bool insertBefore (XMLNode *child, XMLNode *sibling); bool hasAttribute (const std::string &name) const; const char* getAttributeValue (const std::string &name) const; bool findDescendants (const char *name, const char *attr_name, std::vector &descendants); std::ostream& write (std::ostream &os) const; bool emit (std::ostream &os, XMLNode *stopElement); bool empty () const {return _children.empty();} const std::list& children () const {return _children;} const std::string& getName () const {return _name;} private: std::string _name; // element name (...) AttribMap _attributes; ChildList _children; // child nodes bool _emitted; // true if node has been (partly) emitted }; class XMLTextNode : public XMLNode { public: XMLTextNode (const std::string &str) : _text(str) {} XMLNode* clone () const {return new XMLTextNode(*this);} void append (XMLNode *node); void append (XMLTextNode *node); void append (const std::string &str); void prepend (XMLNode *child); std::ostream& write (std::ostream &os) const {return os << _text;} private: std::string _text; }; class XMLCommentNode : public XMLNode { public: XMLCommentNode (const std::string &str) : _text(str) {} XMLNode* clone () const {return new XMLCommentNode(*this);} std::ostream& write (std::ostream &os) const {return os << "\n";} private: std::string _text; }; class XMLDeclarationNode : public XMLNode { public: XMLDeclarationNode (const std::string &n, const std::string &p); XMLDeclarationNode (const XMLDeclarationNode &node); ~XMLDeclarationNode (); XMLNode* clone () const {return new XMLDeclarationNode(*this);} void append (XMLNode *child); std::ostream& write (std::ostream &os) const; bool emit (std::ostream &os, XMLNode *stopElement); private: std::string _name; std::string _params; std::list _children; bool _emitted; }; class XMLCDataNode : public XMLNode { public: XMLCDataNode (const std::string &d) : _data(d) {} XMLNode* clone () const {return new XMLCDataNode(*this);} std::ostream& write (std::ostream &os) const; private: std::string _data; }; #endif