import fileUtil = require("./tool/FileUtil"); import fs = require("fs"); import path = require("path"); class LanTxtTurn { private lanTxtId = 0; private lanObj:any; private lanStr2Key:any = {}; constructor(url: string) { let self = this; self.lanObj = JSON.parse(fs.readFileSync(path.join(url,'lanObj.json'), 'utf-8')); let curId = 0; for(let key in self.lanObj) { curId = Number(key.split('_').pop()); self.lanStr2Key[self.lanObj[key]] = key; if(curId > self.lanTxtId) self.lanTxtId = curId; } self.lanTxtId += 1; fileUtil.FileUtil.walkDir(path.join(url,'src'),self.onFile,null,self); self.txtAtt = [0]; for(let i = 1; i < self.lanTxtId; i++) { if(self._allTsStr.indexOf('qufuLanTxt.k_' + i) < 0) { delete self.lanObj['k_' + i]; } else { self.txtAtt.push(i); } } self.onFileAll(); fs.writeFileSync(path.join(url,'lanObj.json'), JSON.stringify(self.newObj, null, " ")); } private newObj = {}; private txtAtt:number[] = []; private onFileAll():void { let self = this; let txtAtt = this.txtAtt = [0]; let i:number; let len:number; let idx = 1; self.newObj['k_0'] = self.lanObj['k_0']; for(i = 1; i < self.lanTxtId; i++) { if(self._allTsStr.indexOf('qufuLanTxt.k_' + i) >= 0){ txtAtt.push(i); self.newObj['k_' + idx] = self.lanObj['k_' + i]; idx++; } } let oldStr = self._allTsStr; for(i = txtAtt.length - 1; i >= 0; i--) { self._allTsStr = self._allTsStr.replace(new RegExp('qufuLanTxt.k_' + txtAtt[i], "gi"),'qufuLanTxt.k__' + i); } self._allTsStr = self._allTsStr.replace(new RegExp('qufuLanTxt.k__', "gi"),'qufuLanTxt.k_'); let tsArrStr = self._allTsStr.split('kohfwjhgfs'); idx = 0; while(idx < tsArrStr.length) { if(tsArrStr[idx] && tsArrStr[idx + 1]) { fs.writeFileSync(tsArrStr[idx], tsArrStr[idx + 1]); } else { console.log('what?') } idx += 2; } } private _allTsStr = ''; private onFile(url:string):void { if(path.extname(url) != '.ts') return; var tsStr = fs.readFileSync(url, 'utf-8'); var oldStr = tsStr; var reg = new RegExp("[\\u4E00-\\u9FFF]+","g"); let zsData = this.replaceZS(tsStr);//去掉注释 let reArr = zsData.reArr; tsStr = this.replaceLan(zsData.str);//提取汉字 for(let i = 0,len = reArr.length; i < len; i++) { tsStr = tsStr.replace('kohfwjh' + i + 'kohfwjh',reArr[i]); } if(oldStr != tsStr) { fs.writeFileSync(url, tsStr); } this._allTsStr += url + 'kohfwjhgfs' + tsStr + 'kohfwjhgfs'; } private replaceZS(str:string):{str:string,reArr:string[]} { let arr; let idx = 0; let zsArr = []; let reg = /\/\*(\s|.)*?\*\/|\/\/.*?[\r\n]|\/\/.*?$|console\.log\s*\(.*?\)|console\.warn\s*\(.*?\)|GameLog\.log\s*\(.*?\)|GameLog\.error\s*\(.*?\)|egret\.error\s*\(.*?\)|Error\s*\(.*?\)/gi; while(arr = reg.exec(str)) { let oldStr = arr[0]; let newStr:string; newStr = "kohfwjh" + idx + "kohfwjh"; zsArr.push(oldStr); str = str.replace(oldStr,newStr); reg.lastIndex -= oldStr.length - newStr.length; idx++; } return {str:str,reArr:zsArr} } private _keyObj = {}; private replaceLan(str:string):string { let self = this; let arr; let zsArr = []; let reg = /'.*?'|".*?"/g; var regHZ = new RegExp("[\\u4E00-\\u9FFF]+","g"); let replace = false; while(arr = reg.exec(str)) { let oldStr:string = arr[0]; regHZ.lastIndex = 0; replace = regHZ.test(oldStr); if(replace) { let ols = oldStr.substring(1,oldStr.length - 1); let key = self.lanStr2Key[ols]; if(!key) { key = self.lanStr2Key[ols] = 'k_' + self.lanTxtId; self.lanObj[key] = ols; self.lanTxtId++; } let newStr = 'qufuLanTxt.' + key; str = str.replace(oldStr,newStr); reg.lastIndex -= oldStr.length - newStr.length; } } return str; } } // export function run(projectUrl: string): void { new LanTxtTurn("D:\\work\\trunkHW\\qufu"); // }