vue国际化抽取脚本

node 脚本 抽取前端项目国际化
提取的思路很简单:
0.使用前需要在该目录下创建一个backupI8的文件夹
1.递归所有文件
2.读取文件,创建该路径文件夹,按行读取,当读取到某一行有汉字时就提取出来
3.每当读取完一个文件时就会创建一个相对应的json文件
4.代码如下:


const path = require('path')
const fs = require('fs')
var iconv = require('iconv-lite'); 
// node执行路径
const dirPath = process.cwd()
const chineseReg = /[\u4E00-\u9FFF]+[^a-zA-Z\<\>\"\']*/g  // 提取汉字正则
// 判断是文件夹还是文件
const fileRead = (filedir) => {
    return new Promise((resolve, reject) => {
        fs.stat(filedir, function (err, stats) {
            if (err) {
                console.warn('获取文件stats失败')
                reject(err)
            } else {
                //文件
                const isFile = stats.isFile()
                // 文件夹
                const isDir = stats.isDirectory()
                if (isFile) {
                    resolve(true)
                }
                if (isDir) {
                    resolve(false)
                }
            }
        })
    })
}
// 判断文件后缀
function is_filetype(filename, types) {
    types = types.split(',');
    var pattern = '\.(';
    for(var i=0; i<types.length; i++) {
      if(0 != i) {
        pattern += '|';
      }
        pattern += types[i].trim();
    }
    pattern += ')$';
    return new RegExp(pattern, 'i').test(filename);
}; 
// 入口,content接收路径
const fileTra = (content) => {
    //根据文件路径读取文件,返回文件列表
    return new Promise((resolve, reject) => {
        fs.readdir(content, async function (err, files) {
            if (err) {
                console.warn(err)
                reject(err)
            } else {
                //遍历读取到的文件列表
               await fs.mkdir(path.join(dirPath), { recursive: true },async (err) => {
                    if (err) throw err;
                  
                for (let i = 0; i < files.length; i++) {
                    //获取当前文件的绝对路径
                    const filedir = path.join(content, files[i])
                    //根据文件路径获取文件信息
                    const isFile = await fileRead(filedir)
                    // 如果是文件夹,递归遍历该文件夹下面的文件
                    if (!isFile) {
                        const backupPath = filedir.substr(filedir.indexOf('src'))
                       await fs.mkdir(path.join(dirPath,'backupI8n',backupPath), { recursive: true }   , async (err) => {
                            await fileTra(filedir)
                        })
                       
                    } else {
                        // 读取文件
                        if(is_filetype(files[i],'vue')){
                            // console.log('日志');
                            const fileContent = fs.readFileSync(filedir);
                            console.log('fileContent',files[i]);
                            await getChineseToArray(fileContent,filedir);
                        }
                      

                    }
                }
            });
                resolve(files)
            }
        })
    })
}
// 判断字符串中是否包含汉字
function checkChinese(val){     
    var reg = chineseReg
    if(reg.test(val)){return true}
    return false
}
async function getChineseToArray (content,filedir) {
    let obj = {};
    let strHead = '{'
    , strEnd = '}'
    , all = []

    all.push(strHead)    


    let str = iconv.decode(content, 'utf-8'); 

    // 把文件中代码按行分割出来
    let arr = str.split('\n'); 

    arr.forEach(async function(e,i) {
        // 这行如果有中文
        if (
            checkChinese(e)
            && e.indexOf('//') == -1 
            && e.indexOf('console.log') == -1
            && e.indexOf('@param') == -1
            && e.indexOf('@brief') == -1
        ) {
            isChineseInit = true;
            // 将中文抽成数组
            var a = e.split(/['"]/)
            // console.log(e)
            
            // 抽取中文
            a.forEach(async function(m, index){
                if (
                    checkChinese(m) 
                    && m.indexOf('* ') == -1
                    && m.indexOf(' * ') == -1
                    && m.indexOf('/*') == -1
                    && m.indexOf('<!--') == -1
                ){
                    const reg = chineseReg
                    var key = m.match(reg).join();
                    obj[key] = `${m.match(reg).join()}\n`;
                }
            })
        }

    }, this);

    const backupPath = filedir.substr(filedir.indexOf('src'));

    for (let key in obj) {
        all.push('"'+key+'"' +': '+ '"' +key+ '"' + ',')
    }
    all.push(strEnd)

    const basePath = path.join(dirPath,'backupI8n',backupPath.replace('vue','json'));
    

    fs.writeFileSync(basePath, all.join('\n'), {encoding:'utf8',flag:'w'})
}

fileTra('D:/fe-purchase/src')// 执行入口写路径
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值