HowToCook/.github/readme-generate.js

149 lines
4.5 KiB
JavaScript
Raw Normal View History

2022-02-26 10:05:53 +00:00
const { readdir, writeFile, stat } = require('fs/promises');
const ignorePaths = ['.git', 'README.md', 'node_modules', 'CONTRIBUTING.md', '.github'];
const categories = {
2022-03-02 00:08:33 +00:00
'vegetable_dish': {
title: '素菜',
2022-02-26 11:56:53 +00:00
template: '',
2022-02-26 10:05:53 +00:00
},
2022-03-02 00:08:33 +00:00
'meat_dish': {
title: '荤菜',
2022-03-03 10:01:51 +00:00
template: '',
2022-03-02 00:08:33 +00:00
},
2022-02-26 10:05:53 +00:00
breakfast: {
title: '早餐',
2022-02-26 11:56:53 +00:00
template: '',
2022-02-26 10:05:53 +00:00
},
staple: {
title: '主食',
2022-02-26 11:56:53 +00:00
template: '',
2022-02-26 10:05:53 +00:00
},
'semi-finished': {
title: '半成品加工',
2022-02-26 11:56:53 +00:00
template: '',
2022-02-26 10:05:53 +00:00
},
soup: {
title: '汤与粥',
2022-02-26 11:56:53 +00:00
template: '',
2022-02-26 10:05:53 +00:00
},
drink: {
title: '饮料',
2022-02-26 11:56:53 +00:00
template: '',
},
condiment: {
title: '酱料和其它材料',
2022-02-27 06:51:37 +00:00
template: '',
2022-02-26 10:05:53 +00:00
},
dessert: {
title: '甜品',
2022-02-26 11:56:53 +00:00
template: '',
2022-02-26 10:05:53 +00:00
},
};
let README_TEMPLATE = `# 程序员做饭指南
[![GitHub Workflow Status (branch)](https://img.shields.io/github/workflow/status/Anduin2017/HowToCook/Continuous%20Integration/master)](https://github.com/Anduin2017/HowToCook/actions/workflows/ci.yml)
[![License](https://img.shields.io/github/license/Anduin2017/HowToCook)](./LICENSE)
[![GitHub contributors](https://img.shields.io/github/contributors/Anduin2017/HowToCook)](https://github.com/Anduin2017/HowToCook/graphs/contributors)
最近在家隔离出不了门只能宅在家做饭了作为程序员我偶尔在网上找找菜谱和做法但是这些菜谱往往写法千奇百怪经常中间莫名出来一些材料对于习惯了形式语言的程序员来说极其不友好
所以我计划自己搜寻菜谱和并结合实际做菜的经验准备用更清晰精准的描述来整理常见菜的做法以方便程序员在家做饭
同样我希望它是一个由社区驱动和维护的开源项目使更多人能够一起做一个有趣的仓库所以非常欢迎大家贡献它~
## 如何贡献
针对发现的问题直接修改并提交 Pull request 即可
在写新菜谱时请复制并修改已有的菜谱模板: [示例菜](https://github.com/Anduin2017/HowToCook/blob/master/dishes/template/%E7%A4%BA%E4%BE%8B%E8%8F%9C/%E7%A4%BA%E4%BE%8B%E8%8F%9C.md?plain=1)。
在提交 Pull Request 前更新一下 README.md 里的引用
## 做菜之前
{{before}}
## 菜谱
2022-03-03 15:40:42 +00:00
2022-03-02 00:11:42 +00:00
### 家常菜
2022-02-26 10:05:53 +00:00
{{main}}
## 进阶知识学习
如果你已经做了许多上面的菜对于厨艺已经入门并且想学习更加高深的烹饪技巧请继续阅读下面的内容
{{after}}`;
async function main() {
try {
2022-02-27 06:51:37 +00:00
let BEFORE = (MAIN = AFTER = '');
2022-02-26 10:05:53 +00:00
const markdownObj = await getAllMarkdown('.');
for (const markdown of markdownObj) {
if (markdown.path.includes('tips/advanced')) {
AFTER += inlineTemplate(markdown.file, markdown.path, true);
continue;
}
if (markdown.path.includes('tips')) {
BEFORE += inlineTemplate(markdown.file, markdown.path, true);
continue;
}
for (const category of Object.keys(categories)) {
if (markdown.path.includes(category)) {
2022-02-26 11:56:53 +00:00
let currentCategoryStr = categories[category].template;
2022-02-26 10:05:53 +00:00
currentCategoryStr += inlineTemplate(markdown.file, markdown.path);
2022-02-26 11:56:53 +00:00
categories[category].template = currentCategoryStr;
2022-02-26 10:05:53 +00:00
}
}
}
for (const category of Object.values(categories)) {
2022-02-26 11:56:53 +00:00
MAIN += categoryTemplate(category.title, category.template);
2022-02-26 10:05:53 +00:00
}
2022-02-26 10:31:36 +00:00
2022-02-27 06:51:37 +00:00
await writeFile(
'./README.md',
README_TEMPLATE.replace('{{before}}', BEFORE)
.replace('{{main}}', MAIN)
.replace('{{after}}', AFTER),
);
2022-02-26 10:05:53 +00:00
} catch (error) {
console.error(error);
}
}
async function getAllMarkdown(path) {
const paths = [];
const files = await readdir(path);
2022-02-27 06:51:37 +00:00
// chinese alphabetic order
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;
// });
2022-02-26 10:05:53 +00:00
for (const file of files) {
const filePath = `${path}/${file}`;
if (ignorePaths.includes(file)) continue;
const fileStat = await stat(filePath);
if (fileStat.isFile() && file.endsWith('.md')) {
paths.push({ path, file });
} else if (fileStat.isDirectory()) {
const subFiles = await getAllMarkdown(filePath);
paths.push(...subFiles);
}
}
return paths;
}
function inlineTemplate(file, path) {
return `* [${file.replace('.md', '')}](${path}/${file})\n`;
}
function categoryTemplate(title, inlineStr) {
return `\n### ${title}\n\n${inlineStr}`;
}
main();