亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? htmlfile.cpp.svn-base

?? wince c++ 下 開發(fā)的 rss 閱讀器源代碼
?? SVN-BASE
字號:
/**
 *  HTMLFile.cpp
 *
 *  Copyright (C) 2008  David Andrs <pda@jasnapaka.com>
 *
 *  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.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

#ifdef PRSSR_APP
	#include "../StdAfx.h"
	#include "../prssr.h"
#endif

#ifdef PRSSR_TODAY
	#include "../../prssrtoday/StdAfx.h"
#endif

#include "HTMLFile.h"
#include "../../prssrenc/codepages.h"
#include "../../share/helpers.h"
#include "../../share/str.h"

/*#ifdef MYDEBUG
#undef THIS_FILE
static TCHAR THIS_FILE[] = _T(__FILE__);
#include "../debug/crtdbg.h"
#define new MYDEBUG_NEW
#endif
*/

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CHtmlFile::CHtmlFile() {
	sgmlParserInitialize(&Parser, SGML_EXTENSION_TYPE_HTML, NULL, NULL);
	unsigned long flags = SGML_EXTENSION_HTML_FLAG_STRIPCOMMENT;
	sgmlParserExtensionSetParam(&Parser, SGML_EXTENSION_HTML_PARAM_FLAG, (void *) flags);
}

CHtmlFile::~CHtmlFile() {
	sgmlParserDestroy(&Parser, 0);
}

void CHtmlFile::SetFlags(unsigned long flags) {
	sgmlParserExtensionSetParam(&Parser, SGML_EXTENSION_HTML_PARAM_FLAG, (void *) flags);
}

#define BUFSIZ					16384

BOOL CHtmlFile::LoadFromFile(LPCTSTR fileName) {
	LOG1(1, "CHtmlFile::LoadFromFile('%S')", fileName);

	char buf[BUFSIZ];
	BOOL done;
	int depth = 0;

	HANDLE hFile = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
	if (hFile == INVALID_HANDLE_VALUE) {
		return FALSE;
	}

	BOOL ret = TRUE;

	if (Parser.handlers.preparse)
		Parser.handlers.preparse(&Parser, Parser.internal.userContext);

	SetFilePointer(hFile, 0, NULL, FILE_BEGIN);
	// main load loop with the parsing
	do {
		DWORD read;
		done = FALSE;
		if (ReadFile(hFile, buf, BUFSIZ, &read, NULL)) {
			done = read < BUFSIZ;
			if (!_sgmlParseChunk(&Parser, buf, read)) {
				ret = FALSE;
				break;
			}
		}
		else
			done = TRUE;
	} while (!done);

	if (Parser.handlers.postparse)
		Parser.handlers.postparse(&Parser, Parser.internal.userContext);

	CloseHandle(hFile);

	if (Parser.internal.lastAttributeName)
		free(Parser.internal.lastAttributeName);
	if (Parser.internal.lastElementName)
		free(Parser.internal.lastElementName);
	if (Parser.internal.currentBuffer)
		free(Parser.internal.currentBuffer);

	return ret;
}

#if defined PRSSR_APP

BOOL CHtmlFile::LoadFromMemory(char buffer[], int len) {
	LOG0(7, "CHtmlFile::LoadFromMemory()");

	BOOL ret = TRUE;
	if (sgmlParserParseString(&Parser, buffer, len) == 0) {
	}
	else
		ret = FALSE;

	return ret;
}

BOOL CHtmlFile::LoadFromMemory(const CString &html) {
	LOG0(3, "CHtmlFile::LoadFromMemory()");

	char *s = WCharToChar(html, CP_UTF8);
	BOOL ret = LoadFromMemory(s, strlen(s));
	delete [] s;
	return ret;
}

BOOL CHtmlFile::Save(LPCTSTR fileName) {
	LOG1(3, "CHtmlFile::Save(%S)", fileName);

	FILE *fout = _wfopen(fileName, L"w");
	if (fout != NULL) {
		domNodeSerializeToFd(sgmlExtensionHtmlGetDocument(&Parser), fout);
		fclose(fout);
		return TRUE;
	}
	else
		return FALSE;
}

CString CHtmlFile::ToString() {
	LOG0(3, "CHtmlFile::ToString()");

	char *string;
	unsigned long stringLength = domNodeSerializeToString(GetDocumentNode(), &string);
	if (string != NULL) {
		CString s = CharToWChar(string, CP_UTF8);
		free(string);
		return s;
	}
	else
		return _T("");
}

BOOL CHtmlFile::DetectEncoding(DOM_NODE *node) {
	LOG1(3, "CHtmlFile::DetectEncoding(%p)", node);

	BOOL res = FALSE;

	const char *tag = domNodeGetName(node);
	if (tag != NULL && node != NULL) {
		if (_stricmp(tag, "meta") == 0) {
			const char *content = domElementGetAttribute(node, "content");
			const char *httpEquiv = domElementGetAttribute(node, "http-equiv");
			LOG2(5, "httpEquiv = '%s' content='%s'", httpEquiv, content);

			if (content != NULL) {
//			if (httpEquiv != NULL && _stricmp(httpEquiv, "content-type") == 0) {
				LOG1(5, "content-type: %s", content);

				char *ctnt = _strdup(content);
				_strlwr(ctnt);

				char *charset = strstr(ctnt, "charset=");
				if (charset != NULL) {
					char *semicolon = strchr(charset, ';');
					if (semicolon != NULL)
						*semicolon = '\0';

					Charset.Format(_T("%S"), charset + 8);
					res = TRUE;
				}

				free(ctnt);
			}
		}
		else if (_stricmp(tag, "body") == 0) {
			// <body> tag reached, end iterating
			return TRUE;
		}
	}

	DOM_NODE *child = domNodeGetFirstChild(node);
	while (!res && child != NULL) {
		res = DetectEncoding(child);
		child = domNodeGetNextSibling(child);
	}

	return res;
}

void CHtmlFile::DetectEncoding(const CString &encoding) {
	LOG1(3, "CHtmlFile::DetectEncoding('%S')", encoding);

	Charset.Empty();
	DetectEncoding(GetDocumentNode());

	if (Charset.IsEmpty())	// not found, set encoding according to the parameter
		Charset = encoding;
}

//
// Codepage convert
//
// based on libexpat recoding engine
//

static int
utf8EncodingConvert(void *data, const char *p) {
	unsigned short c = '?';

	BYTE *a = (BYTE *) p;

	if (a[0] < 0xc0)
		c = a[0];
	else if (a[0] < 0xe0)
		MultiByteToWideChar(CP_UTF8, 0, p, 2, &c, 1);
	else if (a[0] < 0xf0)
		MultiByteToWideChar(CP_UTF8, 0, p, 3, &c, 1);
	else if (a[0] <= 0xf4)
		MultiByteToWideChar(CP_UTF8, 0, p, 4, &c, 1);
	else
		c = a[0];

	return c;
}


static int
unknownEncodingConvert(void *data, const char *p) {
	int c = *p;
	return c;
}

static int
big5EncodingConvert(void *data, const char *p) {
	int c;

	BYTE *cs = (BYTE *) p;
	if (cs[0] < 0x80) {
		// single byte
		c = cs[0];
	}
	else {
		// two bytes
		int idx1 = cs[0] - 0xA1;
		if (cs[1] >= 0x40 && cs[1] <= 0x7E) {
			int idx2 = cs[1] - 0x40;
			c = cpBig5_1[(idx1 * 0x3F) + idx2];
		}
		else if (cs[1] >= 0xA1 && cs[1] <= 0xFE) {
			int idx2 = cs[1] - 0xA1;
			c = cpBig5_2[(idx1 * 0x5E) + idx2];
		}
		else
			c = '?';
	}

	return c;
}

