CStdString CMarkupSTL::x_GetAttrib( int iPos, const char * szAttrib ) const { // Return the value of the attrib at specified element if ( ! iPos || m_nNodeType != MNT_ELEMENT ) return _T(""); TokenPos token( m_csDoc ); token.nNext = m_aPos[iPos].nStartL + 1; if ( szAttrib && x_FindAttrib( token, szAttrib ) ) return x_TextFromDoc( token.nL, token.nR - ((token.nR<m_csDoc.GetLength())?0:1) ); return _T(""); }
CString CMarkup::x_GetAttrib( int iPos, LPCTSTR szAttrib ) const { // Return the value of the attrib TokenPos token( m_csDoc ); if ( iPos && m_nNodeType == MNT_ELEMENT ) token.nNext = m_aPos[iPos].nStartL + 1; else return _T(""); if ( szAttrib && x_FindAttrib( token, szAttrib ) ) return x_TextFromDoc( token.nL, token.nR - ((token.nR<m_csDoc.GetLength())?0:1) ); return _T(""); }
CStdString CMarkupSTL::GetAttribName( int n ) const { // Return nth attribute name of main position if ( ! m_iPos || m_nNodeType != MNT_ELEMENT ) return _T(""); TokenPos token( m_csDoc ); token.nNext = m_aPos[m_iPos].nStartL + 1; for ( int nAttrib=0; nAttrib<=n; ++nAttrib ) if ( ! x_FindAttrib(token) ) return _T(""); // Return substring of document return x_GetToken( token ); }
INXString CMarkup::x_GetAttrib( int iPos, char* szAttrib ) const { // Return the value of the attrib char *tempCh = (char*)m_csDoc.c_str(); TokenPos token(tempCh); if ( iPos && m_nNodeType == MNT_ELEMENT ) token.nNext = m_aPos[iPos].nStartL + 1; else { INXString temp(""); return temp; } if ( szAttrib && x_FindAttrib( token, szAttrib ) ) return x_TextFromDoc( token.nL, token.nR - ((token.nR<m_csDoc.GetLength())?0:1) ); INXString temp(""); return temp; }
bool CMarkup::x_SetAttrib( int iPos, LPCTSTR szAttrib, LPCTSTR szValue ) { // Set attribute in iPos element TokenPos token( m_csDoc ); int nInsertAt; if ( iPos && m_nNodeType == MNT_ELEMENT ) { token.nNext = m_aPos[iPos].nStartL + 1; nInsertAt = m_aPos[iPos].nStartR - (m_aPos[iPos].IsEmptyElement()?1:0); } else return false; // Create insertion text depending on whether attribute already exists int nReplace = 0; CString csInsert; if ( x_FindAttrib( token, szAttrib ) ) { // Replace value only // Decision: for empty value leaving attrib="" instead of removing attrib csInsert = x_TextToDoc( szValue, true ); nInsertAt = token.nL; nReplace = token.nR-token.nL+1; } else { // Insert string name value pair CString csFormat; csFormat = _T(" "); csFormat += szAttrib; csFormat += _T("=\""); csFormat += x_TextToDoc( szValue, true ); csFormat += _T("\""); csInsert = csFormat; } x_DocChange( nInsertAt, nReplace, csInsert ); int nAdjust = csInsert.GetLength() - nReplace; m_aPos[iPos].nStartR += nAdjust; m_aPos[iPos].AdjustEnd( nAdjust ); x_Adjust( iPos, nAdjust ); MARKUP_SETDEBUGSTATE; return true; }
bool CMarkupSTL::x_SetAttrib( int iPos, const char * szAttrib, const char * szValue ) { // Set attribute in iPos element if ( ! iPos || m_nNodeType != MNT_ELEMENT ) return false; TokenPos token( m_csDoc ); token.nNext = m_aPos[iPos].nStartL + 1; int nInsertAt, nReplace = 0; CStdString csInsert; if ( x_FindAttrib( token, szAttrib ) ) { // Decision: for empty value leaving attrib="" instead of removing attrib // Replace value only csInsert = x_TextToDoc( szValue, true ); nInsertAt = token.nL; nReplace = token.nR-token.nL+1; } else { // Insert string name value pair CStdString csFormat; csFormat = _T(" "); csFormat += szAttrib; csFormat += _T("=\""); csFormat += x_TextToDoc( szValue, true ); csFormat += _T("\""); csInsert = csFormat; // take into account whether it is an empty element nInsertAt = m_aPos[iPos].nStartR - (m_aPos[iPos].IsEmptyElement()?1:0); } x_DocChange( nInsertAt, nReplace, csInsert ); int nAdjust = csInsert.GetLength() - nReplace; m_aPos[iPos].nStartR += nAdjust; m_aPos[iPos].AdjustEnd( nAdjust ); x_Adjust( iPos, nAdjust ); MARKUP_SETDEBUGSTATE; return true; }