mirror of
https://github.com/MunGell/awesome-for-beginners.git
synced 2026-01-26 13:28:11 -08:00
Compare commits
1 Commits
b79872f83d
...
d65a251fcf
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d65a251fcf |
87
.github/scripts/build.js
vendored
Normal file
87
.github/scripts/build.js
vendored
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
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
40
.github/scripts/render-readme.py
vendored
@@ -1,40 +0,0 @@
|
|||||||
from jinja2 import Environment, FileSystemLoader
|
|
||||||
import json
|
|
||||||
|
|
||||||
DATAFILE = "./data.json"
|
|
||||||
TEMPLATEPATH = "./.github/"
|
|
||||||
TEMPLATEFILE = "README-template.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)
|
|
||||||
14
.github/README-template.j2 → .github/tpl.md
vendored
14
.github/README-template.j2 → .github/tpl.md
vendored
@@ -7,13 +7,10 @@ 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.
|
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:
|
## Table of Contents:
|
||||||
{% for category in categories %}
|
|
||||||
- [{{ category.title }}](#{{ category.link_id }}){% endfor %}
|
<% toc %>
|
||||||
{% for category in categories %}
|
|
||||||
## {{ category.title }}
|
<% content %>
|
||||||
{% 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
|
## Contribute
|
||||||
|
|
||||||
@@ -21,11 +18,10 @@ Contributions are welcome! See the [contributing guidelines](CONTRIBUTING.md).
|
|||||||
|
|
||||||
## Thanks to GitHub Sponsors
|
## Thanks to GitHub 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>
|
<% sponsors %>
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
[](http://creativecommons.org/publicdomain/zero/1.0/)
|
[](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.
|
To the extent possible under law, the author has waived all copyrights and related or neighboring rights to this work.
|
||||||
|
|
||||||
7
.github/workflows/build.yml
vendored
7
.github/workflows/build.yml
vendored
@@ -13,10 +13,11 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- name: install jinja2
|
- uses: actions/setup-node@v2
|
||||||
run: sudo pip install jinja2
|
with:
|
||||||
|
node-version: "16.x"
|
||||||
- name: Build
|
- name: Build
|
||||||
run: python3 .github/scripts/render-readme.py
|
run: node .github/scripts/build.js
|
||||||
- name: Commit
|
- name: Commit
|
||||||
run: |
|
run: |
|
||||||
git config --global user.name 'Shmavon Gazanchyan'
|
git config --global user.name 'Shmavon Gazanchyan'
|
||||||
|
|||||||
@@ -350,7 +350,6 @@ If you are not a programmer but would like to contribute, check out the [Awesome
|
|||||||
- [Sniffnet](https://github.com/GyulyVGC/sniffnet) _(label: good first issue)_ <br> Application to comfortably monitor network traffic.
|
- [Sniffnet](https://github.com/GyulyVGC/sniffnet) _(label: good first issue)_ <br> Application to comfortably monitor network traffic.
|
||||||
- [TiKV](https://github.com/tikv/tikv) _(label: difficulty/easy)_ <br> A distributed transactional key-value database
|
- [TiKV](https://github.com/tikv/tikv) _(label: difficulty/easy)_ <br> A distributed transactional key-value database
|
||||||
- [Veloren](https://gitlab.com/veloren/veloren/-/issues?label_name[]=beginner) _(label: n/a)_ <br> Veloren is a multiplayer voxel RPG written in Rust.
|
- [Veloren](https://gitlab.com/veloren/veloren/-/issues?label_name[]=beginner) _(label: n/a)_ <br> Veloren is a multiplayer voxel RPG written in Rust.
|
||||||
- [zoom-rs](https://github.com/security-union/zoom-rs) _(label: good first issue)_ <br> Teleconference system with a web based user interface written in Rust
|
|
||||||
|
|
||||||
## Scala
|
## Scala
|
||||||
|
|
||||||
|
|||||||
11
data.json
11
data.json
@@ -2219,15 +2219,6 @@
|
|||||||
"Pug"
|
"Pug"
|
||||||
],
|
],
|
||||||
"description": "An inventory of tools and resources that aims to help people to find everything related to CyberSecurity."
|
"description": "An inventory of tools and resources that aims to help people to find everything related to CyberSecurity."
|
||||||
},
|
}
|
||||||
{
|
|
||||||
"name": "zoom-rs",
|
|
||||||
"link": "https://github.com/security-union/zoom-rs",
|
|
||||||
"label": "good first issue",
|
|
||||||
"technologies": [
|
|
||||||
"Rust"
|
|
||||||
],
|
|
||||||
"description": "Teleconference system with a web based user interface written in Rust"
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user