static int
eucJpEncodingConvert(void *data, const char *p) {
	int c;

	BYTE *cs = (BYTE *) p;
	if (cs[0] < 0xA1 || cs[0] == 0xFF) {
		// single byte
		c = cs[0];
	}
	else if (cs[0] == 0x8E) {
		c = 0xFF61 + (cs[1] - 0xA1);
	}
	else {
		// two bytes
		if (cs[0] >= 0xA1 && cs[0] <= 0xFE &&
			cs[1] >= 0xA1 && cs[1] <= 0xFE)
		{
			int idx1 = cs[0] - 0xA1;
			int idx2 = cs[1] - 0xA1;
			c = cpEUC_JP[(idx1 * 0x5E) + idx2];
		}
		else {
			c = '?';
		}
	}

	return c;
}

static int
eucKrEncodingConvert(void *data, const char *p) {
	int c = -1;

	BYTE *cs = (BYTE *) p;
	if (cs[0] <= 0x7E || cs[0] == 0xFF) {
		// single byte
		c = cs[0];
	}
	else if (cs[0] >= 0x81 && cs[0] <= 0xFE) {
		// two bytes
		int idx1 = cs[0] - 0x81;
		if (cs[1] >= 0x41 && cs[1] <= 0x5A) {
			int idx2 = cs[1] - 0x41;
			c = cpEUC_KR1[(idx1 * 0x7E) + idx2];
		}
		else if (cs[1] >= 0x61 && cs[1] <= 0x7A) {
			int idx2 = cs[1] - 0x61;
			c = cpEUC_KR2[(idx1 * 0x7E) + idx2];
		}
		else if (cs[1] >= 0x81 && cs[1] <= 0xFE) {
			int idx2 = cs[1] - 0x81;
			c = cpEUC_KR3[(idx1 * 0x7E) + idx2];
		}
	}

	return c;
}

static int XMLCALL
gbkEncodingConvert(void *data, const char *p) {
	int c;

	BYTE *cs = (BYTE *) p;
	if (cs[0] < 0x80) 					// single byte
		c = cs[0];
	else if (cs[0] == 0x80)
		c = 0x20AC;						// euro sign
	else {
		// two bytes (the first is the index of the subtable, the second is the character inside the subtable)
		int idx = ((cs[0] - 0x81) * 0xC0) + (cs[1] - 0x40);			// size of the subtable is 0x0C, each subtable starts with char 0x40
		c = cpGBK[idx];
	}

	return c;
}


