initial commit

This commit is contained in:
CJSatnarine
2026-03-16 11:40:50 -04:00
commit f54ed0f4a6
9 changed files with 302 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
3dworldring.cjsatnarine.space

1
README.md Normal file
View File

@@ -0,0 +1 @@
Webring for 3D worlds.

136
data/assets/style.css Normal file
View File

@@ -0,0 +1,136 @@
body {
font-family: sans-serif;
line-height: 1.6;
background-color: #111;
color: #fff;
max-width: 80%;
margin: auto;
}
h1 {
text-align: center;
}
h1,h2,h3,h4 {
font-family: Courier New, Courier, Consolas, monospace;
}
a {
color: #f3c;
text-decoration: none;
background-color: transparent;
}
a:hover, a:focus {
text-decoration: none;
background-color: #f3c;
color: #fff;
}
table {
width: 90%;
border-collapse: collapse;
margin: 12px auto;
font-size: 1em;
}
tr {
margin-bottom: 10px;
}
tr:nth-child(odd) {
background-color: #222; /* Light gray for odd rows */
}
tr:hover {
background-color: #444; /* hover effect for table rows */
}
th, td {
padding: 10px;
border: 2px solid #666;
text-align: left;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
th {
background-color: #444;
text-align: center;
font-size: 1.1em;
font-family: Courier New, Courier, Consolas, monospace;
}
.container {
max-width: 800px;
margin: auto;
padding: 12px;
}
@media screen and (max-width: 600px) {
body {
font-size: 90%;
}
table {
width: 100%;
display: block;
overflow-x: auto;
white-space: nowrap;
}
th, td {
display: block;
text-align: left;
white-space: normal;
}
tr {
display: flex;
flex-direction: column;
}
}
:root {
--card-border: #446868;
--card-link-color: #88bebe;
}
.cards-container {
width: 90%;
margin-left: auto;
margin-right: auto;
}
.cards-container a {
color: var(--card-link-color);
}
.cards {
display: grid;
grid-gap: 0.5rem;
grid-template-columns: repeat(auto-fit, minmax(25rem, 1fr));
}
.card {
border: 2px solid var(--card-border);
border-radius: 0.5rem;
}
.card-name {
background-color: var(--card-border);
font-size: 1.25rem;
padding: 0.25rem;
border-radius: 0.25rem 0.25rem 0 0;
text-transform: lowercase;
}
.card-content {
padding: 0.5rem;
}
.card-link {
font-size: .95rem;
text-transform: lowercase;
}
.card-text {
font-size: 0.75rem;
}
.card-slug {
font-size: 0.75rem;
}

24
data/templates/grid.html Normal file
View File

@@ -0,0 +1,24 @@
<!DOCTYPE html>
<html lang="en">
<link rel="stylesheet" href="./styles.css">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ ring_name }} List</title>
</head>
<body>
<div class="cards-container">
<h1>{{ ring_name }} List</h1>
<p>{{ ring_description }}</p>
<p>Add all sites with declared RSS feeds to your feed reader with this <a href ="{{ opml }}">OPML</a> link.</p>
{{ grid_of_sites | safe }}
<br>
<footer>
<p>Last updated: {{ current_time }} </p>
<p>Powered by <a href="https://github.com/k3rs3d/ringfairy">ringfairy</a>!</p>
</footer>
</div>
</body>
</html>

61
data/templates/index.html Normal file
View File

@@ -0,0 +1,61 @@
<!DOCTYPE html>
<html lang="en">
<link rel="stylesheet" href="./styles.css">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ ring_name }} List</title>
</head>
<body>
<h1>{{ ring_name }} List</h1>
<p>{{ ring_description }}</p>
<p>Add all sites with declared RSS feeds to your feed reader with this <a href ="{{ opml }}">OPML</a> link.</p>
{% if sites %}
<table>
<thead>
<tr>
<th scope="col">Name</th>
<th scope="col">URL</th>
<th scope="col">About</th>
<th scope="col">Owner</th>
</tr>
</thead>
<tbody>
{% for site in sites %}
<tr>
<td>{{ site.website.slug }}</td>
<td>
<a href="{{ site.website.url }}" target="_blank">{{ site.website.url }}</a>
{% if site.website.rss %}
<a href="{{ site.website.rss }}" target="_blank">[rss]</a>
{% endif %}
{% if site.website.atom %}
<a href="{{ site.website.atom }}" target="_blank">[atom]</a>
{% endif %}
</td>
<td>{{ site.website.about | default(value="") }}</td>
<td>{{ site.website.owner | default(value="") }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
{% if failed_sites %}
The following member sites were not included in this iteration of the webring:
<ul>
{% for site in failed_sites %}
<li>{{ site.website.url }}</li>
{% endfor %}
</ul>
{% endif %}
<br>
<footer>
<p>Last updated: {{ current_time }} </p>
<p>Powered by <a href="https://github.com/k3rs3d/ringfairy">ringfairy</a>!</p>
</footer>
</body>
</html>

View File

@@ -0,0 +1,29 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Redirecting...</title>
<style>
body {
background-color: #000;
color: #fff;
}
</style>
</head>
<script>
var links = []
{% if sites %}
{% for site in sites %}
links.push("{{ site.website.url }}")
{% endfor %}
{% endif %}
window.location.replace(links[Math.floor(Math.random() * links.length)])
</script>
<body>
<p>A fairy is guiding you to a most suitable destination...</p>
</body>
</html>

View File

@@ -0,0 +1,18 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="refresh" content="0; url={{ url }}">
<title>Redirecting...</title>
<style>
body {
background-color: #000;
color: #fff;
}
</style>
</head>
<body>
<p>A fairy is teleporting you to <a href="{{ url }}">{{ url }}</a>...!</p>
</body>
</html>

23
ringfairy.toml Normal file
View File

@@ -0,0 +1,23 @@
base_url = "https://3dworldring.cjsatnarine.space"
ring_name = "3dworldring"
ring_description = "Webring for 3D worlds."
ring_owner = "CJ Satnarine"
ring_owner_site = "https://cjsatnarine.space"
filepath_list = ["./websites.json"] # Website list; should be a JSON file with 'name', 'url', etc
path_output = "./3dworldring.cjsatnarine.space" # Generated files will be saved in this folder.
path_assets = "./data/assets" # All contents of the asset folder will be copied directly into the output directory
path_templates = "./data/templates" # The folder containing HTML templates to use, ie, anything with {{ tags }}
filename_template_random = "random.html"
filename_template_redirect = "redirect.html" # This template gets reused to build the redirect pages for each site, and is ignored when building the other custom templates
client_user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36"
client_header = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
audit_retries_delay = 100
audit_retries_max = 2
shuffle = false # Randomizes website sequence when generating
verbose = false # Enables verbose logging
skip_minify = false # If your generated HTML have issues, or you want hand-editable output, try skip minification
skip_verify = false # Skips verification of the URLs in the list. Might be unwise!
dry_run = false # Perform a dry run without writing any files. Can be used to check the site audit for example.

9
websites.json Normal file
View File

@@ -0,0 +1,9 @@
[
{
"name": "The Study",
"slug": "cjsatnarine_study",
"url": "https://study.cjsatnarine.space",
"about": "a little study",
"owner": "CJSatnarine"
}
]