执行后效果:

前端使用:

后台SuperRichText解析code

void SuperRichText::renderNode(tinyxml2::XMLNode *node){

while (node!=nullptr) {

if (node->ToText()) {

CCLOG("文本信息:%s",node->ToText()->Value());

auto n=node->ToText();

std::u16string text;

StringUtils::UTF8ToUTF16(n->Value(),text);

std::u16string::size_type pos=0;

pos=text.find('\n');

while ((pos!=std::u16string::npos)) {

text.erase(pos,1);

pos=text.find('\n',pos);

}

pos=0;

pos=text.find('\r');

while ((pos!=std::u16string::npos)) {

text.erase(pos,1);

pos=text.find('\r',pos);

}

std::string utf8Text;

StringUtils::UTF16ToUTF8(text,utf8Text);

auto font=_fontList[_fontList.size()-1];

auto textElement=ui::RichElementText::create(0,font.color,font.opacity,utf8Text,font.fontName,font.fontSize);

_line->pushBackElement(textElement);

}else if (node->ToElement()){

auto n=node->ToElement();

std::string name=n->Name();

std::transform(name.begin(),name.end(),name.begin(),::toupper);

if (name=="FONT") {

CCLOG("字体标签");

auto attr=n->FirstAttribute();

FontInfo newFont=_fontList[_fontList.size()-1];

while (attr!=nullptr) {

//遍历所有属性

std::string attrName=attr->Name();

std::transform(attrName.begin(),attrName.end(),attrName.begin(),::toupper);

if (attrName=="FACE") {

//设置字体

newFont.fontName=attr->Value();

}else if (attrName=="COLOR"){

//设置颜色

newFont.color=charToColor3B(attr->Value());

}else if(attrName=="SIZE"){

//设置大小

newFont.fontSize=attr->IntValue();

}else if (attrName=="OPACITY"){

//设置不透明度

newFont.opacity=attr->IntValue();

}

attr=attr->Next();

}

_fontList.push_back(newFont);//添加新字体

renderNode(n->FirstChild());//继续渲染子集

_fontList.pop_back();//移除新字体

}else if (name=="IMG") {

CCLOG("图片标签");

//图片标签的属性

auto attr=n->FirstAttribute();

const char *src;

Color3B col(255,255,255);

GLubyte opacity=255;

while (attr!=nullptr) {

//遍历所有属性

std::string attrName=attr->Name();

std::transform(attrName.begin(),attrName.end(),attrName.begin(),::toupper);

if (attrName=="SRC") {

//设置图片路径

src=attr->Value();

}else if (attrName=="COLOR"){

//设置颜色

col=charToColor3B(attr->Value());

}else if (attrName=="OPACITY"){

//设置不透明度

opacity=attr->IntValue();

}

attr=attr->Next();

}

auto img=ui::RichElementImage::create(0,col,opacity,src);

_line->pushBackElement(img);

}else if (name=="BR") {

CCLOG("换行标签");

addNewLine();

}

}

node=node->NextSibling();

}

}

