#!/usr/bin/python #-*- coding:utf-8 –*- import os import sys import re import shutil import xlrd import xlwt import getopt import math from xlutils.copy import copy ''' 脚本使用: 设置strUiPorject ui项目名称,取值如下 "mstar"/"formal"/"haier"/"videocon"/"bbk"/"atv_project" 删除无用字串: ./genstr -d 特殊标记的字串优先排序: ./genstr -p 给已整理好优先级高的字串添加strMark..../genstr -a 读取 优先级字串整理.h 中的字串进行比对添加标记(未整理)./genstr -c 脚本功能: 1、根据strUiPorject设置的UI名称,迭代过滤UI目录的所有源文件和头文件,获取项目使用字串总数,并删除UIL多余字串 2、对某一种语言做特殊标记strMark,标记的字串会放在翻译的最前面 3、mstar优先级字串整理在mstarPrimaryString.h,已使用字串整理在UsedString.h中, formal优先级字串整理在PrimaryString.h 执行过程: 1、设置UI项目名称 2、根据UI名称,配置过滤路径和UIL删除路径(filterPath/strUilPath) 3、再根据配置的路径执行过滤和删除动作 注意: SourceCode中,有一些是 TV_IDS_String_ID+Offset方式获取新字串的,这些字串要手动加到脚本,以防误删 如:TV_IDS_String_GMT_0 字串 ''' #=======注意此处设置UI项目================================# #=="mstar"/"formal"/"haier"/"videocon"/"bbk"/"atv_project"=# strUiPorject = "mstar" #========================================================# g_deleteMode = 0 g_priorityMode = 0 g_AddmarkMode = 0 g_CompareMode = 0 setStr = set() tupleStr = () strMark = "aaaa" #=======================以下不需要设置=======================# if "bbk" in strUiPorject: filterPath = "aps/application/radisson/formal" strUilPath = "aps/application/radisson/formal/UI_Project/TV_UIProject/Languages" elif "formal" in strUiPorject: filterPath = "aps/application/radisson/formal" strUilPath = "aps/application/radisson/formal/UI_Project/TV_UIProject_new/Languages" else: filterPath = "aps/application/radisson/%s" % strUiPorject strUilPath = "aps/application/radisson/%s/UI_Project/TV_UIProject/Languages" % strUiPorject gamePath = "aps/game" listPath = [filterPath,gamePath] def filterUsefulString(): listStrId = [] for path in listPath: for dirPath, dirNames, fileNames in os.walk(path): for sourceFile in fileNames: filePath = dirPath+"/"+sourceFile if (re.search(".*.c.*",sourceFile) or re.search(".*.h.*",sourceFile)) and sourceFile != "TV_strid.h": for line in open(filePath,"r"): if "TV_IDS_String" in line: if line.count("TV_IDS_String") > 2: print " the number of string are more than 2 in a row " print sourceFile print " " continue if re.search(".*TV_(IDS_Stringw*).*TV_(IDS_Stringw*).*",line): tupleStr=re.search(".*TV_(IDS_Stringw*).*TV_(IDS_Stringw*).*",line).groups() for i in range(len(tupleStr)): setStr.add(tupleStr[i]) else: setStr.add(re.search(".*TV_(IDS_Stringw*).*",line).group(1)) elif "TV_IDS_Game_Menu_OSD_String" in line: setStr.add("IDS_Game_Menu_OSD_String") print " 程序中共使用 %d 个字串。 保存在当前目录 UsedString.h-文件中 " % len(setStr) for line in setStr: listStrId.append(line) listStrId.append(" ") open("UsedString.h","w").writelines(listStrId) ''' #读EXCEL到映射表 def excelSetting() setElStr = set() mapStr = {} listFirst = [] setDiff = set() book = xlrd.open_workbook(r'Languages.xls') sheet = book.sheet_by_index(0) listFirst = sheet.row_values(0) for row in range(sheet.nrows): cellStr = str(sheet.cell(row,0).value) cellStr.rstrip() if cellStr in setStr: mapStr[cellStr] = sheet.row_values(row) #setElStr = set(mapStr.keys()) #setDiff = setElStr - setStr #写EXCEL wboot = xlwt.Workbook() sheet = wboot.add_sheet("Language") #操作第一行,抬头 for col in range(len(listFirst)): sheet.write(0,col,listFirst[col]) #其它行 row = 1 for (k,v) in mapStr.items(): for col in range(len(v)): sheet.write(row,col,v[col]) row = row + 1 wboot.save(r'Language_.xls') ''' #处理UIL文件,对比setStr集合,删除无用字串 def deleteString(): delCount = 0 lanList = [] for dirPath,dirNames,fileNames in os.walk(strUilPath): for sourceFile in fileNames: filePath = dirPath + "/" + sourceFile for line in open(filePath,"r"): #==============================================# #有些字串在code中是以偏移量的方式使用,不能删除 if "IDS_String_GMT_" in line: lanList.append(line) continue elif re.search(".*IDS_String_d{1,2}".*",line) or ("IDS_String_LNB" in line): lanList.append(line) continue # ==============================================# if "<String ID=" in line: if re.search("s*<String ID="(w*)".*",line).group(1) in setStr: lanList.append(line) else: delCount = delCount+1 else: lanList.append(line) open(filePath,"w").writelines(lanList) print(sourceFile + "删除 %s" %delCount) lanList = [] delCount = 0 #处理UIL文件,迭代lanFist集合,标记字串放在UIL文件前面 def priorityString(): lanFist = [] lanList1 = [] lanList2 = [] lanList3 = [] pat = re.compile(".*"(IDS_Stringw*)".*") for line in open(strUilPath+"/English.uil","r").readlines(): if strMark in line and pat.search(line): lanFist.append(pat.search(line).group(1)) open("PrimaryString.h", "a").writelines([x + " " for x in lanFist]) print "优先级字串共%d,如下:" %len(lanFist) print lanFist for dirPath, dirNames, fileNames in os.walk(strUilPath): for sourceFile in fileNames: filePath = dirPath + "/" + sourceFile for line in open(filePath, "r"): if pat.search(line) and pat.search(line).group(1) in lanFist: line = line.replace(strMark,"") lanList1.append(line) elif "IDS_String_spliteLine" in line: lanList3.append(line) else: lanList2.append(line) if(len(lanList1) and len(lanList2)>=3): lanList2 = lanList2[0:2] +lanList1 + lanList3+lanList2[2:] open(filePath, "w").writelines(lanList2) lanList1 = [] lanList2 = [] #给已整理好优先级高的字串添加strMark def AddMark(): StringList = [] a = 0 for line in open(strUilPath+"/English.uil","r") : if ("<String ID=" in line): if re.search("IDS_String_spliteLine",line): a = 1 elif(a == 0): line = line.replace('Value="','Value="'+strMark) StringList.append(line) open(strUilPath+"/English.uil","w").writelines(StringList) print " 添加StrMark完成 " #读取 优先级字串整理.h 中的字串进行比对添加标记(未整理) def CompareAddMark(): strSet = set() strList = [] for line in open("PrimaryString.h", "r"): strSet.add(re.search(".*(IDS_String_.*).*",line).group(1)) print strSet for line in open(strUilPath+"/English.uil","r") : if "<String ID=" in line: if re.search("s*<String ID="(w*)".*", line).group(1) in strSet: print "a " line = line.replace('Value="','Value="'+strMark) strList.append(line) open(strUilPath+"/English.uil","w").writelines(strList) def fun_parse_InputParam(): global g_deleteMode global g_priorityMode global g_AddmarkMode global g_CompareMode try: opts, args = getopt.getopt(sys.argv[1:], 'dpac') except getopt.GetoptError, err: #print str(err) sys.exit() for op, value in opts: if op == "-d": g_deleteMode = 1 elif op == "-p": g_priorityMode = 1 elif op == "-a": g_AddmarkMode = 1 elif op == "-c": g_CompareMode = 1 else: print("unhandled option") sys.exit() if __name__ == "__main__": fun_parse_InputParam() if g_deleteMode: filterUsefulString() deleteString() if g_priorityMode: priorityString() if g_AddmarkMode: AddMark() if g_CompareMode: CompareAddMark()