diff options
| author | soaos <soaos@soaos.dev> | 2026-04-03 16:06:30 -0400 |
|---|---|---|
| committer | soaos <soaos@soaos.dev> | 2026-04-03 16:06:30 -0400 |
| commit | c421139ea893ea0e2f68d23620dd3d91b6feecbe (patch) | |
| tree | f92222942f18ad84e8cdb6ab0cfde189087ec70b | |
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | README.md | 3 | ||||
| -rw-r--r-- | data/assets/styles.css | 136 | ||||
| -rw-r--r-- | data/templates/grid.html | 23 | ||||
| -rw-r--r-- | data/templates/index.html | 60 | ||||
| -rw-r--r-- | data/templates/random.html | 29 | ||||
| -rw-r--r-- | data/templates/redirect.html | 18 | ||||
| -rw-r--r-- | ringfairy.toml | 23 | ||||
| -rw-r--r-- | websites.json | 37 |
9 files changed, 330 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e52f310 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +webring diff --git a/README.md b/README.md new file mode 100644 index 0000000..73e9fe1 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# EVILRING + +An evil webring for evil creatures diff --git a/data/assets/styles.css b/data/assets/styles.css new file mode 100644 index 0000000..4ff8fec --- /dev/null +++ b/data/assets/styles.css @@ -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; +} + diff --git a/data/templates/grid.html b/data/templates/grid.html new file mode 100644 index 0000000..2c187b1 --- /dev/null +++ b/data/templates/grid.html @@ -0,0 +1,23 @@ +<!DOCTYPE html> +<html lang="en"> + <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> diff --git a/data/templates/index.html b/data/templates/index.html new file mode 100644 index 0000000..e7f6503 --- /dev/null +++ b/data/templates/index.html @@ -0,0 +1,60 @@ +<!DOCTYPE html> +<html lang="en"> + <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> diff --git a/data/templates/random.html b/data/templates/random.html new file mode 100644 index 0000000..b4a5816 --- /dev/null +++ b/data/templates/random.html @@ -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> diff --git a/data/templates/redirect.html b/data/templates/redirect.html new file mode 100644 index 0000000..0ae260d --- /dev/null +++ b/data/templates/redirect.html @@ -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> diff --git a/ringfairy.toml b/ringfairy.toml new file mode 100644 index 0000000..a9adbef --- /dev/null +++ b/ringfairy.toml @@ -0,0 +1,23 @@ +base_url = "https://evilr.ing" +ring_name = "EVILRING" +ring_description = "An evil webring for evil creatures" +ring_owner = "soaos" +ring_owner_site = "https://soaos.dev" + +filepath_list = ["./websites.json"] # Website list; should be a JSON file with 'name', 'url', etc +path_output = "./webring" # 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. diff --git a/websites.json b/websites.json new file mode 100644 index 0000000..ea167ab --- /dev/null +++ b/websites.json @@ -0,0 +1,37 @@ +[ + { + "name": "soaos", + "slug": "soaos", + "about": "soaos", + "url": "https://soaos.dev", + "owner": "soaos" + }, + { + "name": "Briana", + "slug": "bburton", + "about": "Briana Burton | Software Dev", + "url": "https://briana.cc", + "owner": "Briana Burton" + }, + { + "name": "cjsatnarine", + "slug": "cjsatnarine", + "about": "cjsatnarine", + "url": "https://cjsatnarine.space", + "owner": "CJ Satnarine" + }, + { + "name": "oliver-gi", + "slug": "oliver-gi", + "about": "Oliver Gingerich", + "url": "https://oliver-gi.github.io", + "owner": "Oliver Gingerich" + }, + { + "name": "hyperlisk", + "slug": "hyperlisk", + "about": "Carter Tomlenovich | Information SuperCenter / Random Hyperfocuses", + "url": "https://hyperlisk.ca", + "owner": "Carter Tomlenovich" + } +] |