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')// 执行入口写路径