读取配置表生成TypeScript描述类

前言

接上篇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里面查找会比较方便。

参考

发布了41 篇原创文章 · 获赞 27 · 访问量 5万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览