?? html.cpp
字號:
/*************************************************************************** html.cpp - description ------------------- begin : Fri Jul 20 2001 copyright : (C) 2001 by Mark email : alben@yeah.net ***************************************************************************//*************************************************************************** * * * 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 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/#include <fstream.h>#include <stdio.h>#include "html.h"// ex: <$test$><$/test$>static const char s_sPartStartTag[] = "<$";static const char s_sPartEndTag[] = "$>";static const char s_chPartTailTag = '/';// ex: <%test%>static const char s_sReplaceStartTag[] = "<%";static const char s_sReplaceEndTag[] = "%>";const string CHtmlDocument::top = "";void CReplacePart::ParsePart(const string& strHtml){ int iPos = 0; while (true) { if (!FindTextElement(strHtml, iPos)) //end of html return; FindTagElement(strHtml, iPos); }}bool CReplacePart::FindTextElement(const string& strHtml, int& iPos){ int iTagPos; if ((iTagPos = strHtml.find(s_sReplaceStartTag, iPos)) == string::npos) { m_stPart.push_back(CReplaceElement(CReplaceElement::TEXT, strHtml.substr(iPos))); return false; } m_stPart.push_back(CReplaceElement(CReplaceElement::TEXT, strHtml.substr(iPos, iTagPos-iPos))); iPos = iTagPos; return true;}bool CReplacePart::FindTagElement(const string& strHtml, int& iPos){ string strTagName; GetReplaceTagName(strTagName, strHtml, iPos); m_stPart.push_back(CReplaceElement(CReplaceElement::TAG, strTagName)); return true;}void CReplacePart::GetReplaceTagName(string& strTagName, const string& strHtml, int& iPos){ iPos += strlen(s_sReplaceStartTag); int iTagPos = strHtml.find(s_sReplaceEndTag, iPos); if (iTagPos == string::npos) { string strException("can not find "); strException += s_sReplaceEndTag; strException += "."; throw CHtmlException(strException.c_str(), __FILE__, __LINE__); } if (iTagPos == iPos) throw CHtmlException("replace tag name is empty.", __FILE__, __LINE__); strTagName = strHtml.substr(iPos, iTagPos-iPos); iPos = iTagPos + strlen(s_sReplaceEndTag);}void CReplacePart::Replace(ostream& os, CReplaceMap& stReplaceMap){ for (int i = 0; i < m_stPart.size(); i++) { if (m_stPart[i].m_iType == CReplaceElement::TEXT) { os << m_stPart[i].m_strContent; continue; } if (m_stPart[i].m_iType == CReplaceElement::TAG) os << stReplaceMap[m_stPart[i].m_strContent]; }}CHtmlDocument::CHtmlDocument(const char* sHtmlFilePath){ Open(sHtmlFilePath);}void CHtmlDocument::Open(const char* sHtmlFilePath){ ifstream file(sHtmlFilePath, ios::in | ios::nocreate); if (file.fail()) throw CFileException("open html file fail.", __FILE__, __LINE__); file.seekg(0, ios::end); streampos sp = file.tellg(); if (file.fail()) throw CFileException("get html file length fail.", __FILE__, __LINE__); char* achHtml = new char[sp]; if (achHtml == NULL) throw CMemException("out of memory.", __FILE__, __LINE__); file.seekg(0, ios::beg); file.read(achHtml, sp); if (file.fail()) { delete [] achHtml; throw CFileException("read html file fail.", __FILE__, __LINE__); } string strHtml; strHtml.append(achHtml, sp); delete achHtml; ParseHtml(strHtml);}CHtmlDocument::~CHtmlDocument(){} void CHtmlDocument::ParseHtml(const string& strHtml){ int iPos = 0; string strTagName = CHtmlDocument::top; while (true) { if (!FindTextPart(strTagName, strHtml, iPos)) //end of html return; FindReplacePart(strTagName, strHtml, iPos); }}bool CHtmlDocument::FindTextPart(const string& strTagName, const string& strHtml, int& iPos){ int iTagPos; if ((iTagPos = strHtml.find(s_sPartStartTag, iPos)) == string::npos) { m_stTextParts[strTagName] = strHtml.substr(iPos); return false; } m_stTextParts[strTagName] = strHtml.substr(iPos, iTagPos-iPos); iPos = iTagPos; return true;}bool CHtmlDocument::FindReplacePart(string& strTagName, const string& strHtml, int& iPos){ string strReplacePart; GetPartTagName(strTagName, strHtml, iPos); GetPartString(strReplacePart, strTagName, strHtml, iPos); m_stReplaceParts[strTagName] = CReplacePart(strReplacePart); return true;}void CHtmlDocument::GetPartTagName(string& strTagName, const string& strHtml, int& iPos){ iPos += strlen(s_sPartStartTag); int iTagPos = strHtml.find(s_sPartEndTag, iPos); if (iTagPos == string::npos) { string strException("can not find "); strException += s_sPartEndTag; strException += "."; throw CHtmlException(strException.c_str(), __FILE__, __LINE__); } if (iTagPos == iPos) throw CHtmlException("part tag name is empty.", __FILE__, __LINE__); strTagName = strHtml.substr(iPos, iTagPos-iPos); iPos = iTagPos + strlen(s_sPartEndTag);}void CHtmlDocument::GetPartString(string& strReplacePart, const string& strTagName, const string& strHtml, int& iPos){ string strTag = s_sPartStartTag; strTag += s_chPartTailTag; strTag += strTagName; strTag += s_sPartEndTag; int iTagPos = strHtml.find(strTag.c_str(), iPos); if (iTagPos == string::npos) { string strException("can not find "); strException += strTag; strException += "."; throw CHtmlException(strException.c_str(), __FILE__, __LINE__); } strReplacePart = strHtml.substr(iPos, iTagPos-iPos); iPos = iTagPos + strTag.length();}void CHtmlDocument::Replace(ostream& os, const char* strTagName, ...){ va_list ap; va_start(ap, strTagName); char *pchName, *pchValue; CReplaceMap stReplaceMap; while ((pchName = va_arg(ap, char*))) { pchValue = va_arg(ap, char*); stReplaceMap[pchName] = pchValue; } va_end(ap); Replace(os, strTagName, stReplaceMap);}void CHtmlDocument::ReplaceF(ostream& os, const char* strTagName, ...){ va_list ap; va_start(ap, strTagName); char *pchName, *pchValue; int iValue; long lValue; double dValue; int iFormat; CReplaceMap stReplaceMap; char sTmp[64]; while ((pchName = va_arg(ap, char*))) { iFormat = va_arg(ap, int); switch (iFormat) { case STRING: pchValue = va_arg(ap, char*); stReplaceMap[pchName] = pchValue; break; case INT: iValue = va_arg(ap, int); sprintf(sTmp, "%d", iValue); stReplaceMap[pchName] = sTmp; break; case LONG: lValue = va_arg(ap, long); sprintf(sTmp, "%ld", lValue); stReplaceMap[pchName] = sTmp; break; case DOUBLE: dValue = va_arg(ap, double); sprintf(sTmp, "%f", dValue); stReplaceMap[pchName] = sTmp; break; } } va_end(ap); Replace(os, strTagName, stReplaceMap);}string& UrlEncode(const string& strSrc, string& strDest){ for (int i = 0; i < strSrc.length(); i++) { switch (strSrc[i]) { case '&': strDest += "%26"; break; case '=': strDest += "%3D"; break; case '%': strDest += "%25"; break; case '+': strDest += "%2B"; break; case '?': strDest += "%3F"; break; case ' ': strDest += "+"; break; default: strDest += strSrc[i]; break; } } return strDest;}string& UrlDecode(const string& strSrc, string& strDest){ char sTmp[3]; sTmp[2] = 0; unsigned int uiTmp; int i = 0; while (i < strSrc.length()) { switch (strSrc[i]) { case '+': strDest += ' '; i++; break; case '%': if (i+2 >= strSrc.length()) throw CHtmlException("source url error.", __FILE__, __LINE__); sTmp[0] = strSrc[i+1]; sTmp[1] = strSrc[i+2]; sscanf(sTmp, "%x", &uiTmp); strDest += (char)uiTmp; i += 3; break; default: strDest += strSrc[i]; i++; break; } } return strDest;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -