/** * 从多个 Swagger API 文件提取接口中文名称,写入 api_mapping_merged.md * 规则:根据完整URL中的关键字匹配不同的API源文件 */ const fs = require('fs'); const path = require('path'); // API 源配置:每项包含文件名和URL中需要匹配的关键字 const API_SOURCES = [ { file: 'allApi.text', urlKeyword: 'EShangApiMain' }, { file: 'CommercialApiALLAPI.text', urlKeyword: 'CommercialApi' }, ]; // 1. 解析所有 API 源文件,构建 { urlKeyword: { exact: {}, lower: {} } } 映射 function parseApiFile(filePath) { const content = fs.readFileSync(filePath, 'utf-8'); const lines = content.split('\n').map(l => l.trim()).filter(l => l); const exact = {}; const lower = {}; for (let i = 0; i < lines.length - 1; i++) { const match = lines[i].match(/^(get|post)\s+(\/\S+)$/i); if (match) { const apiPath = match[2]; const nextLine = lines[i + 1]; if (nextLine && !/^(get|post)\s+\//i.test(nextLine)) { if (!exact[apiPath]) exact[apiPath] = nextLine; const lp = apiPath.toLowerCase(); if (!lower[lp]) lower[lp] = nextLine; } } } return { exact, lower }; } const sourceMaps = {}; for (const src of API_SOURCES) { const filePath = path.join(__dirname, '..', 'config', src.file); if (!fs.existsSync(filePath)) { console.log(`⚠️ 文件不存在,跳过: ${src.file}`); continue; } sourceMaps[src.urlKeyword] = parseApiFile(filePath); console.log(`📖 ${src.file} 解析完成: ${Object.keys(sourceMaps[src.urlKeyword].exact).length} 个接口映射 (关键字: ${src.urlKeyword})`); } // 2. 处理 api_mapping_merged.md const mdPath = path.join(__dirname, '..', 'config', 'api_mapping_merged.md'); const mdContent = fs.readFileSync(mdPath, 'utf-8'); const lines = mdContent.split('\n'); const newLines = []; let addedCount = 0; let skippedCount = 0; let notFoundCount = 0; for (let i = 0; i < lines.length; i++) { newLines.push(lines[i]); // 查找 - **接口**: `/xxx/xxx` 这一行 const interfaceMatch = lines[i].match(/^- \*\*接口\*\*:\s*`([^`]+)`/); if (!interfaceMatch) continue; const apiPath = interfaceMatch[1]; // 检查下一行是否已有接口名称(避免重复) if (i + 1 < lines.length && lines[i + 1].includes('**接口名称**')) { skippedCount++; continue; } // 往后找完整URL行,确定匹配哪个API源 let matchedKeyword = null; for (let j = i + 1; j < Math.min(i + 5, lines.length); j++) { if (lines[j].includes('**完整URL**')) { for (const src of API_SOURCES) { if (lines[j].includes(src.urlKeyword)) { matchedKeyword = src.urlKeyword; break; } } break; } if (lines[j].match(/^####\s/)) break; } if (!matchedKeyword || !sourceMaps[matchedKeyword]) continue; // 在对应映射中查找: 先精确匹配,再忽略大小写匹配 const maps = sourceMaps[matchedKeyword]; const chineseName = maps.exact[apiPath] || maps.lower[apiPath.toLowerCase()]; if (chineseName) { newLines.push(`- **接口名称**: \`${chineseName}\``); addedCount++; } else { notFoundCount++; } } fs.writeFileSync(mdPath, newLines.join('\n'), 'utf-8'); console.log(`\n✅ 完成!`); console.log(` 已添加接口名称: ${addedCount}`); console.log(` 已跳过(已有名称): ${skippedCount}`); console.log(` 未找到匹配: ${notFoundCount}`);