一、背景
公司现在有2套系统,新系统和旧系统,2套系统使用的技术方案不同,所以网站代码也有些不同。
现在需要把旧系统代码转换为新系统代码,通常情况下我们是手动修改的,但是改了几次后发现实在痛苦,于是想能否让程序自动转换。
如果只是替换代码,很多软件都可以,但是实际情况不是简单的替换,而是要做很多复制判断,而且整个流程是 匹配文件–>重命名–>替换代码,要做到自动化就必须自己手写代码了。
二、需求
- 1、匹配项目文件夹下的所有指定类型的文件(html)
- 2、把匹配的文件重命名为cshtml后缀
- 3、转换为新系统代码
简单的代码转换例子:
当然实际情况不止这么简单,还有更多情况要处理,涉及公司利益就不把全功能的放出来了。
旧系统代码:
<!-- 旧系统代码: -->
<ul class="infoList">
{PE.Label id="通用信息列表" outputQty="10" titleLength="40" nodes="0" displayDateTime="mm-dd"/}
</ul>
新系统代码:
<!-- 转换为新系统代码: -->
<ul class="infoList">
@Power.ArticleList("文章标题列表" , new { Count=10, TitleLength=40, Node="0", DateFormat="MM-dd"})
</ul>
三、成果
这里就直接放成果了:
nodejs代码:
/*
将旧系统代码转换为新系统
*/
//配置
//要转换类型文件
var fileTypes = ["html"]
//默认执行目录,默认是当前目录
var root=__dirname;
var fs = require("fs")
var path = require("path")
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
console.log("程序:将旧系统代码转换为新系统\n如果输入1,则为本目录\n");
rl.question('请输入文件夹地址:', (answer) => {
if(answer!=1){ //如果输入1,则为本目录
root = path.join(answer);
}
readDirSync(root)
rl.close();
});
function readDirSync(path){
var pa = fs.readdirSync(path);
pa.forEach(function(ele,index){
var info = fs.statSync(path+"/"+ele);
//如果是文件夹则继续读取
if(info.isDirectory()){
readDirSync(path+"/"+ele);
}else{
//将html代码转换为cshtml
if( fileTypes.indexOf(ele.split(".").pop())>=0 ){
var newName = ele.replace(".html",".cshtml");
var oldFile = path+"/"+ele;
var newFile = path+"/"+newName;
//重命名
setTimeout(function(){
fs.rename( oldFile, newFile, function (err) {
if(err) {
console.log("重命名失败:" + newFile);
return;
}else{
console.log("重命名成功:" + newFile);
//开始转换
setTimeout(function(){
replaceHtml(newFile);
},1000);
}
});
},1000)
}else{
process.stdout.write(" = ")
}
}
})
}
function replaceHtml(_file){
var label_REG = /{PE.Label.*\/}/ig;
//读取文件
fs.readFile(_file,function (err,data){
data = data + "";
//处理一般标签
data = data.replace(label_REG,function (word){
if(word.indexOf("通用信息列表")>=0){
return tyxxlb(word,'@Power.ArticleList("文章标题列表" , new{ ');
}
});
//写入文件
fs.writeFile(_file, data, function(err){
if(err){
console.log("转换失败:" + _file);
}else{
console.log("转换成功:" + _file);
}
});
})
}
// 标签通用替换,type为特别参数,1为其它标签,2为头条信息列表,3为 通用信息列表_焦点图
function tyxxlb(word,startStr,type){
word = word.substring(0,word.length-2); //删除结尾的 /}
var ary = word.split(/[ ]+/); //空格分割
var peStr = startStr;
ary.forEach(function(ele,index){
var _ary = ele.split("=");
if(_ary.length>1){
switch(_ary[0].toLowerCase()){
case 'id':
break;
case 'nodes':
peStr+='Node='+_ary[1]+', ';
break;
case 'outputqty':
peStr+='Count='+_ary[1].replace(/"/g,'')+', ';
break;
case 'displaydatetime':
peStr+='DateFormat='+_ary[1].replace('mm', 'MM')+', ';
break;
case 'titlelength':
peStr+=_ary[0]+'='+_ary[1].replace(/"/g,'')+', ';
break;
default:
peStr+=ele+', ';
}
}
})
peStr+="}";
peStr=peStr.replace(', })',' })');
return peStr;
}