解放双手,nodejs批量处理文件(匹配+重命名+转换代码)

解放双手,nodejs批量处理文件(匹配+重命名+转换代码)

一、背景

公司现在有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;
}


发布了43 篇原创文章 · 获赞 2 · 访问量 4586

猜你喜欢

转载自blog.csdn.net/iamlujingtao/article/details/102591454