UNPKG

baidu2wxapp

Version:

百度小程序转微信小程序工具

477 lines (452 loc) 16.3 kB
#!/usr/bin/env node let fs = require("fs"); let path = require("path"); let readline = require('linebyline'); let arg = process.argv; let configpath = path.resolve(__dirname, "baidu2wxapp.txt"); let dirPath=""; if(arg[2]){ if(arg[2]==="--start"){ }else if(arg[2]==="--getConfig"){ console.log("配置路径:"+configpath); console.log("记得修改工作目录后保存配置 并且备份需要进行的转换工程"); return; }else if(arg[2]==="--path"){ if(arg[3]){ try { fs.accessSync(arg[3]); dirPath=arg[3]; } catch (error) { if(error.code==="ENOENT"){ console.log("没有该文件或目录"+arg[3]); }else{ console.log(error); } return ; } }else{ console.log("请输入工作目录 baidu2wxapp --path 'c:\\ab'"); return ; } } else{ console.log("你可以输入baidu2wxapp --getConfig 获取配置文件路径 然后修改配置文件"); console.log("你可以输入baidu2wxapp --path <path路径> 以输入的path为工作路径开始转换"); console.log("你可以输入baidu2wxapp --start开始转换(以配置中的路径为工作目录)"); return; } }else{ console.log("你可以输入baidu2wxapp --getConfig 获取配置文件路径 然后修改配置文件"); console.log("你可以输入baidu2wxapp --path <path路径> 以输入的path为工作路径开始转换"); console.log("你可以输入baidu2wxapp --start开始转换(以配置中的路径为工作目录)"); return; } let rl = readline(configpath); let JSAPR=require("./lib/JSApiPropReplace.js") let Order = 0; /** * 将符合后缀的文件copy和修改后缀名为指定的后缀。e.g. * addUpdateSuffix(".wxml",".axml");将会copy指定目录下所有的.wxml后缀的文件为.axml后缀的文件 */ const UPDATAANDCOPY = 1; /** * 删除指定后缀的文件 e.g. addUpdateSuffix("abc.xml")将会删除指定目录下所有的abc.xml */ const DELETEFILE = 2; /** * 将符合后缀的文件替换为指定的后缀 e.g. * addUpdateSuffix(".wxml",".axml");将会修改指定目录下所有的.wxml为.axml */ const UPDATESUFFIX = 3; /** * 微信小程序转阿里小程序 js文件主要是进行库名的修改,即'wx.'-->'my.' 方法名替换使用addUpdateMethods()添加更换的方法 * e.g. addUpdateMethods("request","httpRequest") 将request转换成httpRequest * axml文件主要进行 属性名称的修改,即'wx:'-->'a:' */ const WX2ANT = 4; const config = { dir: "", suffix: [], toSuffix: [], methods: [], toMethods: [], JSRegexp: [], JSToRegexp: [], WXSRegexp: [], WXSToRegexp: [], AXMLRegexp: [], AXMLToRegexp: [], JSONRegexp:[], JSONToRegexp:[], ACSSRegexp:[], ACSSToRegexp:[], JSApiPropReplace:{} }; let state = ""; let jsaprstate=""; // let jsaprprop=""; rl .on('line', function (line, lineCount, byteCount) { line=line.replace(/#.*$/g, "").trim(); if (state === "") { if ("JSmethod" === line) { state = line } else if ("JS" === line) { state = line } else if ("WXS" === line) { state = line } else if ("AXML" === line) { state = line } else if ("ACSS" === line) { state = line } else if ("DIR" === line) { state = line } else if ("JSON" === line) { state = line } else if ("JS_API_PROP_REPLACE" === line) { state = line } else if("OVER"===line){ main(); } } else if ("end" === line) { state = ""; } else if ("" === line) { } else if ("JSmethod" === state) { let aTob = line.split("--->"); addUpdateMethods(aTob[0], aTob[1]); } else if ("JS" === state) { console.log("JS文件替换"); let aTob = line.split("--->"); addJSRegexp(aTob[0], aTob[1]); } else if ("WXS" === state) { console.log("WXS替换"); let aTob = line.split("--->"); addWXSRegexp(aTob[0], aTob[1]); } else if ("AXML" === state) { let aTob = line.split("--->"); addAXMLRegexp(aTob[0], aTob[1]); } else if ("ACSS" === state) { let aTob = line.split("--->"); addACSSRegexp(aTob[0], aTob[1]); } else if ("JSON" === state) { let aTob = line.split("--->"); addJSONRegexp(aTob[0], aTob[1]); } else if ("JS_API_PROP_REPLACE" === state) { addToJSApiPropReplace(line) } else if ("DIR" === state) { config.dir = dirPath||line; console.log("切换到修改文件路径:" + config.dir); } else if("OVER"===line){ main(); } }) .on('error', function (e) { console.log(e); }); function main(){ // console.log(config.JSApiPropReplace) addUpdateSuffix("swan", "wxml");// 这边的order是UPDATESUFFIX 所以是修改后缀名 wxml->axml addUpdateSuffix("css", "wxss");// wxss->acss addUpdateSuffix(".filter.js", ".filter.wxs");// filter.js->filter.wxs setOrder(UPDATESUFFIX); HandleFile(config.dir); clearSuffix(); setOrder(WX2ANT); HandleFile(config.dir); console.log("*****************************************************************************") console.log("转换完成"); console.log("*****************************************************************************") } function setOrder(order) { Order = order; } function addUpdateMethods(method, toMethod) { config.methods.push(method); config.toMethods.push(toMethod || ""); } function clearMethod() { config.methods = []; config.toMethods = []; } // ----------------------------------- 要更新的后缀 function addUpdateSuffix(suffix, toSuffix) { config.suffix.push(suffix); config.toSuffix.push(toSuffix || ""); } function clearSuffix() { config.suffix = []; config.toSuffix = []; } // ----------------------------------- js要更新的正则表达式 function addJSRegexp(suffix, toSuffix) { config.JSRegexp.push(suffix); config.JSToRegexp.push(toSuffix || ""); } function clearJSRegexp() { config.JSRegexp = []; config.JSToRegexp = []; } function addWXSRegexp(suffix, toSuffix) { config.WXSRegexp.push(suffix); config.WXSToRegexp.push(toSuffix || ""); } function clearWXSRegexp() { config.WXSRegexp = []; config.WXSToRegexp = []; } // ----------------------------------- amxl要更新的正则表达式 function addAXMLRegexp(suffix, toSuffix) { config.AXMLRegexp.push(suffix); config.AXMLToRegexp.push(toSuffix); } function clearAXMLRegexp() { config.AXMLRegexp = []; config.AXMLToRegexp = []; } // ----------------------------------- acss要更新的正则表达式 function addACSSRegexp(suffix, toSuffix) { config.ACSSRegexp.push(suffix); config.ACSSToRegexp.push(toSuffix); } function clearACSSRegexp() { config.ACSSRegexp = []; config.ACSSToRegexp = []; } //----------------------------------- json要更新的正则表达式 function addJSONRegexp(suffix, toSuffix) { config.JSONRegexp.push(suffix); config.JSONToRegexp.push(toSuffix); } function clearJSONRegexp() { config.JSONRegexp = []; config.JSONToRegexp = []; } //----------------------------------- JSApiPropReplace function addToJSApiPropReplace(str) { if(str==="PRO:"){ jsaprstate=""; }else if(str==="KEYS:"){ }else if(str.startsWith("KEYS:")&&jsaprstate!==""){ str=str.substring(5).trim() let aTob = str.split("--->"); config.JSApiPropReplace[jsaprstate][aTob[0]]=aTob[1] }else if(str.startsWith("PRO:")){ str=str.substring(4).trim() jsaprstate=str; config.JSApiPropReplace[jsaprstate]={}; }else if(jsaprstate===""){ jsaprstate=str; config.JSApiPropReplace[jsaprstate]={}; }else if(jsaprstate!==""){ let aTob = str.split("--->"); config.JSApiPropReplace[jsaprstate][aTob[0]]=aTob[1] } } // function clearJSONRegexp() { // config.JSONRegexp = []; // config.JSONToRegexp = []; // } // ----------------------------------- function HandleFile(file) { try { fs.accessSync(file) let stat = fs.statSync(file); if (stat.isFile()) { switch (Order) { case UPDATAANDCOPY: updataAndCopy(file); break; case DELETEFILE: deleteFile(file); break; case UPDATESUFFIX: updataSuffix(file); break; case WX2ANT: wx2ant(file); break; default: console.log("没有该种处理文件的方式"); break; } } else if (stat.isDirectory()) { let dirs = fs.readdirSync(file); for (let i in dirs) { HandleFile(path.resolve(file, dirs[i])); } } } catch (e) { console.log(e) } } /** * 将符合后缀的文件copy和修改后缀名为指定的后缀。e.g. * addUpdateSuffix(".wxml",".axml");将会copy指定目录下所有的.wxml后缀的文件为.axml后缀的文件 * * @param f */ function updataAndCopy(file) { let index = isValid(file); if (index == -1) { return; } let suffix = config.suffix; let toSuffix = config.toSuffix; let newfile = file.replace(new RegExp(suffix[index] + "$"), toSuffix[index]); try { fs.copyFileSync(file, newfile); console.log("文件复制:" + newfile); } catch (e) { console.log(e) console.log("文件复制出错:" + e.getMessage()); } } /** * 将符合后缀的文件替换为指定的后缀 e.g. * addUpdateSuffix(".wxml",".axml");将会修改指定目录下所有的.wxml为.axml * * @param f */ function updataSuffix(file) { let index = isValid(file); if (index == -1) { return; } let suffix = config.suffix; let toSuffix = config.toSuffix; let newfile = file.replace(new RegExp(suffix[index] + "$"), toSuffix[index]); try { fs.renameSync(file, newfile); console.log("文件修改后缀名:" + newfile); } catch (e) { console.log(e) console.log("文件修改后缀名出错:" + newfile + "--" + e.getMessage()); } } /** * 删除指定后缀的文件 e.g. addUpdateSuffix("abc.xml")将会删除指定目录下所有的abc.xml * * @param f */ function deleteFile(file) { try { fs.accessSync(file); fs.unlinkSync(file); console.log("文件删除成功:" + path); } catch (e) { console.log(e); console.log(file + "文件有误"); } } /** * 微信小程序转阿里小程序 js文件主要是进行库名的修改,即'wx.'-->'my.' 方法名替换使用addUpdateMethods()添加更换的方法 * e.g. addUpdateMethods("request","httpRequest") 将request转换成httpRequest * axml文件主要进行 属性名称的修改,即'wx:'-->'a:' * * @param f */ function wx2ant(file) { if (path.extname(file) === ".js") { let preffix = "(^|\\W+)swan\\."; let toPreffix = "$1wx."; let methods = config.methods; let toMethods = config.toMethods; let JSRegexp = config.JSRegexp; let JSToRegexp = config.JSToRegexp; try { let content = fs.readFileSync(file, "utf8"); for (let i in methods) {// 修改不一样的方法 content = content.replace(new RegExp(preffix + methods[i], "g"), toPreffix + toMethods[i]); } for (let i in JSRegexp) {// 修改不一样的方法 content = content.replace(new RegExp(JSRegexp[i], "g"), JSToRegexp[i]); } content = content.replace(new RegExp(preffix, "g"), toPreffix);// 统一修改未进行方法替换的前缀 content=JSAPR.replace(content,config.JSApiPropReplace); fs.writeFileSync(file, content); console.log("转换js文件:" + file); } catch (e) { console.log(e) console.log("转换js文件出错:" + file); } }else if (path.extname(file) === ".wxs") { let WXSRegexp = config.WXSRegexp; let WXSToRegexp = config.WXSToRegexp; try { let content = fs.readFileSync(file, "utf8"); for (let i in WXSRegexp) {// 修改不一样的方法 content = content.replace(new RegExp(WXSRegexp[i], "g"), WXSToRegexp[i]); } fs.writeFileSync(file, content); console.log("转换wxs文件:" + file); } catch (e) { console.log(e) console.log("转换wxs文件出错:" + file); } } else if (path.extname(file) === ".wxml") { let AXMLRegexp = config.AXMLRegexp; let AXMLToRegexp = config.AXMLToRegexp; try { let content = fs.readFileSync(file, "utf8"); for (let i in AXMLRegexp) {// 修改不一样的方法 content = content.replace(new RegExp(AXMLRegexp[i], "g"), AXMLToRegexp[i]); } fs.writeFileSync(file, content); console.log("转换axml文件:" + file); } catch (e) { console.log(e) console.log("转换axml文件出错:" + file); } } else if (path.extname(file) === ".json") { let JSONRegexp = config.JSONRegexp; let JSONToRegexp = config.JSONToRegexp; try { let content = fs.readFileSync(file, "utf8"); for (let i in JSONRegexp) {// 修改不一样的方法 content = content.replace(new RegExp(JSONRegexp[i], "g"), JSONToRegexp[i]); } fs.writeFileSync(file, content); console.log("转换json文件:" + file); } catch (e) { console.log(e) console.log("转换json文件出错:" + file); } }else if (path.extname(file) === ".wxss") { let ACSSRegexp = config.ACSSRegexp; let ACSSToRegexp = config.ACSSToRegexp; try { let content = fs.readFileSync(file, "utf8"); for (let i in ACSSRegexp) {// 修改不一样的方法 content = content.replace(new RegExp(ACSSRegexp[i], "g"), ACSSToRegexp[i]); } fs.writeFileSync(file, content); console.log("转换acss文件:" + file); } catch (e) { console.log(e) console.log("转换acss文件出错:" + file); } }else if (path.extname(file) === ".wxs") { let WXSRegexp = config.WXSRegexp; let WXSToRegexp = config.WXSToRegexp; try { let content = fs.readFileSync(file, "utf8"); for (let i in WXSRegexp) {// 修改不一样的方法 content = content.replace(new RegExp(WXSRegexp[i], "g"), WXSToRegexp[i]); } fs.writeFileSync(file, content); console.log("转换acss文件:" + file); } catch (e) { console.log(e) console.log("转换acss文件出错:" + file); } } } function isValid(file) { let suffix = config.suffix for (let i in suffix) { if (file.endsWith(suffix[i])) { return i; } } return -1; }