mirror of
https://github.com/Anduin2017/HowToCook.git
synced 2025-02-08 10:59:23 +08:00
Update readme-generate.js (#1329)
* Update readme-generate.js * Update readme-generate.js * Update readme-generate.js
This commit is contained in:
parent
426f3e5642
commit
437456bebb
117
.github/readme-generate.js
vendored
117
.github/readme-generate.js
vendored
|
@ -1,9 +1,11 @@
|
||||||
const { readdir, writeFile, stat } = require('fs/promises');
|
const { readdir, writeFile, stat } = require('fs/promises');
|
||||||
const fs = require('fs').promises;
|
const fs = require('fs').promises;
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
const README_PATH = './README.md';
|
const README_PATH = './README.md';
|
||||||
|
|
||||||
const MKDOCS_PATH = 'mkdocs.yml';
|
const MKDOCS_PATH = 'mkdocs.yml';
|
||||||
|
const dishesFolder = 'dishes';
|
||||||
|
const starsystemFolder = 'starsystem';
|
||||||
|
|
||||||
const ignorePaths = ['.git', 'README.md', 'node_modules', 'CONTRIBUTING.md', '.github'];
|
const ignorePaths = ['.git', 'README.md', 'node_modules', 'CONTRIBUTING.md', '.github'];
|
||||||
|
|
||||||
|
@ -60,12 +62,77 @@ const categories = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
async function countStars(filename) {
|
||||||
|
const data = await fs.readFile(filename, 'utf-8');
|
||||||
|
let stars = 0;
|
||||||
|
const lines = data.split('\n');
|
||||||
|
lines.forEach(line => {
|
||||||
|
stars += (line.match(/★/g) || []).length;
|
||||||
|
});
|
||||||
|
return stars;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function organizeByStars(dishesFolder, starsystemFolder) {
|
||||||
|
const dishes = {};
|
||||||
|
|
||||||
|
async function processFolder(folderPath) {
|
||||||
|
const files = await readdir(folderPath);
|
||||||
|
for (const filename of files) {
|
||||||
|
const filepath = path.join(folderPath, filename);
|
||||||
|
const fileStat = await stat(filepath);
|
||||||
|
if (fileStat.isFile() && filename.endsWith('.md')) {
|
||||||
|
const stars = await countStars(filepath);
|
||||||
|
dishes[filepath] = stars;
|
||||||
|
} else if (fileStat.isDirectory()) {
|
||||||
|
await processFolder(filepath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const dishesFolderAbs = path.resolve(dishesFolder);
|
||||||
|
const starsystemFolderAbs = path.resolve(starsystemFolder);
|
||||||
|
|
||||||
|
if (!await fs.access(starsystemFolderAbs).then(() => true).catch(() => false)) {
|
||||||
|
await fs.mkdir(starsystemFolderAbs, { recursive: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!await fs.access(dishesFolderAbs).then(() => true).catch(() => false)) {
|
||||||
|
console.log(`Directory not found: ${dishesFolderAbs}, creating directory...`);
|
||||||
|
await fs.mkdir(dishesFolderAbs, { recursive: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
await processFolder(dishesFolderAbs);
|
||||||
|
|
||||||
|
const starRatings = Array.from(new Set(Object.values(dishes))).sort((a, b) => b - a);
|
||||||
|
const navigationLinks = [];
|
||||||
|
|
||||||
|
for (const stars of starRatings) {
|
||||||
|
const starsFile = path.join(starsystemFolderAbs, `${stars}Star.md`);
|
||||||
|
const content = [`# Dishes with ${stars} Stars`, ''];
|
||||||
|
for (const [filepath, starCount] of Object.entries(dishes)) {
|
||||||
|
if (starCount === stars) {
|
||||||
|
const relativePath = path.relative(starsystemFolderAbs, filepath).replace(/\\/g, '/');
|
||||||
|
content.push(`* [${path.basename(filepath, '.md')}](./${relativePath})`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await writeFile(starsFile, content.join('\n'), 'utf-8');
|
||||||
|
navigationLinks.push(`- [${stars} Star Dishes](${path.relative(path.dirname(README_PATH), starsFile).replace(/\\/g, '/')})`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return navigationLinks;
|
||||||
|
}
|
||||||
|
|
||||||
async function main() {
|
async function main() {
|
||||||
try {
|
try {
|
||||||
let README_BEFORE = (README_MAIN = README_AFTER = '');
|
let README_BEFORE = '', README_MAIN = '', README_AFTER = '';
|
||||||
let MKDOCS_BEFORE = (MKDOCS_MAIN = MKDOCS_AFTER = '');
|
let MKDOCS_BEFORE = '', MKDOCS_MAIN = '', MKDOCS_AFTER = '';
|
||||||
const markdownObj = await getAllMarkdown('.');
|
const markdownObj = await getAllMarkdown('.');
|
||||||
|
|
||||||
|
// Debug logging to understand the structure of markdownObj
|
||||||
|
console.log("Markdown Object Structure:", JSON.stringify(markdownObj, null, 2));
|
||||||
|
|
||||||
for (const markdown of markdownObj) {
|
for (const markdown of markdownObj) {
|
||||||
|
console.log("Processing markdown:", markdown);
|
||||||
if (markdown.path.includes('tips/advanced')) {
|
if (markdown.path.includes('tips/advanced')) {
|
||||||
README_AFTER += inlineReadmeTemplate(markdown.file, markdown.path);
|
README_AFTER += inlineReadmeTemplate(markdown.file, markdown.path);
|
||||||
MKDOCS_AFTER += inlineMkdocsTemplate(markdown.file, markdown.path);
|
MKDOCS_AFTER += inlineMkdocsTemplate(markdown.file, markdown.path);
|
||||||
|
@ -94,18 +161,36 @@ async function main() {
|
||||||
MKDOCS_MAIN += categoryMkdocsTemplate(category.title, category.mkdocs);
|
MKDOCS_MAIN += categoryMkdocsTemplate(category.title, category.mkdocs);
|
||||||
}
|
}
|
||||||
|
|
||||||
const MKDOCS_TEMPLATE = await fs.readFile("./.github/templates/mkdocs_template.yml", "utf-8");
|
let MKDOCS_TEMPLATE;
|
||||||
const README_TEMPLATE = await fs.readFile("./.github/templates/readme_template.md", "utf-8");
|
let README_TEMPLATE;
|
||||||
|
|
||||||
|
try {
|
||||||
|
MKDOCS_TEMPLATE = await fs.readFile("./.github/templates/mkdocs_template.yml", "utf-8");
|
||||||
|
} catch (error) {
|
||||||
|
MKDOCS_TEMPLATE = `site_name: My Docs\nnav:\n {{main}}\n`;
|
||||||
|
console.warn("mkdocs_template.yml not found, using default template");
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
README_TEMPLATE = await fs.readFile("./.github/templates/readme_template.md", "utf-8");
|
||||||
|
} catch (error) {
|
||||||
|
README_TEMPLATE = `# My Project\n\n{{before}}\n\n{{main}}\n\n{{after}}`;
|
||||||
|
console.warn("readme_template.md not found, using default template");
|
||||||
|
}
|
||||||
|
|
||||||
|
const navigationLinks = await organizeByStars(dishesFolder, starsystemFolder);
|
||||||
|
// Debug logging to ensure navigationLinks is defined and contains data
|
||||||
|
console.log("Navigation Links:", navigationLinks);
|
||||||
|
const navigationSection = `\n## Navigation\n\n${navigationLinks.join('\n')}`;
|
||||||
|
|
||||||
await writeFile(
|
await writeFile(
|
||||||
README_PATH,
|
README_PATH,
|
||||||
README_TEMPLATE
|
README_TEMPLATE
|
||||||
.replace('{{before}}', README_BEFORE.trim())
|
.replace('{{before}}', README_BEFORE.trim())
|
||||||
.replace('{{main}}', README_MAIN.trim())
|
.replace('{{main}}', README_MAIN.trim())
|
||||||
.replace('{{after}}', README_AFTER.trim()),
|
.replace('{{after}}', README_AFTER.trim())+ navigationSection,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
await writeFile(
|
await writeFile(
|
||||||
MKDOCS_PATH,
|
MKDOCS_PATH,
|
||||||
MKDOCS_TEMPLATE
|
MKDOCS_TEMPLATE
|
||||||
|
@ -113,29 +198,25 @@ async function main() {
|
||||||
.replace('{{main}}', MKDOCS_MAIN)
|
.replace('{{main}}', MKDOCS_MAIN)
|
||||||
.replace('{{after}}', MKDOCS_AFTER),
|
.replace('{{after}}', MKDOCS_AFTER),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Organize files by star rating
|
||||||
|
//await organizeByStars(dishesFolder, starsystemFolder);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(error);
|
console.error(error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getAllMarkdown(path) {
|
async function getAllMarkdown(dir) {
|
||||||
const paths = [];
|
const paths = [];
|
||||||
const files = await readdir(path);
|
const files = await readdir(dir);
|
||||||
// chinese alphabetic order
|
|
||||||
files.sort((a, b) => a.localeCompare(b, 'zh-CN'));
|
files.sort((a, b) => a.localeCompare(b, 'zh-CN'));
|
||||||
|
|
||||||
// mtime order
|
|
||||||
// files.sort(async (a, b) => {
|
|
||||||
// const aStat = await stat(`${path}/${a}`);
|
|
||||||
// const bStat = await stat(`${path}/${b}`);
|
|
||||||
// return aStat.mtime - bStat.mtime;
|
|
||||||
// });
|
|
||||||
for (const file of files) {
|
for (const file of files) {
|
||||||
const filePath = `${path}/${file}`;
|
const filePath = path.join(dir, file);
|
||||||
if (ignorePaths.includes(file)) continue;
|
if (ignorePaths.includes(file)) continue;
|
||||||
const fileStat = await stat(filePath);
|
const fileStat = await stat(filePath);
|
||||||
if (fileStat.isFile() && file.endsWith('.md')) {
|
if (fileStat.isFile() && file.endsWith('.md')) {
|
||||||
paths.push({ path, file });
|
paths.push({ path: dir, file });
|
||||||
} else if (fileStat.isDirectory()) {
|
} else if (fileStat.isDirectory()) {
|
||||||
const subFiles = await getAllMarkdown(filePath);
|
const subFiles = await getAllMarkdown(filePath);
|
||||||
paths.push(...subFiles);
|
paths.push(...subFiles);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user