Unity Yaml文本标量处理
在做脱离unity处理unity的yaml文档的工具(prefab、material等)
unity使用的yaml是YAML的语法子集,主要难点在处理文本标量上,如果用工具修改以后和unity生成的格式不一致,实际应用价值就打折扣了,每次使用工具都会变来变去。
字符串类型
首先把字符串分成4种类型:
- 0 可能是数字,或者是单行的列表、字典,没什么好说的,都在一行内
- 1 不带引号,在yaml文档中出现的
换行符\n+*n(缩进)需要转成实际的单个空格 - 2 带单引号,在yaml文档中出现的
''需要转义成', 空格同上,换行符\n换行符\n+*n(缩进)转成实际的单个换行符 - 3 带双引号,在yaml文档中出现的
\n\r\t\"\uXXXX对应转义,\n+*n(缩进)+\需要转成单个空格
判断字符串类型
一个字符串会自动生成什么类型,直接按照不会影响解析的原则来区分
0. 单行标量原封不动
- 存在非ascii字符或
\t,直接3类型 - 存在
\n,3类型 (单引号如果换行后带空格,缩进对不上了) - 存在
:,2类型 (避免解析成key) - 存在
\n,2类型 (无引号不能解析换行) - 以
:,[,{,,,',开头,2类型 (这些是yaml的结构元素) - 以
:,结尾,2类型 (这些事yaml的结构元素) - 简单判断下是不是数字,不是数字的1类型
字符串写YAML
设最大宽度_STRING_LINE_WIDTH为80,带key的行,计算key的宽度(不算key后面: 的两个字符)
- 单行标量直接写
- 0类型直接写
- 1类型,不是空格的字符直接写;是空格,判断当前行非空格宽度<=_STRING_LINE_WIDTH, 继续写;否则如果是单个空格,写一个换行符,再写换行缩进,在下一行重复;如果是多个空格,不换行继续往后写
- 2类型,
'转成'', 空格逻辑和1类型一致,如果有换行符(n个连续,n>=1),写n个换行符,再写一个换行符,写空格缩进 - 3类型,符号转义,unicode字符转成
\uXXXX。不是空格的字符直接写;是空格,判断当前行非空格宽度<=_STRING_LINE_WIDTH,继续写;否则如果是当个空格,写一个换行符,再写换行缩进;如果是多个空格,写一个换行符,写换行缩进,再写一个\,再写n-1个空格
遇到问题再修改。YAML优势在于数据量小,但解析是真的难搞,unity罪大恶极。
Unity Yaml文本标量处理的更多相关文章
- Unity中文本AssetBundle的解析
Unity在其安装目录下提供了许多实用的小工具,就存放在unity安装目录下的:Editor/Data/Tools, 其中该路径下的WebExtract.ext和binary2text.exe可以用 ...
- unity 读取文本与写入文本
void writeData(string str,string file) { string parth = Application.dataPath; Strea ...
- Unity 读写文本 文件
1. LitJson的使用 https://blog.csdn.net/qq_35669619/article/details/78928966 https://blog.csdn.net/qq_14 ...
- C语言文本处理
一.conf文本 http://blog.163.com/lixiangqiu_9202/blog/static/53575037201431743236762/ http://blog.csdn.n ...
- Y服务-你真的懂 Yaml 吗
目录 一.什么是 Yaml 二.Yaml 的语法 三.操作 Yaml A. 引入框架 B. 代码片段 C. 完整案例 参考文档 在Java 的世界里,配置的事情都交给了 Properties,要追溯起 ...
- #华为云·寻找黑马程序员#微服务-你真的懂 Yaml 吗?
在Java 的世界里,配置的事情都交给了 Properties,要追溯起来这个模块还是从古老的JDK1.0 就开始了的. "天哪,这可是20年前的东西了,我居然还在用 Properties. ...
- python语言使用yaml 管理selenium元素
1.所有元素都在PageElement下的.yaml,如图 login_page.yaml文件: username: dec: 登录页 type: xpath value: //input[@clas ...
- 使用Unity的50个建议
关于这些建议 这些建议并不适用于所有的项目 这些建议是基于我与3-20人的小团队项目经验总结出来的 结构.可重复使用性.明晰度都是有价的——团队规模和项目规模决定了是否值得付这个价. 一些建议也许公然 ...
- opencv3-core之基本操作
这一篇打算将core部分的例子说完,这都是基于<opencv2.4.9tutorial.pdf>中的core部分,其实这些例子后期都很稳定的,也就是说就算是2.3.1和2.4.10 ,这几 ...
- kubernetes之kube-ApiServer代码分析
一.概述: kube-ApiServer相当于是k8集群的一个入口,不论通过kubectl还是使用remote api 直接控制,都要经过apiserver.apiserver说白了就是一个serve ...
随机推荐
- 配置k8s拉取Harbor镜像
创建Secret # 认证名称为:docker-harbor-registry kubectl create secret docker-registry docker-harbor-registry ...
- Button按钮:得到鼠标焦点后自动放大,失去鼠标焦点后自动缩小_
作用 程序设计过程中,我们经常需要增加一些动态效果,以此改善用户的使用体验.本文将介绍一种方法,动态显示按钮状态,使其得到鼠标焦点后自动放大,失去鼠标焦点后自动缩小. 效果图 先放一张原图(鼠标还未移 ...
- linux 软件包:UnixBench 性能测试工具、跑分神器
目录 安装 使用 结果示例 测试项说明 UnixBench是一个类unix系(Unix,BSD,Linux)统下的性能测试工具,一个开源工具,被广泛用与测试linux系统主机的性能.Unixbench ...
- ValueError: Max value is 14 解决方案
方案一(有时会失效): 将EXCEL文件中的格式全部清除即可.最好是复制,然后只粘贴值. 方案二(指定引擎): data = pd.read_excel(path, engine="open ...
- Go 语言入门指南: 环境搭建、基础语法和常用特性解析 | 青训营
Go 语言入门指南: 环境搭建.基础语法和常用特性解析 | 青训营 从零开始 Go 语言简介 Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易. Go是从2007年末由Robert ...
- Linux文件管理知识查找文件
Linux文件管理知识:查找文件 前几篇文章一一介绍了LINUX进程管理控制命令及网络层面的知识体系,综所周知,一个linux系统是由很多文件组成的,那么既然有那么多文件,那我们该如何管理这些文件呢? ...
- Redis从入门到放弃(8):哨兵模式
在前面的文章中介绍了Redis的主从复制,但主从复制存在一定的缺陷.如果Master节点宕机,因为不具备自动恢复功能,需要人工干预,那么在这个干预过程中Redis将不可用. 为了解决这一问题,Redi ...
- asp.net core之EfCore
EF Core(Entity Framework Core)是一个轻量级.跨平台的对象关系映射(ORM)框架,用于在.NET应用程序中访问和操作数据库.它是Entity Framework的下一代版本 ...
- Zimbra禁止接收带有加密的文件邮件 提醒病毒(Heuristics.Encrypted.PDF)
最近碰到一个国际性大客户,一定要发送经过加密的文件,因为是合约相关的文件,对方公司有这方面要求.但是Zimbra默认是禁止接收加密的文件 - 'Block encrypted archives',这样 ...
- MySQL高级9-锁
一.简介 锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除了传统的计算资源(CPU.RAM.i/O)的挣用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性,有效性 ...