cocos2d-x之 利用富文本控件解析xhml标签(文字标签,图片标签,换行标签,标签属性)的更多相关文章

  1. cocos2d-x之利用富文本控件遍历xml

    1. #ifndef SuperRichText_hpp #define SuperRichText_hpp #include <stdio.h> #include "cocos ...

  2. ASP.NET MVC 页面使用富文本控件的XSS漏洞问题

    目前在做的项目存在XSS安全漏洞! 原因是有一些页面使用了富文本编辑框,为了使得其内容可以提交,为相关action设置了[ValidateInput(false)] 特性: [HttpPost] [V ...

  3. ASP.NET MVC或者.net Core mvc 页面使用富文本控件的 保存问题

    https://blog.csdn.net/leftfist/article/details/69629394 目前在做的项目存在XSS安全漏洞! 原因是有一些页面使用了富文本编辑框,为了使得其内容可 ...

  4. MFC入门(三)-- MFC图片/文字控件(循环显示文字和图片的小程序)

    惯例附上前几个博客的链接: MFC入门(一)简单配置:http://blog.csdn.net/zmdsjtu/article/details/52311107 MFC入门(二)读取输入字符:http ...

  5. [寒江孤叶丶的Cocos2d-x之旅_33]RichTextEx一款通过HTML标签控制文字样式的富文本控件

    RichTextEx一款通过HTML标签控制文字样式的富文本控件 原创文章,欢迎转载.转载请注明:文章来自[寒江孤叶丶的Cocos2d-x之旅系列] 博客地址:http://blog.csdn.net ...

  6. 解决方案:带格式化文本控件( RichText)的模板如果在InfoPath的浏览器中加载可能出现 COM 组件的80040154错误

      建议大家在微软的组件出现问题时,在GOOGLE上搜索解决方案,一般来说,总有结果:  带格式化文本控件( RichText)的模板如果在InfoPath的浏览器中加载,可能出现 COM 组件的80 ...

  7. WCF学习(二)对控件简单了解以及4个文本控件的简介

    WPF基础控件 系统默认提供的基础控件: 文本控件介绍与用法 Label控件 label控件:一般用户描述性文字显示. 在Label控件使用时,一般给予用户提示.用法上没有什么很特殊的,label控件 ...

  8. 重新想象 Windows 8 Store Apps (1) - 控件之文本控件: TextBlock, TextBox, PasswordBox, RichEditBox, RichTextBlock, RichTextBlockOverflow

    原文:重新想象 Windows 8 Store Apps (1) - 控件之文本控件: TextBlock, TextBox, PasswordBox, RichEditBox, RichTextBl ...

  9. wxPython中按钮、文本控件的简单运用

    本节学习图形用户界面 ------------------------ 本节介绍如何创建python程序的图形用户界面(GUI),也就是那些带有按钮和文本框的窗口.这里介绍wxPython : 下载地 ...

随机推荐

  1. python signal信号

    作用:发送和接收异步系统信号 信号是一个操作系统特性,它提供了一个途径可以通知程序发生了一个事件并异步处理这个事件.信号可以由系统本身生成,也可以从一个进程发送到另一个进程. 由于信号会中断程序的正常 ...

  2. Scalaz(6)- typeclass:Functor-just map

    Functor是范畴学(Category theory)里的概念.不过无须担心,我们在scala FP编程里并不需要先掌握范畴学知识的.在scalaz里,Functor就是一个普通的typeclass ...

  3. 性能测试学习之二 ——性能测试模型(PV计算模型)

    PV计算模型 现有的PV计算公式是: 每台服务器每秒平均PV量 =( (总PV*80%)/(24*60*60*40%))/服务器数量 =2*(总PV)/* (24*60*60) /服务器数量 通过定积 ...

  4. GJM : Unity3D - NetWork - Hight Level API ( HLAPI) [转载]

    介绍在本系列教程中,我们将使用的网络高级API(HLAPI)来构建一个小型的多人网络案例.即使我们的例子很简单,但也会涵盖以下关键概念,这应该可以帮助大家使用HLAPI构建大型游戏项目. 在第一部分, ...

  5. ajax传参到实体类对应字段

    之前看公司的代码,从页面ajax传参数到接口类,接口类用一个实体接收.我一直以为c#会自动识别,赋值到同名的字段. 我曾和朋友讨论过,双方辩论.朋友认为c#没有这种功能,没有这样高级匹配的机制.而我因 ...

  6. Hibernate(五)__hql语句

    hql(hibernate query language)功能强大. 首先回忆下之前我们接触的对数据对象的操作: ①删除session.delete(对象) ②保存session.save(对象)   ...

  7. Tsql查询执行顺序(二)

    来源:http://www.cnblogs.com/gaiyang/archive/2011/04/13/2014356.html T-SQL查询处理这种逻辑处理顺序,是理论上的处理过程,实际情况还会 ...

  8. SharePoint 2013 新建项目字段自动加载上次保存值

    1.点击进入NewForm.aspx页面,编辑页面,插入Script Editor WebPart,如下图: 2.插入后如下图,拖动AutoRecord WebPart到脚本编辑器上面,防止因为加载顺 ...

  9. 使用Aircrack-ng进行无线安全审计

    设置监听模式 激活网卡 ifconfig wlan0 up 结束占用网络接口的进程 airmon-ng check kill 开启监听模式 airmon-ng start wlan0 查看网卡是否成功 ...

  10. Activity源码简要分析总结

    Activity源码简要分析总结 摘自参考书籍,只列一下结论: 1. Activity的顶层View是DecorView,而我们在onCreate()方法中通过setContentView()设置的V ...