代码拉取完成,页面将自动刷新
当前脚本适用于检测对应项目目录下的中文匹配,如果需要匹配其他内容可以直接修改正则表达式规则
npm install -g getprochinese
//path项目目录 filterDist是否过滤dist
getCH check [path] [filterDist] | getCH c [path] [filterDist]
//ps: getCH check /user/mac/vuepro 简便实用方式(path可直接拖入)
//走命令行筛选目录
getCH check | getCH c
node项目执行请打开主目录下的index.js中的autorun
// autoRun() node项目执行请打开 node项目执行请打开 node项目执行请打开
git clone https://gitee.com/guomeng/get-pro-chinese.git
cd get-pro-chinese
npm i
npm run start
如图所示,运行之后会按流程这些问题,项目地址可以直接拖入文件夹
问题 | 对应字段 | 是否必填 | 默认值 | 备注 |
---|---|---|---|---|
项目地址 | projectPath | true | 无 | 必须填写目录,可直接通过拖拽文件夹到命令行将目录引入 |
是否过滤dist | filterDist | false | true | 过滤dist编译目录下的文件 可直接enter略过 |
自定义过滤目录 | filterRule | false | 无 | 自定义过滤哪些规则文件 [ 'node_module', '.git', 'wp.cfg', '.vscode', 'images', '.jpg', '.png', 'docs', '.jpeg'] 目前过滤文件规则 可直接enter略过 |
xlsx路径 | xlsxPath | false | 无 | 不填写就默认项目目录 docs下 可直接enter略过 |
xlsx名称 | xlsxName | false | "项目中英文参照文档" | xlsx输出文档名称 项目中英文参照文档 可直接enter略过 |
确定开始 | confirm | 是 | true | enter之后执行脚本 可直接enter略过 |
第1部分命令行交互
第2部分执行项目文件检索
最后一步输出检索文件信息以及xlsx输出位置和耗时
代码讲解见代码注释index.js
//question交互
inquirer
.prompt(questions)
.then((res) => {
if (!res) console.log(chalk.red('参数错误,请重试!'))
if (!res.confirm) console.log(chalk.gray('取消了检索操作!'))
if (!res.projectPath) console.log(chalk.gray('文件目录为空!'))
//设置过滤规则
if (res.filterDist) {
dirRegArr.push('dist')
}
if (res.filterRule) {
dirRegArr.push(...res.filterRule?.split(','))
}
//赋值xlsx输出目录
if (res.xlsxPath) {
xlsxPath = res.xlsxPath
} else {
xlsxPath = res.projectPath
}
//赋值xlsx名称
if (res.xlsxName) {
xlsxName = res.xlsxName
}
console.log(chalk.green('开始文件检索---------------------------------'))
console.log(chalk.green('过滤文件列表------>' + JSON.stringify(dirRegArr)))
date = new Date().getTime()
readFilePathSync(res.projectPath)
console.log(
chalk.green(
'========================文件检索完成========================'
)
)
if (!typeObject) return
//统计检索文件类型 数量
const keys = Object.keys(typeObject)
if (keys && keys.length) {
let total = 0,
msg = ''
keys.map((key, index) => {
total = total + (typeObject[key]?.count || 0)
msg = msg + `${key}文件:${typeObject[key]?.count || 0}\n`
})
msg = '总共检索文件:' + total + '\n' + msg
console.log(chalk.blueBright(msg))
}
console.log(
chalk.blueBright(
'\nxlsx文件输出目录:' + xlsxPath + '/docs/' + xlsxName + '.xlsx'
)
)
//统计花费时间
console.log(chalk.yellow(`\n总用时:${new Date().getTime() - date}ms\n`))
})
.catch((e) => {
//错误处理
console.log(chalk.red('==============文件检索失败=============='))
console.log(chalk.red('error:' + e))
})
/**
* 脚本开始的方法
* @param {*} filePath 项目目录path
*/
function readFilePathSync(filePath) {
readDirSync(filePath)
// chArr.push(['总计', JSON.stringify(typeObject), null])
const sheetOptions = { '!cols': [{ wch: 50 }, { wch: 50 }, { wch: 50 }] }
const buffer = xlsx.build([{ name: xlsxName, data: chArr }], {
sheetOptions
})
if (!fs.existsSync(xlsxPath + '/docs')) {
//docs不存在就创建一个
fs.mkdirSync(xlsxPath + '/docs')
}
// 写入xlsx文件
fs.writeFileSync(xlsxPath + '/docs/' + xlsxName + '.xlsx', buffer, 'binary')
}
/**
* 读取dir目录下文件目录
* @param {*} dir 读取的目录
*/
function readDirSync(dir) {
const dirRegStr =
dirRegArr &&
dirRegArr.length &&
dirRegArr.reduce((preValue, value) => {
return preValue ? preValue + '|' + value : value
})
const dirReg = new RegExp(dirRegStr)
if (dir.match(dirReg)) {
//过滤掉node_modules文件
console.log(chalk.yellow('过滤文件------>' + dir))
return
}
if (!dir) return
const filesArr = fs.readdirSync(dir)
filesArr &&
filesArr.length &&
filesArr.map((file) => {
//得到拼接目录
const filePath = path.join(dir, file)
const stats = fs.statSync(filePath)
if (stats.isDirectory()) {
//如果是文件夹 递归调用readDir
readDirSync(filePath)
} else if (stats.isFile()) {
readFileSync(filePath)
} else {
}
})
}
/**
* 同步读取文件
* @param {*} filePath
*/
function readFileSync(filePath) {
if (!filePath) return
const extension = getExtension(filePath)
if (typeObject[extension]) {
//文件计数
typeObject[extension].count = typeObject[extension].count + 1
} else {
typeObject[extension] = { count: 1 }
}
let fileData = fs.readFileSync(filePath, 'utf-8')
if (!fileData) return
let filterArr = []
if (extension.match(/html/)) {
//过滤html注释
fileData = fileData.replace(chHtmlReg, '')
}
if (extension.match(/js|jsx/)) {
//过滤js|jsx注释
fileData = fileData.replace(chJSRegMulti, '')
fileData = fileData.replace(chJSRegSingle, '')
}
const fileChArr = fileData.match(chReg)
if (fileChArr && fileChArr.length > 0) {
if (chArr.length !== 1) {
//如果不是第一个页面添加空行
chArr.push([null, null, null])
}
chArr.push([filePath, null, null])
fileChArr.forEach((item) => {
if (filterArr.indexOf(item) < 0) {
//去重添加
filterArr.push(item)
chArr.push([filePath, item, null])
}
})
}
console.log(chalk.green(filePath + '文件检索完成'))
}
//匹配中文字符
const chReg = /[\u4E00-\u9FA5]+/g
//匹配html注释
const chHtmlReg = /<!--.*-->/
/**
* 多行注释匹配
*/
const chJSRegMulti = /(?:^|\n|\r)\s*\/\*[\s\S]*?\*\/\s*(?:\r|\n|$)/g
//单行注释匹配
const chJSRegSingle = /(?:^|\n|\r)\s*\/\/.*(?:\r|\n|$)/g
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。