on master help sign in
12 files changed+238−106
since splitsnapshots
unifiedsplit
.github/ISSUE_TEMPLATE/name-of-website.md+9 404.html+18 LICENSE+21 README.md+17−8 index.html+6−24 links/fonts.css+15 links/main.css+19 media/fonts/input_mono_medium.ttf media/fonts/input_mono_regular.ttf portal.js−74 scripts/portal.js+63 scripts/sites.js+70
.github/ISSUE_TEMPLATE/name-of-website.mdnew file+9
@@ -0,0 +1,9 @@
1+---
2+name: name.of.website
3+about: Describe this issue template's purpose here.
4+
5+---
6+
7+```
8+Position of webring icon on site: ex: footer, header
9+```
404.htmlnew file+18
@@ -0,0 +1,18 @@
1+---
2+permalink: /404.html
3+---
4+<!DOCTYPE html>
5+<html lang="en">
6+<head>
7+ <meta charset="utf-8">
8+ <title>Loading..</title>
9+</head>
10+<body style='background:black'>
11+ <script>
12+ const parts = window.location.pathname.split("/")
13+ const target = parts.slice(-1);
14+ parts.splice(-1)
15+ document.location.href = parts.join("/")+"/#"+target
16+ </script>
17+</body>
18+</html>
LICENSEnew file+21
@@ -0,0 +1,21 @@
1+MIT License
2+
3+Copyright (c) 2018 Devine Lu Linvega
4+
5+Permission is hereby granted, free of charge, to any person obtaining a copy
6+of this software and associated documentation files (the "Software"), to deal
7+in the Software without restriction, including without limitation the rights
8+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+copies of the Software, and to permit persons to whom the Software is
10+furnished to do so, subject to the following conditions:
11+
12+The above copyright notice and this permission notice shall be included in all
13+copies or substantial portions of the Software.
14+
15+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+SOFTWARE.
README.md+17−8
@@ -1,25 +1,34 @@
11# Webring
22
3−This [webring](http://wiki.xxiivv.com/webring) is an attempt to inspire artists and developers to create and maintain their own website and share traffic among each other.
4−
5−The webring's aim is to share personal websites such as diaries, wikis, bookmark lists, portfolios. To add yourself to the ring, submit a [pull request](https://github.com/XXIIVV/webring/edit/master/index.html) to this repository.
3+This [webring](https://wiki.xxiivv.com/webring) is an attempt to inspire artists & developers to create and maintain their own website and share traffic among each other. The webring's aim is to share hand-crafted websites such as **diaries, wikis & portfolios**, single pagers with nothing but outgoing links to social platforms will be rejected. To add yourself to the ring, submit an [edit](https://github.com/XXIIVV/webring/edit/master/scripts/sites.js) to this repository.
64
75## Join the webring
86
9−Add your website url to the [index.html](https://github.com/XXIIVV/webring/edit/master/index.html), and add the webring icon to your website html. Alternatively, if you your website has a dark background, use `icon.white.svg`. If your website is complaning about *https*, go ahead and host the icon yourself.
10−
117```
12−<a href='http://webring.xxiivv.com/#random' target='_blank'><img src='http://webring.xxiivv.com/icon.black.svg'/></a>
8+<a href='https://webring.xxiivv.com/#random' target='_blank'><img src='https://webring.xxiivv.com/icon.black.svg'/></a>
139```
1410
11+- Add the webring icon to your website html.
12+- Add your website url to the [sites.js](https://github.com/XXIIVV/webring/edit/master/scripts/sites.js) file.
13+- Submit a Pull Request with the location of the webring icon on your site.
14+
15+Alternatively, if you your website has a dark background, use `icon.white.svg`. If your website is complaning about *https*, go ahead and host the icon yourself.
16+
1517### Circular Linking
1618
1719Instead of linking to the directory, you can also link to the next link in the ring by adding parts of your site or domain in the hash of the request url:
1820
1921```
20−<a href='http://webring.xxiivv.com/#wiki.xxiivv' target='_blank'><img src='http://webring.xxiivv.com/icon.black.svg'/></a>
22+<a href='https://webring.xxiivv.com/#wiki.xxiivv' target='_blank'><img src='https://webring.xxiivv.com/icon.black.svg'/></a>
2123```
2224
25+## API
26+
27+This repository does not contain mature API capabilities, but there is one way to request list of sites currently in the webring.
28+
29+- Request [sites.js on xxiivv](https://webring.xxiivv.com/scripts/sites.js) or [sites.js on github](https://raw.githubusercontent.com/XXIIVV/webring/master/scripts/sites.js)
30+- Parse it as text from `[` to `]`, split by `,` and then trim all whitespace and `"` in resulting array.
31+
2332## Need Help?
2433
25−The ring master is [@neauoire](http://twitter.com/neauoire), but any member of the network is also welcome to join this repository as a collaborator to help manage new links and Pull Requests. Read more [here](http://wiki.xxiivv.com/webring).
34+The ring is managed by [@neauoire](https://twitter.com/neauoire), but any member of the network is also welcome to join this repository as a collaborator to help manage new links and Pull Requests. Read more [here](https://wiki.xxiivv.com/webring).
index.html+6−24
@@ -3,35 +3,17 @@
33<head>
44 <meta charset="utf-8">
55 <meta name="viewport" content="width=device-width, initial-scale=1.0">
6− <script src="portal.js"></script>
6+ <link rel="stylesheet" type="text/css" href="links/fonts.css"/>
7+ <link rel="stylesheet" type="text/css" href="links/main.css"/>
8+ <script src="scripts/portal.js"></script>
9+ <script src="scripts/sites.js"></script>
710 <title>Webring</title>
811</head>
912<body>
1013 <script>
11− // protocole://url.domain.ext/
12− var sites = [
13− "https://wiki.xxiivv.com/",
14− "http://estevancarlos.com/",
15− "https://electro.pizza/",
16− "http://xla.wiki/",
17− "https://monochromatic.co/",
18− "https://joshavanier.github.io/",
19− "http://kaemura.com/",
20− "https://liamcooke.com/",
21− "https://electricgecko.de/",
22− "https://wichniow.ski/",
23− "https://hraew.autophagy.io/",
24− "https://anxl.faith",
25− "https://xvw.github.io"
26− // Don't forget the comma!
27− ]
28− var portal = new Portal(sites);
14+ const portal = new Portal(sites);
15+ portal.install(document.body);
2916 portal.start();
3017 </script>
31− <style>
32− body { background:#eee; padding:30px; }
33− body a { color:#000; display: inline-block; padding:0px 5px; line-height: 20px}
34− body a:hover { color:#eee; background:#000; text-decoration: none; }
35− </style>
3618</body>
3719</html>
links/fonts.cssnew file+15
@@ -0,0 +1,15 @@
1+/* Input Mono */
2+
3+@font-face {
4+ font-family: 'input_mono_regular';
5+ src: url('../media/fonts/input_mono_regular.ttf') format('truetype');
6+ font-weight: normal;
7+ font-style: normal;
8+}
9+
10+@font-face {
11+ font-family: 'input_mono_medium';
12+ src: url('../media/fonts/input_mono_medium.ttf') format('truetype');
13+ font-weight: normal;
14+ font-style: normal;
15+}
links/main.cssnew file+19
@@ -0,0 +1,19 @@
1+* { margin:0;padding:0;border:0;outline:0;text-decoration:none;font-weight:inherit;font-style:inherit;color:inherit;font-size:100%;font-family:inherit;vertical-align:baseline;list-style:none;border-collapse:collapse;border-spacing:0; -webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;}
2+
3+body { background:#f4f4f4; padding:0px; margin:0px; }
4+body div { display:block; background: #ddd;min-height: calc(100vh - 60px);width: calc(100vw - 60px);margin: 15px;color: #555;padding: 15px;font-family:'input_mono_regular', 'Monospaced','Courier New',courier;font-size:11px; position: relative; border-radius: 2px }
5+body div #icon { display: block;width: 30px;height: 30px;background-image: url(../icon.white.svg);background-size: cover;background-repeat: no-repeat;position: absolute;bottom: 10px;right:10px;background-position: center;padding:0px }
6+body div p { display:block; padding:0px 5px; line-height: 20px}
7+body div p a { color:black; text-decoration: none; text-decoration: underline;}
8+body div p a:hover { text-decoration: underline; }
9+body div p b { font-weight: normal; color:#000; font-family: 'input_mono_medium' }
10+body div p.readme { max-width:500px; }
11+body div ul { display:block; max-width: 800px; columns:3; border-bottom: 2px solid white;padding-bottom: 15px;margin-bottom:15px; overflow: hidden;}
12+body div ul li { width: 22em; display:block; padding-left:5px; overflow: hidden; text-overflow: ellipsis; }
13+body div ul li a { line-height: 20px; display: inline-block; color:#000; padding:0px 5px; text-decoration: none;}
14+body div ul li a:visited { color:#999; text-decoration: none;}
15+body div ul li a:hover { background:#ccc; color:#000; text-decoration: none; border-radius: 2px }
16+
17+@media (max-width: 950px){
18+ body div ul { columns: 2 }
19+}
media/fonts/input_mono_medium.ttfnew file

Binary file not shown.

media/fonts/input_mono_regular.ttfnew file

Binary file not shown.

portal.jsdeleted−74
@@ -1,74 +0,0 @@
1−function Portal(sites)
2−{
3− this.el = document.createElement("pre");
4− this.sites = sites;
5−
6− this.install = function()
7− {
8− document.body.appendChild(this.el);
9− }
10−
11− this.start = function()
12− {
13− this.install();
14− this.el.innerHTML = window.location.hash ? this.redirect() : this.directory();
15− }
16−
17− this.directory = function()
18− {
19− var html = ""
20−
21− for(id in this.sites){
22− var site = this.sites[id]
23− html += `${id}) <a href='${site}'>${site}</a>\n`
24− }
25− html += `\n<a href='#random' onClick="portal.reload('random')">Random</a> | <a href='https://github.com/XXIIVV/webring'>Information</a>`
26−
27− return html
28− }
29−
30− this.reload = function()
31− {
32− setTimeout(()=>{ window.location.reload() },500)
33− }
34−
35− this.location = function()
36− {
37− return window.location.hash.replace("#","").trim();
38− }
39−
40− this.locate = function()
41− {
42− var hash = this.location();
43−
44− if(hash == "random"){
45− return Math.floor(Math.random()*this.sites.length)
46− }
47−
48− for(var id in this.sites){
49− var site = this.sites[id];
50− if(site.indexOf(hash) >-1){
51− return parseInt(id)
52− }
53− }
54− return -1
55− }
56−
57− this.next = function(loc)
58− {
59− return loc == this.sites.length-1 ? this.sites[0] : this.sites[loc+1];
60− }
61−
62− this.redirect = function()
63− {
64− var location = this.locate();
65− var target = this.next(location);
66−
67− var html = ""
68−
69− html = `Redirecting to ${target}
70− <meta http-equiv="refresh" content="3; url=${target}">
71−<a href='' onClick="window.location.reload()">Directory</a> | <a href='#${target}' onClick="portal.reload('random')">Skip</a> | <a href='#random' onClick="portal.reload('random')">Random</a> | <a href='https://github.com/XXIIVV/webring'>Information</a>`
72− return html
73− }
74−}
scripts/portal.jsnew file+63
@@ -0,0 +1,63 @@
1+'use strict'
2+
3+function Portal (sites) {
4+ this.el = document.createElement('div')
5+ this.sites = sites
6+
7+ // Templates
8+
9+ function _readme () {
10+ return `<p class='readme'>This webring is an attempt to inspire artists & developers to build their own website and share traffic among each other. The ring welcomes personalized websites such as <b>diaries, wikis & portfolios</b>.</p><p>To add yourself to the ring, submit a <a href='https://github.com/XXIIVV/webring/edit/master/scripts/sites.js' target='_blank'>Pull Request</a>.<br />If you found a broken link, please <a href='https://github.com/XXIIVV/webring/issues/new' target='_blank'>report it</a>.</p>`
11+ }
12+
13+ function _buttons () {
14+ return `<p class='buttons'><a href='#random' onClick="portal.reload('random')">Random</a> | <a href='https://github.com/XXIIVV/webring'>Information</a> <a id='icon' href='#random' onClick="portal.reload('random')"></a></p>`
15+ }
16+
17+ function _directory (sites) {
18+ return `
19+ <ul>${sites.reduce((acc, val, id) => { return `${acc}<li>${id}) <a href='${val}'>${val.split('//')[1]}</a></li>` }, '')}</ul>\n${_readme()}${_buttons()}`
20+ }
21+
22+ function _redirect (target) {
23+ return `<p>Redirecting to <b>${target}</b></p><meta http-equiv="refresh" content="3; url=${target}">
24+ <p class='buttons'><a href='#' onClick="portal.reload('')">Directory</a> | <a href='#${target}' onClick="portal.reload('random')">Skip</a> | <a href='#random' onClick="portal.reload('random')">Random</a> | <a href='https://github.com/XXIIVV/webring'>Information</a> <a id='icon' href='#random' onClick="portal.reload('random')"></a></p>`
25+ }
26+
27+ //
28+
29+ this.install = function (host) {
30+ host.appendChild(this.el)
31+ }
32+
33+ this.start = function () {
34+ this.el.innerHTML = window.location.hash && window.location.hash.length > 4 ? _redirect(this.next()) : _directory(this.sites)
35+ }
36+
37+ this.reload = function () {
38+ setTimeout(() => { window.location.reload() }, 500)
39+ }
40+
41+ this.navigate = function (target) {
42+ setTimeout(() => { window.location.href = target }, 3000)
43+ }
44+
45+ this.locate = function () {
46+ const hash = window.location.hash.replace('#', '').trim()
47+
48+ if (hash == 'random') {
49+ return Math.floor(Math.random() * this.sites.length)
50+ }
51+
52+ for (const id in this.sites) {
53+ if (this.sites[id].indexOf(hash) > -1) {
54+ return parseInt(id)
55+ }
56+ }
57+ return -1
58+ }
59+
60+ this.next = function (loc = this.locate()) {
61+ return loc == this.sites.length - 1 ? this.sites[0] : this.sites[loc + 1]
62+ }
63+}
scripts/sites.jsnew file+70
@@ -0,0 +1,70 @@
1+'use strict';
2+
3+// Don't forget the comma! No trailing slashes
4+// protocole://url.domain.ext
5+
6+const sites = [
7+ "https://wiki.xxiivv.com"
8+ , "http://estevancarlos.com"
9+ , "https://electro.pizza"
10+ , "https://monochromatic.co"
11+ , "https://joshavanier.github.io"
12+ , "http://kaemura.com"
13+ , "https://liamcooke.com"
14+ , "https://electricgecko.de"
15+ , "https://wichniow.ski"
16+ , "https://hraew.autophagy.io"
17+ , "https://evenunto.net"
18+ , "https://anxl.faith"
19+ , "https://xvw.github.io"
20+ , "https://heracl.es"
21+ , "https://felipecortez.net"
22+ , "http://luminghao.com"
23+ , "https://theiceshelf.com"
24+ , "https://turelio.github.io"
25+ , "https://spaceshipsin.space"
26+ , "http://log.lectronice.com"
27+ , "https://craze.co.uk"
28+ , "https://shaneckel.com"
29+ , "https://cblgh.org"
30+ , "https://ellugar.co"
31+ , "http://hur.bet"
32+ , "http://chigby.org"
33+ , "https://longest.voyage"
34+ , "https://palomakop.tv"
35+ , "https://travisshears.com"
36+ , "https://v-os.ca"
37+ , "http://secretinternet.club"
38+ , "https://jmandel.xyz"
39+ , "https://systems.ws"
40+ , "https://jamesin.space"
41+ , "https://nathanwentworth.co"
42+ , "https://eswat.ca"
43+ , "https://uonai.space"
44+ , "http://controls.ee"
45+ , "https://wasin.io"
46+ , "https://inns.studio"
47+ , "http://kokorobot.ca"
48+ , "https://ameyama.com"
49+ , "https://wake.st"
50+ , "https://xarene.la"
51+ , "https://alex.zyzhang.me"
52+ , "http://bildwissenschaft.vortok.info"
53+ , "https://jakofranko.github.com"
54+ , "https://aeriform.io"
55+ , "http://blog.lucasdidthis.com"
56+ , "http://npisanti.com"
57+ , "https://underscorediscovery.ca"
58+ , "https://drisc.io"
59+ , "https://neufv.website"
60+ , "https://simbolo.xyz"
61+ , "https://ricky.codes"
62+ , "https://maxdeviant.com"
63+ , "https://tynandebold.com"
64+ , "http://gytis.co"
65+ , "https://nomand.co"
66+ , "http://memoriata.com"
67+ , "https://mmm.s-ol.nu"
68+ , "https://chad.is"
69+ , "https://smidgeo.com/bots"
70+];