const fs = require('fs'); const path = require('path'); // 书籍目录路径 const BOOK_DIR = path.join(__dirname, '../book'); const OUTPUT_FILE = path.join(__dirname, '../lib/book-data.ts'); // 扫描所有章节 function scanChapters() { const chapters = []; let index = 1; // 添加序言 const prefaceFile = path.join(BOOK_DIR, '序言|为什么我每天早上6点在Soul开播?.md'); if (fs.existsSync(prefaceFile)) { chapters.push({ index, id: `preface`, title: '序言|为什么我每天早上6点在Soul开播?', filePath: prefaceFile, partTitle: '序言', updateTime: getFileTime(prefaceFile) }); index++; } // 扫描五篇 const parts = [ { dir: '第一篇|真实的人', title: '第一篇|真实的人' }, { dir: '第二篇|真实的行业', title: '第二篇|真实的行业' }, { dir: '第三篇|真实的错误', title: '第三篇|真实的错误' }, { dir: '第四篇|真实的赚钱', title: '第四篇|真实的赚钱' }, { dir: '第五篇|真实的社会', title: '第五篇|真实的社会' } ]; parts.forEach(part => { const partDir = path.join(BOOK_DIR, part.dir); if (!fs.existsSync(partDir)) return; // 读取该篇下的所有章文件夹 const chapterDirs = fs.readdirSync(partDir) .filter(name => !name.startsWith('.') && fs.statSync(path.join(partDir, name)).isDirectory()) .sort(); chapterDirs.forEach(chapterDir => { const chapterPath = path.join(partDir, chapterDir); const mdFiles = fs.readdirSync(chapterPath) .filter(name => name.endsWith('.md')) .sort(); mdFiles.forEach(mdFile => { const filePath = path.join(chapterPath, mdFile); const title = mdFile.replace('.md', ''); chapters.push({ index, id: `chapter-${index}`, title, filePath, partTitle: part.title, chapterDir, updateTime: getFileTime(filePath) }); index++; }); }); }); // 添加尾声 const epilogueFile = path.join(BOOK_DIR, '尾声|这本书的真实目的.md'); if (fs.existsSync(epilogueFile)) { chapters.push({ index, id: `epilogue`, title: '尾声|这本书的真实目的', filePath: epilogueFile, partTitle: '尾声', updateTime: getFileTime(epilogueFile) }); } return chapters; } function getFileTime(filePath) { const stats = fs.statSync(filePath); const now = Date.now(); const diff = now - stats.mtimeMs; const days = Math.floor(diff / (1000 * 60 * 60 * 24)); if (days === 0) return '今天'; if (days === 1) return '昨天'; if (days < 7) return `${days}天前`; if (days < 30) return `${Math.floor(days / 7)}周前`; return `${Math.floor(days / 30)}个月前`; } // 生成TypeScript数据文件 function generateDataFile() { const chapters = scanChapters(); console.log(`扫描到 ${chapters.length} 个章节`); // 生成JSON fs.writeFileSync( path.join(__dirname, '../public/book-chapters.json'), JSON.stringify(chapters, null, 2) ); console.log('✅ 章节数据已生成:public/book-chapters.json'); console.log(` 共 ${chapters.length} 章`); } // 执行 generateDataFile();