diff --git a/.github/tpl.md b/.github/README.j2 similarity index 60% rename from .github/tpl.md rename to .github/README.j2 index 85fe672..67942e2 100644 --- a/.github/tpl.md +++ b/.github/README.j2 @@ -7,10 +7,13 @@ If you are a maintainer of open-source projects, add the label `first-timers-onl If you are not a programmer but would like to contribute, check out the [Awesome for non-programmers](https://github.com/szabgab/awesome-for-non-programmers) list. ## Table of Contents: - -<% toc %> - -<% content %> +{% for category in categories %} +- [{{ category.title }}](#{{ category.link_id }}){% endfor %} +{% for category in categories %} +## {{ category.title }} +{% for entry in category.entries %} +- [{{ entry.name }}]({{ entry.link }}) _(label: {% if entry.label is defined %}{{ entry.label }}{% else %}n/a{% endif %})_
{{ entry.description }}{% endfor %} +{% endfor %} ## Contribute @@ -18,10 +21,11 @@ Contributions are welcome! See the [contributing guidelines](CONTRIBUTING.md). ## Thanks to GitHub Sponsors -<% sponsors %> +{% for sponsor in sponsors %}{% if loop.index != 1 and (loop.index - 1) % 6 == 0 %}{% endif %}{% endfor %}

{{ sponsor.name }}
## License [![CC0](http://i.creativecommons.org/p/zero/1.0/88x31.png)](http://creativecommons.org/publicdomain/zero/1.0/) To the extent possible under law, the author has waived all copyrights and related or neighboring rights to this work. + diff --git a/.github/scripts/build.js b/.github/scripts/build.js deleted file mode 100644 index cb9d433..0000000 --- a/.github/scripts/build.js +++ /dev/null @@ -1,87 +0,0 @@ -const fs = require('fs'); -const data = require('../../data.json'); - -const TPL_FILE = './.github/tpl.md'; -const TARGET = './README.md'; - -const tpl = getTemplate(TPL_FILE); - -const categories = {}; - -data.repositories.sort((a, b) => { - const nameA = a.name.toUpperCase(); - const nameB = b.name.toUpperCase(); - if (nameA < nameB) { - return -1; - } - if (nameA > nameB) { - return 1; - } - return 0; -}).forEach(repo => - repo.technologies.forEach(tech => { - if (!categories.hasOwnProperty(tech)) { - categories[tech] = []; - } - categories[tech].push(repo); - })) - -const sortedCategories = Object.fromEntries(Object.entries(categories).sort((a, b) => { - const nameA = a[0].toUpperCase(); - const nameB = b[0].toUpperCase(); - if (nameA < nameB) { - return -1; - } - if (nameA > nameB) { - return 1; - } - return 0; -})); - -const toc = Object.keys(sortedCategories) - .map(t => `- [${t}](#${data.technologies[t] || t.toLowerCase()})`) - .join('\n'); - -const content = Object.keys(sortedCategories) - .map(category => { - const repos = sortedCategories[category].map(repo => `- [${repo.name}](${repo.link}) _(label: ${repo.label || 'n/a'})_
${repo.description}`).join('\n') - return `## ${category}\n\n${repos}\n` - }).join('\n'); - -const sponsorList = data.sponsors.map(sponsor => `
${sponsor.name}
`) -const sponsorRows = Math.ceil(sponsorList.length / 6); - -let sponsors = ''; - -for (let i = 1; i <= sponsorRows; i++) { - sponsors += ''; - for(let j = 0; j < 6; j++) { - if (sponsorList.length > i*j) { - sponsors += sponsorList[i*j]; - } else if (sponsorRows > 1) { - sponsors += '' - } - } - sponsors += ''; -} - -sponsors = `${sponsors}
` - -saveFile(TARGET, render(tpl, { toc, content, sponsors })); - -function getTemplate(file) { - return fs.readFileSync(file).toString(); -} - -function saveFile(file, contents) { - return fs.writeFileSync(file, contents); -} - -function render(template, variables) { - Object - .entries(variables) - .forEach(([key, value]) => { - template = template.replace(new RegExp(`<% ${key} %>`, 'g'), value); - }); - return template; -} diff --git a/.github/scripts/render-readme.py b/.github/scripts/render-readme.py new file mode 100755 index 0000000..8f3673d --- /dev/null +++ b/.github/scripts/render-readme.py @@ -0,0 +1,40 @@ +from jinja2 import Environment, FileSystemLoader +import json + +DATAFILE = "./data.json" +TEMPLATEPATH = "./.github/" +TEMPLATEFILE = "README.j2" +TARGETFILE = "./README.md" + +technologies = {} + +with open(DATAFILE, 'r') as datafile: + data = json.loads(datafile.read()) + +for technology in data["technologies"]: + technologies[technology] = {"link_id": data["technologies"][technology], "entries": []} + +for repository in data["repositories"]: + repo_technologies = repository["technologies"] + for repo_technology in repo_technologies: + if not technologies.get(repo_technology, False): + technologies[repo_technology] = {"link_id": repo_technology.lower(), "entries": []} + technologies[repo_technology]["entries"].append(repository) + +env = Environment(loader = FileSystemLoader(TEMPLATEPATH)) + +template = env.get_template(TEMPLATEFILE) + +categories = [] +for key, value in zip(technologies.keys(), technologies.values()): + categories.append({"title": key, "link_id": value["link_id"], "entries": value["entries"]}) + +categories = sorted(categories, key=lambda x: x["title"].upper()) +for category in categories: + category["entries"] = sorted(category["entries"], key=lambda x: x["name"].upper()) + +sponsors = data["sponsors"] + +output = template.render(categories=categories, sponsors=sponsors) + +open(TARGETFILE, "w").write(output) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9ede61e..aaafdcc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -13,11 +13,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: actions/setup-node@v2 - with: - node-version: "16.x" + - name: install jinja2 + run: sudo pip install jinja2 - name: Build - run: node .github/scripts/build.js + run: python3 .github/scripts/render-readme.py - name: Commit run: | git config --global user.name 'Shmavon Gazanchyan'