include line number information in wxXmlNode (based on patch #1803492 by Heikki Linnakangas)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@48994 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
		| @@ -69,7 +69,7 @@ enum wxXmlNodeType | |||||||
|  |  | ||||||
| \membersection{wxXmlNode::wxXmlNode}\label{wxxmlnodewxxmlnode} | \membersection{wxXmlNode::wxXmlNode}\label{wxxmlnodewxxmlnode} | ||||||
|  |  | ||||||
| \func{}{wxXmlNode}{\param{wxXmlNode* }{parent}, \param{wxXmlNodeType }{type}, \param{const wxString\& }{name}, \param{const wxString\& }{content = wxEmptyString}, \param{wxXmlAttribute* }{attrs = \NULL}, \param{wxXmlNode* }{next = \NULL}} | \func{}{wxXmlNode}{\param{wxXmlNode* }{parent}, \param{wxXmlNodeType }{type}, \param{const wxString\& }{name}, \param{const wxString\& }{content = wxEmptyString}, \param{wxXmlAttribute* }{attrs = \NULL}, \param{wxXmlNode* }{next = \NULL}, \param{int }{lineNo = -1}} | ||||||
|  |  | ||||||
| \wxheading{Parameters} | \wxheading{Parameters} | ||||||
|  |  | ||||||
| @@ -86,6 +86,7 @@ constructor and it shouldn't be done again.} | |||||||
| and its eventual siblings are attached to the node.} | and its eventual siblings are attached to the node.} | ||||||
| \docparam{next}{If not \NULL, this node and its eventual siblings are attached to | \docparam{next}{If not \NULL, this node and its eventual siblings are attached to | ||||||
| the node.} | the node.} | ||||||
|  | \docparam{lineNo}{Number of line this node was present at in input file or -1.} | ||||||
|  |  | ||||||
| Creates this XML node and eventually insert it into an existing XML tree. | Creates this XML node and eventually insert it into an existing XML tree. | ||||||
|  |  | ||||||
| @@ -99,7 +100,7 @@ after using copy ctor and are never unmodified by operator=. | |||||||
| On the other hand, it DOES copy children and attributes. | On the other hand, it DOES copy children and attributes. | ||||||
|  |  | ||||||
|  |  | ||||||
| \func{}{wxXmlNode}{\param{wxXmlNodeType }{type}, \param{const wxString\& }{name}, \param{const wxString\& }{content = wxEmptyString}} | \func{}{wxXmlNode}{\param{wxXmlNodeType }{type}, \param{const wxString\& }{name}, \param{const wxString\& }{content = wxEmptyString}, \param{int }{lineNo = -1}} | ||||||
|  |  | ||||||
| A simplified version of the first constructor form, assuming a \NULL parent. | A simplified version of the first constructor form, assuming a \NULL parent. | ||||||
|  |  | ||||||
| @@ -160,6 +161,12 @@ This function searches only the parents of this node until it finds {\tt grandpa | |||||||
| or the \NULL node (which is the parent of non-linked nodes or the parent of a | or the \NULL node (which is the parent of non-linked nodes or the parent of a | ||||||
| \helpref{wxXmlDocument}{wxxmldocument}'s root node). | \helpref{wxXmlDocument}{wxxmldocument}'s root node). | ||||||
|  |  | ||||||
|  | \membersection{wxXmlNode::GetLineNumber}\label{wxxmlnodegetlinenumber} | ||||||
|  |  | ||||||
|  | \constfunc{int}{GetLineNumber}{\void} | ||||||
|  |  | ||||||
|  | Returns line number of the node in the input XML file or -1 if it is unknown. | ||||||
|  |  | ||||||
|  |  | ||||||
| \membersection{wxXmlNode::GetNodeContent}\label{wxxmlnodegetnodecontent} | \membersection{wxXmlNode::GetNodeContent}\label{wxxmlnodegetnodecontent} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -103,10 +103,16 @@ class WXDLLIMPEXP_XML wxXmlNode | |||||||
| { | { | ||||||
| public: | public: | ||||||
|     wxXmlNode() |     wxXmlNode() | ||||||
|         : m_attrs(NULL), m_parent(NULL), m_children(NULL), m_next(NULL) {} |         : m_attrs(NULL), m_parent(NULL), m_children(NULL), m_next(NULL), | ||||||
|  |           m_lineNo(-1) | ||||||
|  |     { | ||||||
|  |     } | ||||||
|  |  | ||||||
|     wxXmlNode(wxXmlNode *parent, wxXmlNodeType type, |     wxXmlNode(wxXmlNode *parent, wxXmlNodeType type, | ||||||
|               const wxString& name, const wxString& content = wxEmptyString, |               const wxString& name, const wxString& content = wxEmptyString, | ||||||
|               wxXmlAttribute *attrs = NULL, wxXmlNode *next = NULL); |               wxXmlAttribute *attrs = NULL, wxXmlNode *next = NULL, | ||||||
|  |               int lineNo = -1); | ||||||
|  |  | ||||||
|     virtual ~wxXmlNode(); |     virtual ~wxXmlNode(); | ||||||
|  |  | ||||||
|     // copy ctor & operator=. Note that this does NOT copy syblings |     // copy ctor & operator=. Note that this does NOT copy syblings | ||||||
| @@ -118,7 +124,8 @@ public: | |||||||
|  |  | ||||||
|     // user-friendly creation: |     // user-friendly creation: | ||||||
|     wxXmlNode(wxXmlNodeType type, const wxString& name, |     wxXmlNode(wxXmlNodeType type, const wxString& name, | ||||||
|               const wxString& content = wxEmptyString); |               const wxString& content = wxEmptyString, | ||||||
|  |               int lineNo = -1); | ||||||
|     virtual void AddChild(wxXmlNode *child); |     virtual void AddChild(wxXmlNode *child); | ||||||
|     virtual bool InsertChild(wxXmlNode *child, wxXmlNode *before_node); |     virtual bool InsertChild(wxXmlNode *child, wxXmlNode *before_node); | ||||||
|     virtual bool RemoveChild(wxXmlNode *child); |     virtual bool RemoveChild(wxXmlNode *child); | ||||||
| @@ -152,6 +159,8 @@ public: | |||||||
|                          const wxString& defaultVal) const; |                          const wxString& defaultVal) const; | ||||||
|     bool HasAttribute(const wxString& attrName) const; |     bool HasAttribute(const wxString& attrName) const; | ||||||
|  |  | ||||||
|  |     int GetLineNumber() const { return m_lineNo; } | ||||||
|  |  | ||||||
|     void SetType(wxXmlNodeType type) { m_type = type; } |     void SetType(wxXmlNodeType type) { m_type = type; } | ||||||
|     void SetName(const wxString& name) { m_name = name; } |     void SetName(const wxString& name) { m_name = name; } | ||||||
|     void SetContent(const wxString& con) { m_content = con; } |     void SetContent(const wxString& con) { m_content = con; } | ||||||
| @@ -202,6 +211,7 @@ private: | |||||||
|     wxString m_content; |     wxString m_content; | ||||||
|     wxXmlAttribute *m_attrs; |     wxXmlAttribute *m_attrs; | ||||||
|     wxXmlNode *m_parent, *m_children, *m_next; |     wxXmlNode *m_parent, *m_children, *m_next; | ||||||
|  |     int m_lineNo; // line number in original file, or -1  | ||||||
|  |  | ||||||
|     void DoCopy(const wxXmlNode& node); |     void DoCopy(const wxXmlNode& node); | ||||||
| }; | }; | ||||||
|   | |||||||
| @@ -49,10 +49,11 @@ static bool wxIsWhiteOnly(const wxString& buf); | |||||||
|  |  | ||||||
| wxXmlNode::wxXmlNode(wxXmlNode *parent,wxXmlNodeType type, | wxXmlNode::wxXmlNode(wxXmlNode *parent,wxXmlNodeType type, | ||||||
|                      const wxString& name, const wxString& content, |                      const wxString& name, const wxString& content, | ||||||
|                      wxXmlAttribute *attrs, wxXmlNode *next) |                      wxXmlAttribute *attrs, wxXmlNode *next, int lineNo) | ||||||
|     : m_type(type), m_name(name), m_content(content), |     : m_type(type), m_name(name), m_content(content), | ||||||
|       m_attrs(attrs), m_parent(parent), |       m_attrs(attrs), m_parent(parent), | ||||||
|       m_children(NULL), m_next(next) |       m_children(NULL), m_next(next), | ||||||
|  |       m_lineNo(lineNo) | ||||||
| { | { | ||||||
|     if (m_parent) |     if (m_parent) | ||||||
|     { |     { | ||||||
| @@ -67,10 +68,12 @@ wxXmlNode::wxXmlNode(wxXmlNode *parent,wxXmlNodeType type, | |||||||
| } | } | ||||||
|  |  | ||||||
| wxXmlNode::wxXmlNode(wxXmlNodeType type, const wxString& name, | wxXmlNode::wxXmlNode(wxXmlNodeType type, const wxString& name, | ||||||
|                      const wxString& content) |                      const wxString& content, | ||||||
|  |                      int lineNo) | ||||||
|     : m_type(type), m_name(name), m_content(content), |     : m_type(type), m_name(name), m_content(content), | ||||||
|       m_attrs(NULL), m_parent(NULL), |       m_attrs(NULL), m_parent(NULL), | ||||||
|       m_children(NULL), m_next(NULL) |       m_children(NULL), m_next(NULL), | ||||||
|  |       m_lineNo(lineNo) | ||||||
| {} | {} | ||||||
|  |  | ||||||
| wxXmlNode::wxXmlNode(const wxXmlNode& node) | wxXmlNode::wxXmlNode(const wxXmlNode& node) | ||||||
| @@ -110,6 +113,7 @@ void wxXmlNode::DoCopy(const wxXmlNode& node) | |||||||
|     m_type = node.m_type; |     m_type = node.m_type; | ||||||
|     m_name = node.m_name; |     m_name = node.m_name; | ||||||
|     m_content = node.m_content; |     m_content = node.m_content; | ||||||
|  |     m_lineNo = node.m_lineNo; | ||||||
|     m_children = NULL; |     m_children = NULL; | ||||||
|  |  | ||||||
|     wxXmlNode *n = node.m_children; |     wxXmlNode *n = node.m_children; | ||||||
| @@ -454,6 +458,7 @@ bool wxIsWhiteOnly(const wxString& buf) | |||||||
|  |  | ||||||
| struct wxXmlParsingContext | struct wxXmlParsingContext | ||||||
| { | { | ||||||
|  |     XML_Parser parser; | ||||||
|     wxMBConv  *conv; |     wxMBConv  *conv; | ||||||
|     wxXmlNode *root; |     wxXmlNode *root; | ||||||
|     wxXmlNode *node; |     wxXmlNode *node; | ||||||
| @@ -467,8 +472,12 @@ extern "C" { | |||||||
| static void StartElementHnd(void *userData, const char *name, const char **atts) | static void StartElementHnd(void *userData, const char *name, const char **atts) | ||||||
| { | { | ||||||
|     wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData; |     wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData; | ||||||
|     wxXmlNode *node = new wxXmlNode(wxXML_ELEMENT_NODE, CharToString(ctx->conv, name)); |     wxXmlNode *node = new wxXmlNode(wxXML_ELEMENT_NODE, | ||||||
|  |                                     CharToString(ctx->conv, name), | ||||||
|  |                                     wxEmptyString, | ||||||
|  |                                     XML_GetCurrentLineNumber(ctx->parser)); | ||||||
|     const char **a = atts; |     const char **a = atts; | ||||||
|  |  | ||||||
|     while (*a) |     while (*a) | ||||||
|     { |     { | ||||||
|         node->AddAttribute(CharToString(ctx->conv, a[0]), CharToString(ctx->conv, a[1])); |         node->AddAttribute(CharToString(ctx->conv, a[0]), CharToString(ctx->conv, a[1])); | ||||||
| @@ -507,7 +516,9 @@ static void TextHnd(void *userData, const char *s, int len) | |||||||
|  |  | ||||||
|         if (!whiteOnly) |         if (!whiteOnly) | ||||||
|         { |         { | ||||||
|             ctx->lastAsText = new wxXmlNode(wxXML_TEXT_NODE, wxT("text"), str); |             ctx->lastAsText = | ||||||
|  |                 new wxXmlNode(wxXML_TEXT_NODE, wxT("text"), str, | ||||||
|  |                               XML_GetCurrentLineNumber(ctx->parser)); | ||||||
|             ctx->node->AddChild(ctx->lastAsText); |             ctx->node->AddChild(ctx->lastAsText); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -517,7 +528,9 @@ static void StartCdataHnd(void *userData) | |||||||
| { | { | ||||||
|     wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData; |     wxXmlParsingContext *ctx = (wxXmlParsingContext*)userData; | ||||||
|  |  | ||||||
|     ctx->lastAsText = new wxXmlNode(wxXML_CDATA_SECTION_NODE, wxT("cdata"),wxT("")); |     ctx->lastAsText = | ||||||
|  |         new wxXmlNode(wxXML_CDATA_SECTION_NODE, wxT("cdata"), wxT(""), | ||||||
|  |                       XML_GetCurrentLineNumber(ctx->parser)); | ||||||
|     ctx->node->AddChild(ctx->lastAsText); |     ctx->node->AddChild(ctx->lastAsText); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -530,8 +543,10 @@ static void CommentHnd(void *userData, const char *data) | |||||||
|         // VS: ctx->node == NULL happens if there is a comment before |         // VS: ctx->node == NULL happens if there is a comment before | ||||||
|         //     the root element (e.g. wxDesigner's output). We ignore such |         //     the root element (e.g. wxDesigner's output). We ignore such | ||||||
|         //     comments, no big deal... |         //     comments, no big deal... | ||||||
|         ctx->node->AddChild(new wxXmlNode(wxXML_COMMENT_NODE, |         ctx->node->AddChild( | ||||||
|                             wxT("comment"), CharToString(ctx->conv, data))); |             new wxXmlNode(wxXML_COMMENT_NODE, | ||||||
|  |                           wxT("comment"), CharToString(ctx->conv, data), | ||||||
|  |                           XML_GetCurrentLineNumber(ctx->parser))); | ||||||
|     } |     } | ||||||
|     ctx->lastAsText = NULL; |     ctx->lastAsText = NULL; | ||||||
| } | } | ||||||
| @@ -609,6 +624,7 @@ bool wxXmlDocument::Load(wxInputStream& stream, const wxString& encoding, int fl | |||||||
|         ctx.conv = new wxCSConv(encoding); |         ctx.conv = new wxCSConv(encoding); | ||||||
| #endif | #endif | ||||||
|     ctx.removeWhiteOnlyNodes = (flags & wxXMLDOC_KEEP_WHITESPACE_NODES) == 0; |     ctx.removeWhiteOnlyNodes = (flags & wxXMLDOC_KEEP_WHITESPACE_NODES) == 0; | ||||||
|  |     ctx.parser = parser; | ||||||
|  |  | ||||||
|     XML_SetUserData(parser, (void*)&ctx); |     XML_SetUserData(parser, (void*)&ctx); | ||||||
|     XML_SetElementHandler(parser, StartElementHnd, EndElementHnd); |     XML_SetElementHandler(parser, StartElementHnd, EndElementHnd); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user