@10yun/cv-js-utils
Version:
常用 js-utils 工具类库
152 lines (135 loc) • 5.23 kB
JavaScript
const fs = require('fs');
function generateFileMd(titleName, fileContent, docsPath) {
/**
* 解析文件
*/
// 正则表达式来匹配注释块中的信息,包括 @action 标签
// const regex = /\/\*\*([\s\S]*?)\*\/[\s\S]*?function\s+(\w+)\s*\(([\s\S]*?)\)/g;
// const regex = /\/\*\*([\s\S]*?)\*\/\s*function\s+(\w+)\s*\(([\s\S]*?)\)/g;
// const regex = /\/\*\*\s*([^]*?)\s*\*\/\s*function\s+(\w+)\s*\(([^]*?)\)/g;
const regex = /\/\*\*\s*([^]*?)\s*\*\/\s*function\s+(\w+)\s*\(([^]*?)\)/g;
let mdTbNameLenMax = 0;
let mdTbActionLenMax = 0;
let docsArr = [];
let match;
while ((match = regex.exec(fileContent)) !== null) {
// const comment = match[1].trim();
// 捕获组1匹配注释,如果没有注释则为空字符串
const comment = match[1] ? match[1].trim() : '';
const functionName = match[2];
const functionLink = functionName.toLocaleLowerCase();
const params = match[3].split(',').map((param) => param.trim());
// 提取 @action 标签中的动作名称
// const actionMatch = /\/\*\*\s*\*\s*@action\s*(.*?)\s*\*\//.exec(comment);
// const actionMatch = /@action\s+(.*?)\s*(?:\*\/|$)/.exec(comment);
const actionMatch = comment.match(/@action\s+(.*)/);
// const actionMatch = comment ? /@action\s+(.*?)\s*(?:\*\/|$)/.exec(comment) : null; // 如果有注释,则匹配 @action 标签
const actionName = actionMatch ? actionMatch[1].trim() : null;
/**
* 返回类型
*/
// const returnMatch = comment.match(/@return\s+(.*)/);
const returnMatch = comment.match(/@return\s*\{([^}]*)\}\s*(.*)/);
let returnName = returnMatch ? returnMatch[1].trim() : '-';
if (returnName) {
returnName = returnName.replace('{', '');
returnName = returnName.replace('}', '');
}
if (actionName) {
console.log(`
Function:${functionName}
Action:${actionName}
Return:${returnName}
`);
// console.log('Comment:', comment);
console.log('Params:', params);
// console.log('------------------------');
let currNameLeng = `[${functionName}](#${functionLink})`.length;
if (currNameLeng > mdTbNameLenMax) {
mdTbNameLenMax = currNameLeng;
}
let currActionLeng = `${actionName}`.length;
if (currActionLeng > mdTbActionLenMax) {
mdTbActionLenMax = currActionLeng;
}
docsArr.push({
function: functionName,
functionLink: functionLink,
action: actionName,
params: params,
return: returnName
});
}
}
console.log(mdTbNameLenMax);
let tableHeadName = '方法'.padEnd(mdTbNameLenMax - 1);
let tableHeadFenge = `:--------------------------`.padEnd(mdTbNameLenMax, '-');
let mdContent = `# ${titleName}
### 方法概览
| ${tableHeadName}| 返回 | 说明 |
| ${tableHeadFenge} | :----- | :----------------------- |
`;
for (let i in docsArr) {
let docsItem = docsArr[i];
let nameStr = `[${docsItem['function']}](#${docsItem['functionLink']})`;
nameStr = nameStr.padEnd(mdTbNameLenMax + 1);
let actionStr = `${docsItem['action']}`;
actionStr = actionStr.padEnd(mdTbActionLenMax + 1);
mdContent += `| ${nameStr}| ${docsItem['return']} | ${actionStr}|` + '\n';
}
fs.writeFileSync(docsPath, mdContent, 'utf8');
}
function showConsoleLog() {
console.log(...arguments);
}
// generateMd
const parseDocsDirList = ['function'];
for (let i_dir in parseDocsDirList) {
// 目录名称
let dirName = parseDocsDirList[i_dir];
// md菜单
let mdDirMenuPath = `../../docs/${dirName}/_menu.js`;
let mdDirMenuContet = 'export default [\n';
// 指定要读取的目录
let directoryPath = `../../src/${dirName}`;
// 读取目录
const dirFileList = fs.readdirSync(directoryPath);
const dirFileLeng = dirFileList.length;
for (let i_file in dirFileList) {
let fileName = dirFileList[i_file];
let filePath = `${directoryPath}/${fileName}`;
let docsName = fileName.replace('.js', '.md');
let docsPath = `../../docs/${dirName}/${docsName}`;
/**
* 读取内容
*/
const fileContent = fs.readFileSync(filePath, 'utf8');
/**
* 获取【标题】
*/
const titleRegex = fileContent.match(/@title\s+(.*)/);
const titleName = titleRegex ? titleRegex[1].trim() : null;
showConsoleLog(`文件名称:${fileName} ;标题:${titleName}`);
/**生成文档 */
generateFileMd(titleName, fileContent, docsPath);
let mdFileName = fileName.replace('.js', '');
let mdFileLink = `/function/${mdFileName}`;
if (dirFileLeng == ++i_file) {
mdDirMenuContet += ` { text: '${titleName}', link: '${mdFileLink}' }\n`;
} else {
mdDirMenuContet += ` { text: '${titleName}', link: '${mdFileLink}' },\n`;
}
}
mdDirMenuContet += '];\n';
fs.writeFileSync(mdDirMenuPath, mdDirMenuContet, 'utf8');
}
// ~~~
// geoCalcDistance(to_lat, to_lng, my_lat, my_lng)
// ~~~
// **参数**
// | 参数 | 默认值 | 说明 |
// | :----- | :------------ | :--- |
// | to_lat | 对象 纬度 | 必填 |
// | to_lng | 对象 经度 | 必填 |
// | my_lat | 当前我的 纬度 | 必填 |
// | my_lng | 当前我的 经度 | 必填 |