Markup.h
上传用户:yokoluohf
上传日期:2013-02-25
资源大小:769k
文件大小:7k
源码类别:

GIS编程

开发平台:

Visual C++

  1. // Markup.h: interface for the CMarkup class.
  2. //
  3. // Markup Release 6.3
  4. // Copyright (C) 1999-2002 First Objective Software, Inc. All rights reserved
  5. // Go to www.firstobject.com for the latest CMarkup and EDOM documentation
  6. // Use in commercial applications requires written permission
  7. // This software is provided "as is", with no warranty.
  8. #if !defined(AFX_MARKUP_H__948A2705_9E68_11D2_A0BF_00105A27C570__INCLUDED_)
  9. #define AFX_MARKUP_H__948A2705_9E68_11D2_A0BF_00105A27C570__INCLUDED_
  10. #if _MSC_VER > 1000
  11. #pragma once
  12. #endif // _MSC_VER > 1000
  13. #include <afxtempl.h>
  14. #ifdef _DEBUG
  15. #define _DS(i) (i?&((LPCTSTR)m_csDoc)[m_aPos[i].nStartL]:0)
  16. #define MARKUP_SETDEBUGSTATE m_pMainDS=_DS(m_iPos); m_pChildDS=_DS(m_iPosChild)
  17. #else
  18. #define MARKUP_SETDEBUGSTATE
  19. #endif
  20. class CMarkup  
  21. {
  22. public:
  23. CMarkup() { SetDoc( NULL ); };
  24. CMarkup( LPCTSTR szDoc ) { SetDoc( szDoc ); };
  25. CMarkup( const CMarkup& markup ) { *this = markup; };
  26. void operator=( const CMarkup& markup );
  27. virtual ~CMarkup() {};
  28. // Navigate
  29. bool Load( LPCTSTR szFileName );
  30. bool SetDoc( LPCTSTR szDoc );
  31. bool IsWellFormed();
  32. bool FindElem( LPCTSTR szName=NULL );
  33. bool FindChildElem( LPCTSTR szName=NULL );
  34. bool IntoElem();
  35. bool OutOfElem();
  36. void ResetChildPos() { x_SetPos(m_iPosParent,m_iPos,0); };
  37. void ResetMainPos() { x_SetPos(m_iPosParent,0,0); };
  38. void ResetPos() { x_SetPos(0,0,0); };
  39. CString GetTagName() const;
  40. CString GetChildTagName() const { return x_GetTagName(m_iPosChild); };
  41. CString GetData() const { return x_GetData(m_iPos); };
  42. CString GetChildData() const { return x_GetData(m_iPosChild); };
  43. CString GetAttr( LPCTSTR szAttr ) const { return x_GetAttr(m_iPos,szAttr); };
  44. CString GetChildAttr( LPCTSTR szAttr ) const { return x_GetAttr(m_iPosChild,szAttr); };
  45. CString GetAttrName( int n ) const;
  46. bool SavePos( LPCTSTR szPosName=_T("") );
  47. bool RestorePos( LPCTSTR szPosName=_T("") );
  48. bool GetOffsets( int& nStart, int& nEnd ) const;
  49. CString GetError() const { return m_csError; };
  50. enum MarkupNodeType
  51. {
  52. MNT_ELEMENT = 1,  // 0x01
  53. MNT_TEXT = 2,  // 0x02
  54. MNT_WHITESPACE = 4,  // 0x04
  55. MNT_CDATA_SECTION = 8,  // 0x08
  56. MNT_PROCESSING_INSTRUCTION = 16, // 0x10
  57. MNT_COMMENT = 32, // 0x20
  58. MNT_DOCUMENT_TYPE = 64, // 0x40
  59. MNT_EXCLUDE_WHITESPACE = 123,// 0x7b
  60. };
  61. // Create
  62. bool Save( LPCTSTR szFileName );
  63. CString GetDoc() const { return m_csDoc; };
  64. bool AddElem( LPCTSTR szName, LPCTSTR szData=NULL ) { return x_AddElem(szName,szData,false,false); };
  65. bool InsertElem( LPCTSTR szName, LPCTSTR szData=NULL ) { return x_AddElem(szName,szData,true,false); };
  66. bool AddChildElem( LPCTSTR szName, LPCTSTR szData=NULL ) { return x_AddElem(szName,szData,false,true); };
  67. bool InsertChildElem( LPCTSTR szName, LPCTSTR szData=NULL ) { return x_AddElem(szName,szData,true,true); };
  68. bool AddAttr( LPCTSTR szAttr, LPCTSTR szValue ) { return x_SetAttr(m_iPos,szAttr,szValue); };
  69. bool AddChildAttr( LPCTSTR szAttr, LPCTSTR szValue ) { return x_SetAttr(m_iPosChild,szAttr,szValue); };
  70. bool AddAttr( LPCTSTR szAttr, int nValue ) { return x_SetAttr(m_iPos,szAttr,nValue); };
  71. bool AddChildAttr( LPCTSTR szAttr, int nValue ) { return x_SetAttr(m_iPosChild,szAttr,nValue); };
  72. bool AddChildSubDoc( LPCTSTR szSubDoc ) { return x_AddSubDoc(szSubDoc,false,true); };
  73. bool InsertChildSubDoc( LPCTSTR szSubDoc ) { return x_AddSubDoc(szSubDoc,true,true); };
  74. CString GetChildSubDoc() const;
  75. // Modify
  76. bool RemoveElem();
  77. bool RemoveChildElem();
  78. bool SetAttr( LPCTSTR szAttr, LPCTSTR szValue ) { return x_SetAttr(m_iPos,szAttr,szValue); };
  79. bool SetChildAttr( LPCTSTR szAttr, LPCTSTR szValue ) { return x_SetAttr(m_iPosChild,szAttr,szValue); };
  80. bool SetAttr( LPCTSTR szAttr, int nValue ) { return x_SetAttr(m_iPos,szAttr,nValue); };
  81. bool SetChildAttr( LPCTSTR szAttr, int nValue ) { return x_SetAttr(m_iPosChild,szAttr,nValue); };
  82. bool SetData( LPCTSTR szData, int nCDATA=0 ) { return x_SetData(m_iPos,szData,nCDATA); };
  83. bool SetChildData( LPCTSTR szData, int nCDATA=0 ) { return x_SetData(m_iPosChild,szData,nCDATA); };
  84. protected:
  85. #ifdef _DEBUG
  86. LPCTSTR m_pMainDS;
  87. LPCTSTR m_pChildDS;
  88. #endif
  89. CString m_csDoc;
  90. CString m_csError;
  91. struct ElemPos
  92. {
  93. ElemPos() { Clear(); };
  94. ElemPos( const ElemPos& pos ) { *this = pos; };
  95. bool IsEmptyElement() const { return (nStartR == nEndL + 1); };
  96. void Clear()
  97. {
  98. nStartL=0; nStartR=0; nEndL=0; nEndR=0; nReserved=0;
  99. iElemParent=0; iElemChild=0; iElemNext=0;
  100. };
  101. void AdjustStart( int n ) { nStartL+=n; nStartR+=n; };
  102. void AdjustEnd( int n ) { nEndL+=n; nEndR+=n; };
  103. int nStartL;
  104. int nStartR;
  105. int nEndL;
  106. int nEndR;
  107. int nReserved;
  108. int iElemParent;
  109. int iElemChild;
  110. int iElemNext;
  111. };
  112. CArray< ElemPos, ElemPos& > m_aPos;
  113. int m_iPosParent;
  114. int m_iPos;
  115. int m_iPosChild;
  116. int m_iPosFree;
  117. int m_nNodeType;
  118. struct TokenPos
  119. {
  120. TokenPos( LPCTSTR sz ) { Clear(); szDoc = sz; };
  121. bool IsValid() const { return (nL <= nR); };
  122. void Clear() { nL=0; nR=-1; nNext=0; bIsString=false; };
  123. bool Match( LPCTSTR szName )
  124. {
  125. int nLen = nR - nL + 1;
  126. // To ignore case, define MARKUP_IGNORECASE
  127. #ifdef MARKUP_IGNORECASE
  128. return ( (_tcsncicmp( &szDoc[nL], szName, nLen ) == 0)
  129. #else
  130. return ( (_tcsnccmp( &szDoc[nL], szName, nLen ) == 0)
  131. #endif
  132. && ( szName[nLen] == _T('') || _tcschr(_T(" =/["),szName[nLen]) ) );
  133. };
  134. int nL;
  135. int nR;
  136. int nNext;
  137. LPCTSTR szDoc;
  138. bool bIsString;
  139. };
  140. struct SavedPos
  141. {
  142. int iPosParent;
  143. int iPos;
  144. int iPosChild;
  145. };
  146. CMap<CString,LPCTSTR,SavedPos,SavedPos> m_mapSavedPos;
  147. void x_SetPos( int iPosParent, int iPos, int iPosChild )
  148. {
  149. m_iPosParent = iPosParent;
  150. m_iPos = iPos;
  151. m_iPosChild = iPosChild;
  152. m_nNodeType = iPos?MNT_ELEMENT:0;
  153. MARKUP_SETDEBUGSTATE;
  154. };
  155. int x_GetFreePos();
  156. int x_ReleasePos();
  157. int x_ParseElem( int iPos );
  158. int x_ParseError( LPCTSTR szError, LPCTSTR szName = NULL );
  159. static bool x_FindChar( LPCTSTR szDoc, int& nChar, _TCHAR c );
  160. static bool x_FindToken( TokenPos& token );
  161. CString x_GetToken( const TokenPos& token ) const;
  162. int x_FindElem( int iPosParent, int iPos, LPCTSTR szPath );
  163. CString x_GetTagName( int iPos ) const;
  164. CString x_GetData( int iPos ) const;
  165. CString x_GetAttr( int iPos, LPCTSTR szAttr ) const;
  166. bool x_AddElem( LPCTSTR szName, LPCTSTR szValue, bool bInsert, bool bAddChild );
  167. bool x_AddSubDoc( LPCTSTR szSubDoc, bool bInsert, bool bAddChild );
  168. bool x_FindAttr( TokenPos& token, LPCTSTR szAttr=NULL ) const;
  169. bool x_SetAttr( int iPos, LPCTSTR szAttr, LPCTSTR szValue );
  170. bool x_SetAttr( int iPos, LPCTSTR szAttr, int nValue );
  171. bool x_CreateNode( CString& csNode, int nNodeType, LPCTSTR szText );
  172. void x_LocateNew( int iPosParent, int& iPosRel, int& nOffset, int nLength, int nFlags );
  173. int x_ParseNode( TokenPos& token );
  174. bool x_SetData( int iPos, LPCTSTR szData, int nCDATA );
  175. int x_RemoveElem( int iPos );
  176. void x_DocChange( int nLeft, int nReplace, const CString& csInsert );
  177. void x_PosInsert( int iPos, int nInsertLength );
  178. void x_Adjust( int iPos, int nShift, bool bAfterPos = false );
  179. CString x_TextToDoc( LPCTSTR szText, bool bAttr = false ) const;
  180. CString x_TextFromDoc( int nLeft, int nRight ) const;
  181. };
  182. #endif // !defined(AFX_MARKUP_H__948A2705_9E68_11D2_A0BF_00105A27C570__INCLUDED_)