Merge pull request #1513 from MunGell/templating-workflow

Replace current README GitHub workflow script with a templating one
This commit is contained in:
Sammy Hori
2024-11-17 22:11:32 +00:00
committed by GitHub
4 changed files with 52 additions and 96 deletions

View File

@@ -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 %})_ <br> {{ entry.description }}{% endfor %}
{% endfor %}
## Contribute
@@ -18,10 +21,11 @@ Contributions are welcome! See the [contributing guidelines](CONTRIBUTING.md).
## Thanks to GitHub Sponsors
<% sponsors %>
<table><tr>{% for sponsor in sponsors %}{% if loop.index != 1 and (loop.index - 1) % 6 == 0 %}</tr><tr>{% endif %}<td align="center"><a href="{{ sponsor.link }}"><img src="{{ sponsor.image }}" width="60px;" alt=""/><br/><sub><b>{{ sponsor.name }}</b></sub></a></td>{% endfor %}</tr></table>
## 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.

View File

@@ -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'})_ <br> ${repo.description}`).join('\n')
return `## ${category}\n\n${repos}\n`
}).join('\n');
const sponsorList = data.sponsors.map(sponsor => `<td align="center"><a href="${sponsor.link}"><img src="${sponsor.image}" width="60px;" alt=""/><br/><sub><b>${sponsor.name}</b></sub></a></td>`)
const sponsorRows = Math.ceil(sponsorList.length / 6);
let sponsors = '';
for (let i = 1; i <= sponsorRows; i++) {
sponsors += '<tr>';
for(let j = 0; j < 6; j++) {
if (sponsorList.length > i*j) {
sponsors += sponsorList[i*j];
} else if (sponsorRows > 1) {
sponsors += '<td></td>'
}
}
sponsors += '</tr>';
}
sponsors = `<table>${sponsors}</table>`
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;
}

40
.github/scripts/render-readme.py vendored Executable file
View File

@@ -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)

View File

@@ -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'