bool setEncoding(const TCHAR *encoding, XML_Encoding *info) {
	LOG1(7, "setEncoding(, '%S', )", encoding);

	int i;

	if (wcscmp(encoding, _T("big5")) == 0) {
		// first 0x80 bytes are single byte
		for (i = 0; i < 0x80; i++) info->map[i] = i;
		// the rest is 2-byte
		for (i = 0x80; i <= 0xFF; i++) info->map[i] = -2;
		info->convert = big5EncodingConvert;
	}
	else if (wcsncmp(encoding, _T("euc-jp"), 6) == 0) {
		// first 0x80 bytes are single byte
		for (i = 0; i <= 0x8D; i++) info->map[i] = i;
		info->map[0x8E] = -2;
		info->map[0x8F] = -3;
		for (i = 0x90; i <= 0x9F; i++) info->map[i] = i;
		info->map[0xA0] = -1;
		// the rest is 2-byte
		for (i = 0xA1; i <= 0xFE; i++) info->map[i] = -2;
		info->map[0xFF] = -1;
		info->convert = eucJpEncodingConvert;
	}
	else if (wcsncmp(encoding, _T("euc-kr"), 6) == 0 ||
		wcsncmp(encoding, _T("ks_c_5601-1987"), 14) == 0)
	{
		// first 0x80 bytes are single byte
		for (i = 0; i <= 0x7E; i++) info->map[i] = i;
		info->map[0x7F] = -1;
		info->map[0x80] = -1;
		for (i = 0x81; i <= 0xFE; i++) info->map[i] = -2;
		info->map[0xFF] = -1;
		info->convert = eucKrEncodingConvert;
	}
	else if (wcsncmp(encoding, _T("gb"), 2) == 0) {	// gbk encoding
		// first 0x80 bytes are single byte
		for (i = 0x00; i <= 0x80; i++) info->map[i] = i;
		for (i = 0x81; i <= 0xFF; i++) info->map[i] = -2;
		info->convert = gbkEncodingConvert;
	}
	else if (wcscmp(encoding, _T("utf-8")) == 0) {
		for (i = 0; i < 0xc0; i++) info->map[i] = i;
		for (i = 0xc0; i <  0xe0; i++) info->map[i] = -2;
		for (i = 0xe0; i <  0xf0; i++) info->map[i] = -3;
		for (i = 0xf0; i <= 0xf4; i++) info->map[i] = -4;
		for (i = 0xf5; i <= 0xff; i++) info->map[i] = i;
		info->convert = utf8EncodingConvert;
	}
	else {
		WORD *map;
		if (wcscmp(encoding, _T("iso-8859-2")) == 0) map = cpISO_8859_2;
		else if (wcscmp(encoding, _T("iso-8859-3")) == 0) map = cpISO_8859_3;
		else if (wcscmp(encoding, _T("iso-8859-4")) == 0) map = cpISO_8859_4;
		else if (wcscmp(encoding, _T("iso-8859-5")) == 0) map = cpISO_8859_5;
		else if (wcscmp(encoding, _T("iso-8859-6")) == 0) map = cpISO_8859_6;
		else if (wcscmp(encoding, _T("iso-8859-7")) == 0) map = cpISO_8859_7;
		else if (wcscmp(encoding, _T("iso-8859-8")) == 0) map = cpISO_8859_8;
		else if (wcscmp(encoding, _T("iso-8859-9")) == 0) map = cpISO_8859_9;
		else if (wcscmp(encoding, _T("iso-8859-10")) == 0) map = cpISO_8859_10;
		else if (wcscmp(encoding, _T("iso-8859-11")) == 0) map = cpISO_8859_11;
		else if (wcscmp(encoding, _T("iso-8859-13")) == 0) map = cpISO_8859_13;
		else if (wcscmp(encoding, _T("iso-8859-14")) == 0) map = cpISO_8859_14;
		else if (wcscmp(encoding, _T("iso-8859-15")) == 0) map = cpISO_8859_15;
		else if (wcscmp(encoding, _T("iso-8859-16")) == 0) map = cpISO_8859_16;
		else if (wcscmp(encoding, _T("windows-1250")) == 0) map = cpCP1250;
		else if (wcscmp(encoding, _T("windows-1251")) == 0) map = cpCP1251;
		else if (wcscmp(encoding, _T("windows-1252")) == 0) map = cpCP1252;
		else if (wcscmp(encoding, _T("windows-1253")) == 0) map = cpCP1253;
		else if (wcscmp(encoding, _T("windows-1254")) == 0) map = cpCP1254;
		else if (wcscmp(encoding, _T("windows-1255")) == 0) map = cpCP1255;
		else if (wcscmp(encoding, _T("windows-1256")) == 0) map = cpCP1256;
		else if (wcscmp(encoding, _T("windows-1257")) == 0) map = cpCP1257;
		else if (wcscmp(encoding, _T("windows-1258")) == 0) map = cpCP1258;
		else if (wcscmp(encoding, _T("koi8-r")) == 0) map = cpKOI8_R;
		else map = cpCP1252; // fallback encoding

		for (i = 0; i < 256; i++)
			info->map[i] = map[i];
		info->convert = unknownEncodingConvert;
	}

	return true;
}

CString recode(const char *str, XML_Encoding *enc_info) {
	LOG2(3, "recode('%s', %p)", str, enc_info);

	CString out;

	if (enc_info == NULL) {
		out.Format(_T("%S"), str);
	}
	else {
		for (const char *s = str; *s != '\0';) {
			int c = enc_info->map[(BYTE) *s];
			if (c < 0) {
				if (enc_info->convert != NULL) {
					int len = -c;
					c = enc_info->convert(NULL, s);
					s += len;
				}
				else
					s++;
			}
			else
				s++;
			out += TCHAR(c);
		}
	}

	return out;
}


