⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 html.cpp

📁 一套linux下的C++开发库
💻 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 + -