import fileUtil = require("./tool/FileUtil"); import fs = require("fs"); import path = require("path"); class MainJSHX { private _jsUrl: string; private _toUrl: string; constructor(jsUrl: string,toUrl:string) { var self = this; if(!jsUrl) { console.log('没有填写mian.min.js的保存,请重试'); return; } self._jsUrl = jsUrl; self._toUrl = toUrl || jsUrl; self.trans(); } private trans():void { let self = this; fileUtil.FileUtil.walkDir(path.join(this._jsUrl),self.onFile,null,self); fs.writeFileSync(path.join(this._toUrl, 'o2nName.json'), JSON.stringify(self._o2nName)); //转义字符:'\n':换行符 '\t':制表符 '\r':回车 self._paramJson['byhescape'] = {linefeed:'\n',tab:'\t',enter:'\r'}; fs.writeFileSync(path.join(this._toUrl, 'jsparam.json'), JSON.stringify(self._paramJson)); } private onFile(url:string):void { let type = path.basename(url).split('.')[0]; var jsStr = fs.readFileSync(url, 'utf-8'); let paramVal = 'window.cqjsparammap.' + type; if (jsStr.indexOf(paramVal) >= 0) { console.log(paramVal + '已提取过!!!'); return; } var startStr = '(function(){var b='; var endStr = '"];function '; var startIdx = jsStr.indexOf(startStr); if (startIdx == -1) { startStr = '(function(){var g='; startIdx = jsStr.indexOf(startStr); } var headStr = jsStr.slice(0, startIdx - 1); jsStr = this.glcf(headStr) + ';' + jsStr.slice(startIdx); startIdx = jsStr.indexOf(startStr) + startStr.length; var endIdx = jsStr.indexOf(endStr) + 1; var paramStr = ''; var char = void 0; while (startIdx <= endIdx) { char = jsStr[startIdx]; paramStr += jsStr[startIdx]; startIdx++; } this.transJson(paramStr,type); jsStr = jsStr.replace(paramStr, paramVal); jsStr = this.thfz(jsStr,'particlesys'); jsStr = this.thfz(jsStr,'byh'); fs.writeFileSync(url.replace(this._jsUrl,this._toUrl), jsStr); } private thfz(mainjs:string,name:string):string { var namespace = name + '|| (' + name + '= {})'; var byhIdx = mainjs.indexOf(namespace); if(byhIdx >= 0) { while (byhIdx--) { if (mainjs[byhIdx] == ';') { byhIdx++; mainjs = mainjs.slice(0, byhIdx) + 'ssdgregdsrwetyetjh' + fileUtil.FileUtil.replace(mainjs.slice(byhIdx), namespace, name); mainjs = mainjs.replace('ssdgregdsrwetyetjh', namespace + ';'); break; } } } return mainjs; } private glcf(str:string):string { let strArr = str.split(','); let newStrArr = []; for(let i = 0, len = strArr.length; i < len; i++) { if(newStrArr.indexOf(strArr[i]) < 0) newStrArr.push(strArr[i]); } let newStr = ''; for(let j = 0, len = newStrArr.length; j < len; j++) { if(newStr) newStr += ','; newStr += newStrArr[j]; } return newStr; } private _paramJson = {}; private _o2nName = {}; private transJson(paramsStr:string, type:string): void { var paramArr = JSON.parse(paramsStr); let fiters = ['ChangeJobNewRder','BabelRoleRen','CrBossHead','CrBossRoleRen','CrBossRoleRightRen','CrossHSFamilyCar','CSPlaysetRender','CMovieClip','CrSandyEnemyView','MnRbEui','Dispatcher','GameEvent','SoulTaskRder','SXMagicItm']; var paramStr:string; var byhArr = []; for(let i = 0, len = paramArr.length; i < len; i++) { paramStr = paramArr[i]; if(paramStr.indexOf('byh.') == 0) { let subStrArr = paramStr.split('byh.'); let subStr = subStrArr[1]; if(fiters.indexOf(subStr) < 0) { byhArr.push(subStr); byhArr.push(paramStr); } } } let idx = 0; let newName:string; for(let i = 0, len = paramArr.length; i < len; i++) { paramStr = paramArr[i]; if(byhArr.indexOf(paramStr) >= 0) { newName = this._o2nName[paramStr]; if(!newName) { newName = this._o2nName[paramStr] = 'H_F_' + idx; idx++; } paramArr[i] = newName; } } this._paramJson[type] = paramArr; } } export function run(jsUrl: string,toUrl): void { new MainJSHX(jsUrl,toUrl); }