执行后效果:

前端使用:

后台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. Spring注解@Value的用法

    有时候我们在配置文件中使用配置的信息不仅需要在xml文件中使用,还可能在类中使用,这个时候,我们可使用@Value注解了: @Value("${rest.service.url}" ...

  2. 第 27 章 CSS 传统布局[上]

    学习要点: 1.布局模型 2.表格布局 3.浮动布局 主讲教师:李炎恢 本章主要探讨 HTML5 中 CSS 早期所使用的传统布局,很多情况下,这些布局方式还是非常有用的. 一.布局模型 在早期没有平 ...

  3. [moka同学笔记]Yii2 数据操作Query Builder

    Query Builder [php] view plain copy   $rows = (new \yii\db\Query()) ->select(['dyn_id', 'dyn_name ...

  4. Java清除:收尾和垃圾收集

    垃圾收收集器(GC)只知道释放由new关键字分配的内存,所以不知道如何释放对象的"特殊"内存.为了解决这个问题,Java提供了一个名为:finalize()的方法,可为我们的类定义 ...

  5. Several ports (8080, 8009) required by Tomcat v6.0 Server at localhost are already in use.

    遇到这个问题似然重启是个办法,但是真心好累.. 1.在dos下,输入  netstat   -ano|findstr  8080 //说明:查看占用8080端口的进程 显示占用端口的进程 2.在任务管 ...

  6. mvc和iis工作原理

    学习IIS & MVC的运行原理 我一直疑惑于以下问题,从客户端发出一个请求,请求到达服务器端是怎样跟iis衔接起来的,而iis又是怎样读取我发布的代码的,并返回服务器上的文件.这其中是怎样的 ...

  7. ProgressBar.js – 漂亮的响应式 SVG 进度条

    ProgressBar.js 是一个借助动态 SVG 路径的漂亮的,响应式的进度条效果.使用 ProgressBar.js 可以很容易地创建任意形状的进度条.这个 JavaScript 库提供线条,圆 ...

  8. 为什么URL中的中文需要Encode两次?

    在URL中传参的时候常常需要传入中文,这个时候就需要对中文参数进行编码,即URLEncode.但是,常常是Encode两次,而不是一次,为什么呢? 首先要知道,tomcat会自动解码一次: 这样的话, ...

  9. 什么是闭包(closure),为什么要用它?

    闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量,利用闭包可以突破作用链域,将函数内部的变量和方法传递到外部. ...

  10. mysql win源码比较大 不需要的文件删除 记录下来

    mysql-5.6.25-win32.zip 从官方下载下来的大小为 343MB,太大了可以删除掉的地方记录一下 docs :全部删除. sql-bench:全部删除. mysql-test :全部删 ...