Esempio n. 1
0
CStdString GG::htmlToMsg(CStdString msgIn , void * formats , int & length) {
	int max_len = length;
	length = 0;
	CStdString msg;
	SXML XML;
	RegEx preg;
	msgIn = preg.replace("#\\r|\\n#" , "" , msgIn);
	msgIn = preg.replace("#<br/?>#i" , "\n" , msgIn.c_str());
	XML.loadSource(msgIn);
	SXML::NodeWalkInfo ni;
	size_t last = 0;
	void * formats_start = formats;
	gg_msg_richtext * rt = (gg_msg_richtext*) formats;
	formats = rt+1;
	void * formats_last = formats;
	memset(formats , 0 , sizeof(gg_msg_richtext_format));
/*
bleeeee<b>bold<b><font color="#FF0000">gnie�<u>d�ony</u></font></b>i <i>jesz</i>cze</b>koniec
*/
	FormatState state;
	stack <FormatState> spanStack;

	while (length < max_len - 20 && XML.nodeWalk(ni)) {
		XML.pos.start = XML.pos.end;
		XML.pos.start_end = XML.pos.end_end;
		msg += Stamina::decodeEntities(msgIn.substr(last , ni.start - last));
		last = ni.end;
		CStdString token = ni.path.substr(ni.path.find_last_of('/')+1);
		token.MakeLower();
		int oper = (ni.state == SXML::NodeWalkInfo::opened)? 1 : -1;
		if (token == "b" || token == "strong") {
			state.bold+=oper;
		} else if (token == "i") {
			state.italic+=oper;
		} else if (token == "u") {
			state.under+=oper;
		} else if (token == "font") {
			// Kolor musimy "zamkn��"
			if (oper > 0) state.color++;
			int c = chtoint(XML.getAttrib("color").c_str() , -1);
			state.rgb[0] = (c & 0xFF0000) >> 16;
			state.rgb[1] = (c & 0xFF00) >> 8;
			state.rgb[2] = (c & 0xFF);
		} else if (token == "span") {
			if (oper > 0) {
				spanStack.push(state);
				using Stamina::RegEx;
				static RegEx::oCompiled rcWeight(new RegEx::Compiled("/font-weight:bold/i"));
				//static RegEx::oCompiled rcSize = new RegEx::Compiled("/font-size:(\\d+)/i");
				static RegEx::oCompiled rcColor(new RegEx::Compiled("/color:([a-z]+|#[0-9A-F]+)/i"));
				static RegEx::oCompiled rcItalic(new RegEx::Compiled("/font-style:italic/i"));
				static RegEx::oCompiled rcUnderline(new RegEx::Compiled("/text-decoration:underline/i"));
				CStdString style = XML.getAttrib("style");
				if (RegEx::doMatch(rcWeight, style)) {
					state.bold += oper;
				}
				if (RegEx::doMatch(rcItalic, style)) {
					state.italic += oper;
				}
				if (RegEx::doMatch(rcUnderline, style)) {
					state.under += oper;
				}
				CStdString colorStr = RegEx::doGet(rcColor, style, 1);
				if (!colorStr.empty()) {
					int color = -1;
					if (colorStr[0] == '#') {
						color = Stamina::chtoint(colorStr , -1);
					} else if (colorStr == "red") {
						color = 0xFF0000;
					} else if (colorStr == "blue") {
						color = 0x0000FF;
					} else if (colorStr == "green") {
						color = 0x00FF00;
					}
					if (color > 0) {
						state.color++;
						state.rgb[0] = (color & 0xFF0000) >> 16;
						state.rgb[1] = (color & 0xFF00) >> 8;
						state.rgb[2] = (color & 0xFF);
					}
				}
Esempio n. 2
0
CStdString GG::msgToHtml(CStdString msg , void * formats , int formats_length) {
	/* Zamiast znacznik�w wstawia:
	 < - 1
	 > - 2
	 " - 3
	*/
	str_tr((char*)msg.c_str() , "\1\2\3" , "   ");
	// Przegl�damy list� i modyfikujemy...
	void * formats_end = (char*)formats + formats_length;
	CStdString msg2 = "";
	struct cOpened {
		unsigned int bold :1;
		unsigned int italic : 1;
		unsigned int under : 1;
		unsigned int color: 1;
		void finish(CStdString & txt , int type) {
			if (color) {txt+="\1/font\2"; color = 0;}
			if (!(type & GG_FONT_UNDERLINE) && under) {txt+="\1/u\2"; under = 0;}
			if (!(type & GG_FONT_ITALIC) && italic) {txt+="\1/i\2"; italic = 0;}
			if (!(type & GG_FONT_BOLD) && bold) {txt+="\1/b\2";bold = 0;}
		}
	} opened;
	opened.bold = opened.italic = opened.under = opened.color = 0;
	size_t pos = 0;
	while (formats < formats_end) {
		gg_msg_richtext_format * rf = (gg_msg_richtext_format*)formats;
		if (rf->position >= msg.size())
			break; // b��d
		msg2+= msg.substr(pos , rf->position - pos);
		pos = rf->position;
		opened.finish(msg2 , rf->font);
		if ((rf->font & GG_FONT_BOLD) && !opened.bold) {
			msg2+="\1b\2";
			opened.bold=1;
		}
		if ((rf->font & GG_FONT_ITALIC) && !opened.italic) {
			msg2+="\1i\2";
			opened.italic=1;
		}
		if ((rf->font & GG_FONT_UNDERLINE) && !opened.under) {
			msg2+="\1u\2";
			opened.under=1;
		}
		formats = rf+1;
		if (rf->font & GG_FONT_COLOR) {
			gg_msg_richtext_color * rc = (gg_msg_richtext_color*) formats;
			if (rc->red || rc->green || rc->blue) {
				opened.color=1;
				msg2+="\1font color=\3#";
				msg2+=inttostr(rc->red , 16 , 2 , true);
				msg2+=inttostr(rc->green , 16 , 2 , true);
				msg2+=inttostr(rc->blue , 16 , 2 , true);
				msg2+="\3\2";
			} else opened.color = 0;
			formats = rc+1;
		}
	}
	msg2 += msg.substr(pos);
	opened.finish(msg2 , 0);
	msg = msg2;
	msg2.clear();
	// Ko�cowy efekt "enkodujemy"
	RegEx pr;
	msg = pr.replace("/[^ a-z0-9\1\2\3\\!\\@\\#\\$\\%\\*\\(\\)\\-_=+\\.\\,\\;':\\\\[\\]\\{\\}\\/\\?����󜟿��ʣ�ӌ��]/i" , Stamina::encodeCallback , msg);
	msg = pr.replace("/\\n/" , "<br/>" , msg);
	// Zamieniamy znaki kontrolne w znaczniki HTML
	str_tr((char*)msg.c_str() , "\1\2\3" , "<>\"");
	return msg;
};