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 %} {{ sponsor.name }} | {% endfor %}
## License
[](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 = ``
-
-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'