版权声明:转载请联系 https://blog.csdn.net/liyaxin2010/article/details/83716556
前言
接上篇TypeScript加载Json配置表ConfigManager(泛型实现)
,生成json表对应的描述文件
目标
传入配置表格式生成这样的ts class
interface IConfig{
createByTuple(table:any);
}
/**
* 测试配置表
*/
class TestCfg implements IConfig {
/**这是id */
public id: number;
/**这是名字 */
public name: string;
createByTuple(jsonTable:any){
this.id = jsonTable.id;
this.name = jsonTable.name;
}
}
实现
不多说,直接上代码:
单个配置表字段结构描述
# 单个配置表生成类文件所需数据格式
class CfgItemData:
def __init__(self, cfgName, cfgDesc, mapFieldName, mapFieldType):
# 配置表className
self.m_cfgName = eval(cfgName)
# 该配置表说明
self.m_cfgDesc = eval(cfgDesc)
# 记录某个字段的代码命名 {'名字':'name'}
self.m_mapFieldName = eval(mapFieldName)
# 记录某个字段的类型 {'名字':'string'}
self.m_mapFieldType = eval(mapFieldType)
生成代码字符串辅助TypeScriptHelper
#!/usr/bin/python
# -*- coding: utf-8 -*-
from CfgItemData import CfgItemData
# 生成typescript类辅助
# @author l2xin
class TypeScriptHelper:
def __init__(self):
self.m_exportType = 'typescript'
STR_LEFT_SIGN = '{'
STR_RIGHT_SIGN = '}'
# class begin {0}:测试配置表
STR_BEGIN = '\
/**\n\
* {0}\n\
*/\n\
class {1} implements IConfig {2}\n\
'
# field item eg: {0}:name {1}:string {2}名字
STR_ONE_FIELD = '\
/**{2} */ \n\
public {0}: {1}; \n\
'
# interface begin
STR_INTERFACE_1 = '\n\
createByTuple(jsonTable:any){0}\n\
'
# interface item
STR_INTERFACE_2 = '\
this.{0} = jsonTable.{1};\n\
'
# interface end
STR_INTERFACE_3 = '\
{0}\n\
'
# class end
STR_END = '\
{0}\n\n\
'
STR_ALL_CLASS_RESULT = '{0}{1}{2}{3}{4}{5}'
STR_INTERFACE_ICONFIG = '\n\
/**\n\
* 所有配置表的类定义\n\
* @warning 自动生成 请勿手动修改\n\
* @author l2xin\n\
*/\n\
interface IConfig{0}\n\
createByTuple(table:any);\n\
{1}\n\n\
'
STR_INIT_ALL_CONFIG = '\
/**\n\
* 如果希望一次把表全部加载\n\
*/\n\
function InitAllConfig(){0}\n\
\n\
{1}\n\n\
'
# 返回单个类的描述
# @param cfgName 配置表类名:TestCfg
# @param cfgDesc 配置表描述:测试配置表
# @param mapFieldName {'名字':name, '下标':id}
# @param mapFieldType {'名字':string, '下标':number, '其他':any}
# return string
def getOneClassStr(self, cfgName, cfgDesc, mapFieldName, mapFieldType):
strBegin = TypeScriptHelper.STR_BEGIN.format(cfgDesc, cfgName, TypeScriptHelper.STR_LEFT_SIGN)
strInterface1 = TypeScriptHelper.STR_INTERFACE_1.format(TypeScriptHelper.STR_LEFT_SIGN)
strInterface3 = TypeScriptHelper.STR_INTERFACE_3.format(TypeScriptHelper.STR_RIGHT_SIGN)
strEnd = TypeScriptHelper.STR_END.format(TypeScriptHelper.STR_RIGHT_SIGN)
strFieldItems = ''
strInterfaceItems = ''
for (key,value) in mapFieldName.items():
strFieldDesc = key
strFieldName = (value + "").lstrip('"').rstrip('"')
if key in mapFieldType:
strFieldType = mapFieldType[key]
else:
strFieldType = 'any'
strFieldItems = strFieldItems + TypeScriptHelper.STR_ONE_FIELD.format(strFieldName, strFieldType, strFieldDesc)
strInterfaceItems = strInterfaceItems + TypeScriptHelper.STR_INTERFACE_2.format(strFieldName, strFieldName)
strResult = TypeScriptHelper.STR_ALL_CLASS_RESULT.format(strBegin, strFieldItems, strInterface1, strInterfaceItems, strInterface3, strEnd)
return strResult
# 返回接口描述
def getInterfaceStr(self):
str = TypeScriptHelper.STR_INTERFACE_ICONFIG.format(TypeScriptHelper.STR_LEFT_SIGN, TypeScriptHelper.STR_RIGHT_SIGN)
return str
# 返回加载所有配置表的接口
def getInitAllConfigStr(self):
str = TypeScriptHelper.STR_INIT_ALL_CONFIG.format(TypeScriptHelper.STR_LEFT_SIGN, TypeScriptHelper.STR_RIGHT_SIGN)
return str
# 返回单个类的描述
def getOneClassStrByItemData(self, cfgItemData):
return self.getOneClassStr(cfgItemData.m_cfgName, cfgItemData.m_cfgDesc, cfgItemData.m_mapFieldName, cfgItemData.m_mapFieldType)
# 一键得结果
# param CfgItemData[]
def oneKeyGetAll(self, cfgItemDataArr):
strResult = self.getInterfaceStr()
strResult += self.getInitAllConfigStr()
for cfgItemData in cfgItemDataArr:
strResult += self.getOneClassStrByItemData(cfgItemData)
return strResult
文件操作封装
# 文件操作封装
# @author l2xin
class FileHelper:
@staticmethod
def writeFile(fileFullPath, strContent):
dir = os.path.dirname(fileFullPath)
if dir and not os.path.exists(dir):
os.makedirs(dir)
f = codecs.open(fileFullPath, "w", "utf-8")
f.write(strContent)
f.close()
TypeScriptHelper接口测试
class TypeScriptHelper:
# 测试接口 返回单个类的描述
def test_getOneClassStr(self):
cfgItemData = CfgItemData('TestCfg', '测试', {'名字':'name', '下标':'id'}, {'名字':'string', '下标':'number'})
result = self.getOneClass(cfgItemData)
print(result)
# 测试 一键得结果
def test_oneKeyGetAll(self):
cfgItemDataArr = []
cfgItemData1 = CfgItemData('TestCfg', '测试', {'名字':'name', '下标':'id'}, {'名字':'string', '下标':'number'})
cfgItemData2 = CfgItemData('SkillCfg', '技能表', {'技能名字':'skillName', '下标':'id', '其他{"1":2, "x":100}':'attributeArr'}, {'名字':'string', '下标':'number'})
cfgItemDataArr.append(cfgItemData1)
cfgItemDataArr.append(cfgItemData2)
result = self.oneKeyGetAll(cfgItemDataArr)
print(result)
其他
-
这里预防
{'名字':'"name"', '下标':'id'}
,去掉name前后的引号strFieldName = (value + "").lstrip('"').rstrip('"')
-
strFieldType 这里需要手动写描述 目前可以number string,不填认为any,以后可以扩展,或者自动识别
if key in mapFieldType: strFieldType = mapFieldType[key] else: strFieldType = 'any'
-
命名空间看情况而定,也比较好加
-
类定义文件支持分文件也支持合在一起,看需求定,个人认为分开较好,在EgretWing里面查找会比较方便。