From 87d9e3c076a8e52090f4911fb54f51c9b589341f Mon Sep 17 00:00:00 2001 From: Xing Yahao Date: Sat, 26 Feb 2022 19:05:53 +0900 Subject: [PATCH] [ci] Create readme auto generator --- .github/readme-generate.js | 128 ++++++++++++++++++++++++++ .github/workflows/readme-generate.yml | 37 ++++++++ 2 files changed, 165 insertions(+) create mode 100644 .github/readme-generate.js create mode 100644 .github/workflows/readme-generate.yml diff --git a/.github/readme-generate.js b/.github/readme-generate.js new file mode 100644 index 000000000..c4dd5245 --- /dev/null +++ b/.github/readme-generate.js @@ -0,0 +1,128 @@ +const { readdir, writeFile, stat } = require('fs/promises'); + +const ignorePaths = ['.git', 'README.md', 'node_modules', 'CONTRIBUTING.md', '.github']; + +const categories = { + 'home-cooking': { + title: '家常菜', + str: '', + }, + breakfast: { + title: '早餐', + str: '', + }, + staple: { + title: '主食', + str: '', + }, + 'semi-finished': { + title: '半成品加工', + str: '', + }, + soup: { + title: '汤与粥', + str: '', + }, + drink: { + title: '饮料', + str: '', + }, + dessert: { + title: '甜品', + str: '', + }, +}; + +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}} +## 菜谱 +{{main}} +## 进阶知识学习 + +如果你已经做了许多上面的菜,对于厨艺已经入门,并且想学习更加高深的烹饪技巧,请继续阅读下面的内容: + +{{after}}`; + +async function main() { + try { + let BEFORE = ''; + let MAIN = ''; + let AFTER = ''; + 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)) { + let currentCategoryStr = categories[category].str; + currentCategoryStr += inlineTemplate(markdown.file, markdown.path); + categories[category].str = currentCategoryStr; + } + } + } + + for (const category of Object.values(categories)) { + MAIN += categoryTemplate(category.title, category.str); + } + README_TEMPLATE = README_TEMPLATE.replace('{{before}}', BEFORE) + .replace('{{main}}', MAIN) + .replace('{{after}}', AFTER); + await writeFile('./README.md', README_TEMPLATE); + } catch (error) { + console.error(error); + } +} + +async function getAllMarkdown(path) { + const paths = []; + const files = await readdir(path); + 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(); diff --git a/.github/workflows/readme-generate.yml b/.github/workflows/readme-generate.yml new file mode 100644 index 000000000..9246c4c4 --- /dev/null +++ b/.github/workflows/readme-generate.yml @@ -0,0 +1,37 @@ +name: Readme Generate + +on: + push: + branches: + - '*' + - '*/*' + - '**' + - '!master' + pull_request: + branches: + - '*' + - '*/*' + - '**' + - '!master' + workflow_dispatch: + +jobs: + readme-gen: + runs-on: ubuntu-latest + # if: github.repository_owner == 'Anduin2017' + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: "16" + cache: "npm" + - run: npm install + - run: node ./.github/readme-gen.js + - uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: "[ci skip] Automatic generate readme" + branch: "master" + file_pattern: ":/*.md" + commit_user_name: github-actions[bot] + commit_user_email: github-actions[bot]@users.noreply.github.com + commit_author: github-actions[bot]