void CHtmlFile::Recode(DOM_NODE *node) {
	LOG1(5, "CHtmlFile::Recode(%p)", node);

	DOM_NODE *curr;
	CString str;

	//
	if (node == NULL) return;

	switch (node->type) {
		case DOM_NODE_TYPE_TEXT:
			str = recode(node->value, &EncInfo);
			if (node->value)
				free(node->value);
			node->value = WCharToChar(str, CP_UTF8);
			break;

		case DOM_NODE_TYPE_ELEMENT:
			for (curr = node->attributes; curr; curr = curr->nextSibling) {
				if (curr->value && *curr->value) {
					str = recode(curr->value, &EncInfo);
					if (curr->value) free(curr->value);
					curr->value = WCharToChar(str, CP_UTF8);
				}
			}
			break;
	} // switch

	DOM_NODE *child = domNodeGetFirstChild(node);
	while (child != NULL) {
		Recode(child);
		child = domNodeGetNextSibling(child);
	}
}

void CHtmlFile::Recode() {
	LOG0(1, "CHtmlFile::Recode()");

	setEncoding(Charset, &EncInfo);
	Recode(GetDocumentNode());
}

#endif

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一本到不卡精品视频在线观看 | 日韩国产欧美在线视频| 色伊人久久综合中文字幕| 亚洲欧美激情视频在线观看一区二区三区| 国产成人在线免费观看| 国产欧美日韩视频一区二区| 成人福利视频在线| 亚洲欧洲成人自拍| 在线一区二区三区四区| 一区二区三区日本| 欧美日韩高清一区| 免费观看成人鲁鲁鲁鲁鲁视频| 欧美精品三级在线观看| 精品一区二区三区的国产在线播放| 精品国产a毛片| 成人av电影在线观看| 蜜桃传媒麻豆第一区在线观看| 日韩午夜在线观看| 高清不卡在线观看| 一区二区三区电影在线播| 在线成人av网站| 韩国女主播一区二区三区| 欧美国产精品v| 在线观看不卡视频| 激情丁香综合五月| 中文字幕制服丝袜一区二区三区| 色婷婷综合久久久中文字幕| 青椒成人免费视频| 国产精品国产自产拍高清av王其| 欧美性高清videossexo| 麻豆精品在线观看| 亚洲欧美在线aaa| 欧美一区二区精品在线| 成人国产精品免费观看动漫| 亚洲高清免费视频| 亚洲国产激情av| 欧美熟乱第一页| 国产不卡在线一区| 日韩av电影天堂| 亚洲精品乱码久久久久久黑人| 日韩精品一区二区三区中文精品| 成人免费三级在线| 免费欧美高清视频| 亚洲免费在线播放| 欧美激情自拍偷拍| 日韩视频一区二区在线观看| 一本一道综合狠狠老| 国产在线视频精品一区| 亚洲另类色综合网站| 久久综合久久鬼色| 欧美性猛片xxxx免费看久爱| 国产成人丝袜美腿| 美国欧美日韩国产在线播放| 亚洲精品免费在线| 国产精品美女久久久久久久久久久 | 婷婷久久综合九色国产成人| 久久久精品免费观看| 欧美精品色一区二区三区| 色综合天天视频在线观看| 国产精品一区不卡| 美女www一区二区| 视频一区二区三区入口| 亚洲综合久久av| 亚洲欧美乱综合| 综合久久久久久| 中文字幕免费观看一区| 精品国产乱码久久久久久影片| 在线成人av网站| 欧美精品在欧美一区二区少妇| 99精品视频免费在线观看| 国产传媒久久文化传媒| 国产在线观看免费一区| 精品在线观看视频| 美腿丝袜亚洲综合| 美女高潮久久久| 精品无人码麻豆乱码1区2区| 免费精品视频在线| 日韩高清在线不卡| 成人夜色视频网站在线观看| 蜜桃久久av一区| 激情综合网最新| 激情成人午夜视频| 国产精品一二三四| 国产永久精品大片wwwapp| 激情综合亚洲精品| 国产精品一线二线三线精华| 国产乱一区二区| 国产成人日日夜夜| 99免费精品视频| 色综合激情五月| 欧美三级电影精品| 7777精品伊人久久久大香线蕉最新版 | 精品国产麻豆免费人成网站| 26uuu亚洲综合色| 中日韩免费视频中文字幕| 自拍视频在线观看一区二区| 亚洲乱码日产精品bd| 亚洲国产乱码最新视频| 日韩影院精彩在线| 久久国产夜色精品鲁鲁99| 国模冰冰炮一区二区| 99麻豆久久久国产精品免费 | 99久久精品免费精品国产| 色婷婷综合五月| 91精品欧美综合在线观看最新| 91精品国产麻豆| 久久久91精品国产一区二区精品 | 亚洲成人三级小说| 极品尤物av久久免费看| 成人免费视频视频在线观看免费| 91麻豆精品秘密| 337p亚洲精品色噜噜噜| 久久久不卡影院| 亚洲综合成人在线| 午夜伦理一区二区| 大美女一区二区三区| 欧美三级电影在线观看| 久久久久久麻豆| 亚洲一区二区三区不卡国产欧美 | 日日摸夜夜添夜夜添亚洲女人| 国产一区二区免费看| 在线精品视频免费播放| 久久综合九色综合欧美亚洲| 亚洲美女视频在线| 欧美自拍偷拍一区| 日韩免费高清av| 亚洲美女淫视频| 国产一区二区美女| 欧美乱妇一区二区三区不卡视频| 国产午夜久久久久| 日本网站在线观看一区二区三区 | 成人av网站在线观看| 欧美一区三区二区| 亚洲区小说区图片区qvod| 国产剧情在线观看一区二区| 在线观看视频一区二区| 国产精品欧美经典| 久久精品噜噜噜成人88aⅴ| 91久久精品网| 国产精品久久久久影视| 老司机免费视频一区二区三区| 欧美亚洲一区三区| 中文字幕一区在线观看| 国产精品1024| 欧美大片日本大片免费观看| 亚洲午夜在线观看视频在线| www.在线欧美| 久久久电影一区二区三区| 麻豆精品视频在线| 欧美精品九九99久久| 亚洲嫩草精品久久| 成人18视频在线播放| 久久九九国产精品| 狠狠色丁香久久婷婷综合丁香| 欧美群妇大交群的观看方式| 亚洲激情校园春色| 91理论电影在线观看| 国产精品美女一区二区| 成人午夜在线播放| 国产日产欧美一区| 国产.欧美.日韩| 日本一区二区在线不卡| 国产精品一二三| 国产亚洲欧美色| 国产成人av福利| 亚洲国产精品国自产拍av| 国产精品1024| 国产精品美女久久久久高潮| 成人手机电影网| 中文字幕一区二区三| 成人免费视频一区| 亚洲少妇最新在线视频| 91亚洲大成网污www| 一区二区免费看| 欧美精品丝袜中出| av资源站一区| 亚洲视频你懂的| 欧美四级电影网| 丝袜亚洲另类丝袜在线| 日韩精品影音先锋| 久久99国内精品| 中文av一区二区| 欧美在线三级电影| 日韩电影一区二区三区四区| 欧美一激情一区二区三区| 精品无人区卡一卡二卡三乱码免费卡| xvideos.蜜桃一区二区| 成人黄色一级视频| 亚洲一区二区美女| 日韩欧美一区二区视频| 国产乱码精品一区二区三区av| 亚洲国产精品激情在线观看| 色狠狠av一区二区三区| 日韩成人午夜精品| 久久久久久久久久电影| av电影在线不卡| 日韩精品一区第一页| 欧美极品少妇xxxxⅹ高跟鞋| 91免费版pro下载短视频| 日韩avvvv在线播放|