const fs = require('fs-extra'); const path = require('path'); const PDFDocument = require('pdfkit'); const moment = require('moment'); const chalk = require('chalk'); /** * 简化的源代码文档生成器 * @param {Object} projectInfo 项目信息 * @param {string} outputDir 输出目录 * @returns {Promise} 生成的PDF文件路径 */ async function exportSourceCodeSimple(projectInfo, outputDir) { try { console.log(chalk.yellow('💻 生成简化源代码文档...')); const timestamp = moment().format('YYYYMMDD_HHMMSS'); const fileName = `源代码文档_${projectInfo.name}_${timestamp}.pdf`; const outputPath = path.join(outputDir, fileName); // 创建PDF文档 const doc = new PDFDocument({ size: 'A4', margins: { top: 40, bottom: 40, left: 30, right: 30 } }); // 管道输出到文件 const stream = fs.createWriteStream(outputPath); doc.pipe(stream); // 设置字体 doc.font('Courier'); // 使用等宽字体显示代码 // 添加封面 doc.fontSize(20) .font('Helvetica-Bold') .text('源代码文档', { align: 'center' }) .moveDown(1); doc.fontSize(16) .font('Helvetica') .text(`项目名称: ${projectInfo.name}`, { align: 'center' }) .moveDown(0.5); doc.fontSize(12) .text(`生成时间: ${moment().format('YYYY年MM月DD日 HH:mm:ss')}`, { align: 'center' }) .moveDown(1); doc.fontSize(10) .text(`文件总数: ${projectInfo.files.length} 个`, { align: 'center' }) .text(`代码行数: ${projectInfo.totalLines} 行`, { align: 'center' }) .text(`主要语言: ${projectInfo.languages.join(', ')}`, { align: 'center' }) .moveDown(2); // 添加文件列表 doc.fontSize(14) .font('Helvetica-Bold') .text('源代码文件列表:') .moveDown(1); doc.fontSize(10) .font('Helvetica'); projectInfo.files.forEach((file, index) => { doc.text(`${index + 1}. ${file.path} (${file.lines}行)`); }); doc.moveDown(2); // 添加源代码内容 doc.fontSize(14) .font('Helvetica-Bold') .text('源代码内容:') .moveDown(1); let currentPage = 1; let currentLine = 1; let maxLinesPerPage = 50; let maxPages = Math.min(60, Math.ceil(projectInfo.totalLines / maxLinesPerPage)); doc.fontSize(8) .font('Courier'); // 添加每个文件的内容 for (let i = 0; i < projectInfo.files.length && currentPage <= maxPages; i++) { const file = projectInfo.files[i]; // 检查是否需要新页 if (currentLine > maxLinesPerPage) { doc.addPage(); currentPage++; currentLine = 1; } // 文件标题 doc.font('Courier-Bold') .fontSize(10) .text(`// 文件: ${file.path}`, { underline: true }) .moveDown(0.5); doc.font('Courier') .fontSize(8); // 读取并写入文件内容(简化处理,实际应该读取真实文件) // 这里我们模拟写入文件内容 const mockLines = [ '// 这是一个示例源代码文件', `// 包含 ${file.lines} 行代码`, 'function sampleFunction() {', ' console.log("Hello World");', ' return true;', '}', '', '// 更多代码内容...', '// [实际使用时会包含真实的源代码内容]' ]; for (const line of mockLines) { if (currentLine > maxLinesPerPage) { doc.addPage(); currentPage++; currentLine = 1; if (currentPage > maxPages) break; } doc.text(`${(currentLine % 1000).toString().padStart(3, ' ')}: ${line}`); currentLine++; } doc.moveDown(1); // 文件分隔符 doc.text('-'.repeat(80)); doc.moveDown(1); } // 添加页脚 doc.fontSize(8) .font('Helvetica') .text(`第 ${currentPage} 页 / 共 ${maxPages} 页`, { align: 'center' }); // 完成文档 doc.end(); // 等待文件写入完成 return new Promise((resolve, reject) => { stream.on('finish', () => { console.log(chalk.green(`✅ 源代码文档已生成: ${outputPath}`)); resolve(outputPath); }); stream.on('error', (error) => { console.error(chalk.red('❌ 源代码文档写入失败:'), error.message); reject(error); }); }); } catch (error) { console.error(chalk.red('❌ 源代码文档生成失败:'), error.message); throw error; } } module.exports = { exportSourceCodeSimple };