## genQtSetting.py
import os,sys,re
import shutil,string
from string import Template
gHearFile = "hcs_setting"
gSrcFile = "hcs_setting"
gClassName = "HCS_Setting"
#[OK]
class CObject(object):
def __init__(self):
self._group = ""
self._gList = []
self._gMap = {}
self._gSaveList = ""
def setGroup(self,group):
self._group = group
def addMember(self,key,value):
self._gList.append(key)
self._gMap[key] = value
###########################################################################
# Header File.
# QString getGroupFiled();
###########################################################################
def toFunc_Def_List(self):
res = ""
for item in self._gList:
tmp = "\t%s get%s%s();\n" % ("QString",self._group.capitalize() ,item.capitalize())
res = res + tmp
return res
###########################################################################
# Header File.
###########################################################################
def toFunc_Imp_List(self):
return ""
###########################################################################
# Header File.
# QString m_a;
# QString m_b;
###########################################################################
def toVal_Def_List(self):
res = ""
for item in self._gList:
tmp = "%s m_%s%s;\n\t" % ("QString",self._group[0].lower() + self._group[1:] ,item.capitalize())
res = res + tmp
return res
###########################################################################
# void loadSetting(const QString & fname){
# m_a = "";
# }
###########################################################################
def toFunc_Init_List(self):
res = ""
for item in self._gList:
tmp = "\tm_%s%s = \"\";\n" % (self._group[0].lower() + self._group[1:] ,item.capitalize())
res = res + tmp
res = res + "\n";
return res
###########################################################################
# void loadSetting(const QString & fname){
# m_a = "";
# m_a = _data.value("a/b").value;
# }
###########################################################################
def toFunc_Set_List(self):
res = ""
for item in self._gList:
tmp = "\tm_%s%s = _data.value(\"%s/%s\").toString();\n" % (self._group[0].lower() + self._group[1:] ,item.capitalize(),self._group,item)
res = res + tmp
return res
###########################################################################
# void setGrouoOption(const QString & fname){
# m_a = fname;
# }
###########################################################################
def toFunc_OutSet_List(self):
res = ""
for item in self._gList:
s1 = "void %s::set%s%s(const QString & _value){\n" % (gClassName ,self._group.capitalize(),item.capitalize())
s2 = "\tm_%s%s = %s;\n" % (self._group[0].lower() + self._group[1:] ,item.capitalize(),"_value");
s3 = "}\n\n";
s = s1 + s2 + s3
res = res + s
return res
###########################################################################
# void setGrouoOption(const QString & fname){
# m_a = fname;
# }
###########################################################################
def toFunc_DefSet_List(self):
res = ""
for item in self._gList:
s = "\tvoid set%s%s(const QString & _value);\n" % (self._group.capitalize(),item.capitalize())
res = res + s
return res
###########################################################################
# QString getGroupField(){
# return m_member;
# }
###########################################################################
def toFunc_Get_List(self):
res = ""
for item in self._gList:
s1 = "%s %s::get%s%s(){\n" % ("QString",gClassName,self._group.capitalize(),item.capitalize())
s2 = "\treturn m_%s%s;\n" % (self._group[0].lower() + self._group[1:] ,item.capitalize())
s3 = "}\n\n"
s = s1 + s2 + s3
res = res + s
return res
###########################################################################
# QString getGroupField(){
# return m_member;
# }
###########################################################################
def toFunc_Save_List(self):
list = ""
for item in self._gList:
s1 = "\t_data.setValue(\"%s/%s\" ,m_%s%s);\n" % (self._group ,item , self._group[0].lower() + self._group[1:] ,item.capitalize())
list = list + s1
return list
###########################################################################
# write string to file.
###########################################################################
def writeToFile(str,fname):
fp = open(fname,"w+")
fp.write(str)
fp.close()
###########################################################################
# write the result to test.h | test.cpp file.
###########################################################################
def saveHeadFile(defList,varList ,defSetList):
m_hContent = Template("""
/******************************************************************************
File name : ${FILE_NAME}.h
Tile : Header of the ${CLASS_NAME} class
******************************************************************************/
#ifndef ${FILE_NAME}_H
#define ${FILE_NAME}_H
#include <QString>
#include <QSettings>
#include <QColor>
class ${CLASS_NAME}
{
public:
${CLASS_NAME}(){}
static ${CLASS_NAME} * getInstance();
void loadFile(const QString & fname);
void saveFile();
/*
Getter/Setter
*/
${FUNCTION_DEF_LIST}
${FUNCTION_DEFSET_LIST}
private:
${VAR_LIST}
QSettings _data;
QString m_iniFileName;
};
#endif""")
h_str = m_hContent.substitute(FILE_NAME=gHearFile,
CLASS_NAME=gClassName,
FUNCTION_DEF_LIST=defList,
FUNCTION_DEFSET_LIST=defSetList,
VAR_LIST=varList)
writeToFile(h_str,gHearFile + ".h")
def saveBodyFile(impList,getList,setList,instance,saveList):
m_bContent = Template("""
/******************************************************************************
*
* File name : ${FILE_NAME}.cpp
* Title : Implementation of the ${CLASS_NAME} class
*
******************************************************************************/
#include "${FILE_NAME}.h"
static ${CLASS_NAME} * gSetting = NULL;
${FUNCTION_INSTANCE}
${FUNCTION_IMPL_LIST}
${FUNCTION_GET_LIST}
${FUNCTION_SET_LIST}
${FUNCTION_SAVE_LIST}
""")
b_str = m_bContent.substitute(FILE_NAME=gSrcFile,
CLASS_NAME=gClassName,
FUNCTION_INSTANCE=instance,
FUNCTION_IMPL_LIST=impList,
FUNCTION_GET_LIST=getList,
FUNCTION_SET_LIST=setList,
FUNCTION_SAVE_LIST=saveList)
writeToFile(b_str,gSrcFile + ".cpp")
gObjList = []
gObj = CObject()
###################################################################################################
#[OK] key=value
###################################################################################################
def processWord(s):
global gObj
s = s.strip()
key,value = s.split("=",1)
key = key.strip(" \r\n")
value = value.strip(" \r\n")
gObj.addMember(key,value)
###################################################################################################
#[OK] getGroup("[Cache]") => "Cache"
###################################################################################################
def getGroup(str):
str = str.strip()
ret = re.match(r"\[(.+)\]$",str)
if ret != None:
return ret.group(1)
return None
###################################################################################################
#[OK] isGroup("[Cache]") => true
###################################################################################################
def isGroup(str):
str = str.strip()
ret = re.match(r"\[\w|\d]+\]$",str)
if ret != None:
return True
return False
###################################################################################################
#[OK] whether string is empty.
###################################################################################################
def isEmpty(str):
if len(str) <= 1:
return True
else:
return False
###################################################################################################
#[OK] parse the content of ini file,
# and generate the Node to gObjList.
###################################################################################################
def doParse(iniContent):
global gObj,gObjList
#getCin(hd)
varList = ""
fun_def_list = ""
lineList = []
m_group = ""
lineList = iniContent.split("\n")
isStart = True
for s in lineList:
s = s.strip() # standared the string.
if isEmpty(s): # ignore the space line.
continue
if re.match("#",s) != None: # ignore the conment line.
continue
if isGroup(s): # is [Cache] field.
m_group = getGroup(s)
if isStart == True:
gObj.setGroup(m_group)
isStart = False
else:
gObjList.append(gObj)
gObj = CObject()
gObj.setGroup(m_group)
else:
processWord(s)
gObjList.append(gObj)
###################################################################################################
#[OK] read content from fname.
###################################################################################################
def readFile(fname):
with open(fname, 'r') as f:
return f.read()
###################################################################################################
#[OK] baseFilename("test.ini") => test
###################################################################################################
def baseFilename(fname):
name,ext = fname.rsplit(".")
return name
###################################################################################################
#[OK] genSetting.py test.ini , True
# check the user`s input args.
###################################################################################################
def checkArgs():
arg_len = len(sys.argv)
if arg_len != 2:
print "[Usage: genSetting.py test.ini]"
return False
return True
###################################################################################################
#[OK] checkFileFormat("test.ini") True
###################################################################################################
def checkFileFormat(fname):
ret = re.search(r'\w+\.ini$',fname)
if ret != None:
return True
return False
###################################################################################################
#[OK] Main Function.
###################################################################################################
def main():
global gObjList
if checkArgs() == False:
return
if checkFileFormat(sys.argv[1]) == False:
return
base_name = baseFilename(sys.argv[1])
iniContent = readFile(sys.argv[1])
doParse(iniContent)
m_varList = ""
m_defList = ""
m_impFunc = ""
m_getList = ""
m_initList = ""
m_instance = ""
m_setList = ""
m_saveList = ""
m_defSetList = ""
for obj in gObjList:
m_varList = m_varList + obj.toVal_Def_List()
m_defList = m_defList + obj.toFunc_Def_List()
m_getList = m_getList + obj.toFunc_Get_List()
m_setList = m_setList + obj.toFunc_OutSet_List()
m_impFunc = m_impFunc + obj.toFunc_Set_List()
m_initList = m_initList + obj.toFunc_Init_List()
m_saveList = m_saveList + obj.toFunc_Save_List()
m_defSetList = m_defSetList + obj.toFunc_DefSet_List()
m_instanceContent = Template("""
${CLASS_NAME} * ${CLASS_NAME}::getInstance(){
if ( NULL == gSetting )
gSetting = new ${CLASS_NAME}();
return gSetting;
}
""")
sv1 = "void %s::saveFile(){\n" % (gClassName)
sv2 = "\tQSettings _data(m_iniFileName, QSettings::IniFormat);\n\t_data.setIniCodec(\"UTF-8\");\n";
sv3 = m_saveList;
m_saveList = sv1 + sv2 + sv3 + "}\n\n"
m_instance = m_instanceContent.substitute(CLASS_NAME=gClassName)
s1 = "void %s::loadFile(const QString & fname){\n" % (gClassName)
s2 = "\tQSettings _data(fname, QSettings::IniFormat);\n\t_data.setIniCodec(\"UTF-8\");\n";
s3 = "\t%s = %s;\n" % ("m_iniFileName" , "fname")
s4 = "}\n"
loadFunc = s1 + s2 + s3 + m_initList + m_impFunc + s4
saveHeadFile(m_defList,m_varList ,m_defSetList)
saveBodyFile(loadFunc,m_getList,m_setList,m_instance,m_saveList)
main()
@@用法说明
genQtSetting.py config.ini
生成解析config.ini文件的类