import fileUtil = require("./tool/FileUtil"); import fs = require("fs"); import path = require("path"); class LanExtract { 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('lanTxt.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('lanTxt.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('lanTxt.k_' + txtAtt[i], "gi"),'lanTxt.k__' + i); } self._allTsStr = self._allTsStr.replace(new RegExp('lanTxt.k__', "gi"),'lanTxt.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*\(.*?\)/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 = 'lanTxt.' + key; str = str.replace(oldStr,newStr); reg.lastIndex -= oldStr.length - newStr.length; } } return str; } // private replaceLan(source) // { // let self = this; // let reg = /".*?"|'.*?'/gi;//.*?[\u4e00-\u9fa5].*? // let strReg2 = /"(.*?)"|'(.*?)'/gi; // let replacePosReg = /\{\s*(\d+)\s*\}/gi;//匹配 {0} 这样的替换符 // let chinaReg = /[\u4e00-\u9fa5]/gi // let startAddStr = /^\s*\+\s*(".*?"|'.*?'|[\w\(\)\?\:\.]+)/g;// 开头 + 字符表达式 的 // let endAddStr = /(".*?"|'.*?'|[\w\(\)\?\:\.]+)\s*\+\s*$/gi;// 字符表达式 + 结束 // let arr; // // let langDic = this.lanStr2Key; // // let langIndex = this.lanTxtId; // while(arr = reg.exec(source)) // { // chinaReg.lastIndex = 0; // startAddStr.lastIndex = 0; // endAddStr.lastIndex = 0; // if(chinaReg.exec(arr[0]))//字符串中有中文 需要特殊处理 // { // let startIndex = reg.lastIndex - arr[0].length; // let endIndex = reg.lastIndex; // let preStr = source.substring(0, startIndex); // let endStr = source.substr(endIndex); // let lineArr; // let strArr = [arr[0]]; // while(lineArr = endAddStr.exec(preStr))//前面有字符串或者值 // { // // console.log(lineArr[1]); // startIndex -= lineArr[0].length; // preStr = preStr.substring(0, startIndex); // endAddStr.lastIndex = 0; // strArr.unshift(lineArr[1]) // } // while(lineArr = startAddStr.exec(endStr)) // { // // console.log(lineArr[1]); // endIndex += lineArr[0].length; // endStr = source.substr(endIndex); // startAddStr.lastIndex = 0; // strArr.push(lineArr[1]); // } // // console.log("查找到表达式:"+source.substring(startIndex, endIndex) + " 字符数组["+strArr.join(", ")+"]") // let replacePos = 0; // for(let i=0; i=replacePos) // { // replacePos = (+replacePosArr[1])+1; // } // } // } // } // let newStr = ''; // let params = []; // for(let i=0; i0)//有参数的字符, 加上替换 // { // toReplaceStr = "StringUtil.substitute("+toReplaceStr+", "+params.join(",")+")"; // } // source = preStr + toReplaceStr +endStr; // reg.lastIndex = reg.lastIndex - ((endIndex - startIndex) - toReplaceStr.length) // // console.log(toReplaceStr +" "+newStr); // } // } // return source; // } } // export function run(projectUrl: string): void { new LanExtract("D:\\work\\trunk\\nslm"); // }