on master help sign in
Merge pull request #312 from ckipp01/feature/languages

Site Languages

commitee91d305e1c032b6fee998f4eb1fddb14d13a9c0 authorЛu Лinveгa <aliceffekt@gmail.com> dateFri 20 Sep 2019, 16:02 (7 years ago) parentb2680b5c187c9a
4 files changed+349−206
README.md+18−3 links/main.css+3−2 scripts/portal.js+55−30 scripts/sites.js+273−171
README.md+18−3
@@ -9,11 +9,26 @@ This [webring](https://wiki.xxiivv.com/webring) is an attempt to inspire artists
99```
1010
11111) Add the webring icon to your website html.
12−2) Add your website information to the [sites.js](https://github.com/XXIIVV/webring/edit/master/scripts/sites.js) file. The `url` and `contact` keys are required, but you can also include `title`, `type`, `author`, `rss`, and `feed`. The title must be alphanumeric.
12+2) Add your website information to the [sites.js](https://github.com/XXIIVV/webring/edit/master/scripts/sites.js) file. See all options below, and be mindful of what's required for each part of the webring.
13133) Submit a Pull Request with **the location of the webring icon** on your site. Pull requests with blank descriptions will be rejected.
1414
1515Alternatively, if you your website has a dark background, use `icon.white.svg`. If your website is complaining about *https*, go ahead and host the icon yourself.
1616
17+Only the `url`, `contact`, and `langs` keys are required to join the webring. Below you can find a list of all the available keys for the various areas of the webring.
18+```javascript
19+ {
20+ author: <string used in the Hallway REQUIRED FOR HALLWAY>',
21+ contact: <string used to contact if necessary REQUIRED FOR ALL>,
22+ feed: <string url used Hallway REQUIRED FOR HALLWAY>,
23+ langs: <array of iso language codes represented languages in your site ex. ['en'] REQUIRED FOR ALL>,
24+ rss: <string url for rss feed>,
25+ title: <string (must be alphanumeric) used for the Portal>,
26+ type: <string used for the Portal>,
27+ url: <string url used for Portal REQUIRED FOR ALL>,
28+ wiki: <string url used for the Wiki REQUIRED FOR WIKI>
29+ }
30+```
31+
1732### Webring criteria
1833
1934**Single page websites, websites acting only as portals to other social platforms, or websites with violent, racist, sexist or speciesist content will be rejected**.
@@ -34,7 +49,7 @@ Instead of linking to the directory, you can also link to the next link in the r
3449
3550[The Hallway](https://webring.xxiivv.com/hallway.html) is a decentralized forum using [twtxt](https://twtxt.readthedocs.io/en/stable/user/twtxtfile.html) feeds.
3651
37−To join, create a `.txt` file on your site, add its URL to [your webring entry](https://github.com/XXIIVV/Webring/blob/master/scripts/sites.js) as `feed:`, and fill in your desired name for `author:`. The content of the file should be a dateISO string, a tab(or 3 spaces) and a message:
52+To join, create a `.txt` file on your site, add its URL to [your webring entry](https://github.com/XXIIVV/Webring/blob/master/scripts/sites.js) as `feed`, and fill in your desired name in the `author` key. The content of the file should be a dateISO string, a tab(or 3 spaces) and a message:
3853
3954```
40552016-02-04T13:30:00+01:00 You can really go crazy here! ┐(゚∀゚)┌
@@ -49,7 +64,7 @@ You don't need to allow all origins nor allow any other methods rather than GET,
4964
5065[The Wiki](https://webring.xxiivv.com/wiki.html) is a decentralized encyclopedia using [ndtl](https://wiki.xxiivv.com/Indental) feeds.
5166
52−To join, create a `.ndtl` file on your site, and add its URL to [your webring entry](https://github.com/XXIIVV/Webring/blob/master/scripts/sites.js) as `wiki:`.
67+To join, create a `.ndtl` file on your site, and add its URL to [your webring entry](https://github.com/XXIIVV/Webring/blob/master/scripts/sites.js) using the `wiki` key.
5368
5469## Webring CLI
5570
links/main.css+3−2
@@ -16,7 +16,7 @@ body #portal #icon { display: block; width: 30px; height: 30px; background-image
1616body #portal ul { columns:1; }
1717body #portal ul li { display:block; padding-left:5px; text-overflow: ellipsis; text-transform: lowercase;}
1818body #portal ul li:before { content: attr(id) ")"; }
19−body #portal ul li[data-type]::after { content:"<" attr(data-type) ">"; color:#555; }
19+body #portal ul li::after { content:"<" attr(data-type) attr(data-lang) ">"; color:#555; }
2020body #portal ul li a { line-height: 20px; padding:0px 5px; text-decoration: none;}
2121body #portal ul li a:visited { color:#ccc; text-decoration: none;}
2222body #portal a:active,
@@ -25,7 +25,8 @@ body #portal a:hover { text-decoration: underline; }
2525
2626body #portal nav { display: flex; flex-direction: row; margin-bottom: 15px }
2727body #portal nav a { margin: 0 5px; color: gray }
28−body #portal nav a.current { color: white }
28+body #portal nav a.currentType,
29+body #portal nav a.currentLang { color: white }
2930
3031body aside { min-width: 200px; padding: 0 15px; line-height: 16px; display: none; }
3132body aside ul { margin-bottom: 15px; }
scripts/portal.js+55−30
@@ -7,22 +7,26 @@ function Portal (sites) {
77
88 // Templates
99
10− function _readme () {
11− 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>'
12− }
13−
14− function _buttons () {
15− return '<p class="buttons"><a href="#random" onClick="portal.reload()">Random</a> | <a href="https://github.com/XXIIVV/webring">Information</a> <a id="icon" href="#random" onClick="portal.reload()"></a> | <a href="hallway.html">The Hallway</a> | <a href="wiki.html">The Wiki</a> | <a id="opml">OPML</a></p>'
16− }
10+ const _readme = '<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+ const _buttons = '<p class="buttons"><a href="#random" onClick="portal.reload()">Random</a> | <a href="https://github.com/XXIIVV/webring">Information</a> <a id="icon" href="#random" onClick="portal.reload()"></a> | <a href="hallway.html">The Hallway</a> | <a href="wiki.html">The Wiki</a> | <a id="opml">OPML</a></p>'
1712
1813 function _directory (sites) {
1914 const siteTypesArray = [...new Set(sites.map(site => site.type).filter(Boolean))]
15+ const siteLangsArray = [...new Set(sites
16+ .reduce((flattened, site) => flattened.concat(site.langs), [])
17+ .sort())]
18+
2019 const siteTypes = siteTypesArray.reduce((output, siteType) =>
21− `${output}<a data-type="${siteType}" href="#" onclick="toggleType(event)">&lt;${siteType}&gt;</a>`,
22− '<a class="current" href="#" onclick="toggleType(event)">&lt;all&gt;</a>')
20+ `${output}<a data-type="${siteType}" href="#" onclick="filterSites(event)">&lt;${siteType}&gt;</a>`,
21+ '<a class="currentType" data-type="all" href="#" onclick="filterSites(event)">&lt;all&gt;</a>')
22+
23+ const siteLangs = siteLangsArray.reduce((output, siteLang) =>
24+ `${output}<a data-lang="${siteLang}" href="#" onclick="filterSites(event)">&lt;${siteLang}&gt;</a>`,
25+ '<a class="currentLang" data-lang="all" href="#" onclick="filterSites(event)">&lt;all&gt;</a>')
26+
2327 const listItems = sites.reduce((acc, site, id) =>
24− `${acc}<li ${_type(site)} id='${id}'><a href='${site.url}'>${_name(site)}</a></li>`, '')
25− return `<nav>${siteTypes}</nav><main><ul>${listItems}</ul></main><footer>${_readme()}${_buttons()}</footer>`
28+ `${acc}<li ${_type(site)} ${_lang(site)} id='${id}'><a href='${site.url}'>${_name(site)}</a></li>`, '')
29+ return `<nav>${siteTypes}</nav><nav>${siteLangs}</nav><main><ul>${listItems}</ul></main><footer>${_readme}${_buttons}</footer>`
2630 }
2731
2832 function _name (site) {
@@ -30,10 +34,14 @@ function Portal (sites) {
3034 }
3135
3236 function _type (site) {
33− return site.type ? `data-type="${site.type}"` : ''
37+ return site.type ? `data-type="${site.type} "` : ''
38+ }
39+
40+ function _lang (site) {
41+ return `data-lang="${site.langs.join(' ').trim()}"`
3442 }
3543
36− function _redirect (site) {
44+ function _redirectView (site) {
3745 return `<main><p>Redirecting to <a href="${site.url}">${site.url}</a></p></main>
3846 <footer><p class='buttons'><a href='#' onClick="portal.reload('')">Directory</a> | <a href='#${site.url}' onClick="portal.reload()">Skip</a> | <a href='#random' onClick="portal.reload()">Random</a> | <a href='https://github.com/XXIIVV/webring'>Information</a> <a id='icon' href='#random' onClick="portal.reload()"></a></p>`
3947 }
@@ -47,7 +55,7 @@ function Portal (sites) {
4755 this.start = function () {
4856 if (window.location.hash && window.location.hash.length > 4) {
4957 const site = this.next()
50− this.el.innerHTML = _redirect(site)
58+ this.el.innerHTML = _redirectView(site)
5159 setTimeout(() => { window.location = site.url }, 3000)
5260 } else {
5361 this.el.innerHTML = _directory(this.sites)
@@ -62,30 +70,47 @@ function Portal (sites) {
6270 setTimeout(() => { window.location.href = target }, 3000)
6371 }
6472
65− this.locate = function () {
73+ this.sitesMatchingLangs = this.sites
74+ .filter(site => site.langs && site.langs.some(lang => navigator.languages.includes(lang)))
75+
76+ this.next = function () {
6677 const hash = window.location.hash.replace('#', '').trim()
6778
6879 if (hash === 'random') {
69− return Math.floor(Math.random() * this.sites.length)
80+ return this.sitesMatchingLangs[Math.floor(Math.random() * this.sitesMatchingLangs.length)]
7081 } else {
71− const id = sites.findIndex(site => site.url.indexOf(hash) > -1)
72− return id > -1 ? parseInt(id) : -1
82+ return sites.find(site => site.url.includes(hash))
83+ ? sites.find(site => site.url.includes(hash))
84+ : this.sitesMatchingLangs[Math.floor(Math.random() * this.sitesMatchingLangs.length)]
7385 }
7486 }
75−
76− this.next = function (loc = this.locate()) {
77− return loc === this.sites.length - 1 ? this.sites[0] : this.sites[loc + 1]
78− }
7987}
8088
81−function toggleType (e) {
89+function filterSites (e) {
8290 e.preventDefault()
8391 const navLink = e.target
84− const selectedType = navLink.dataset.type
85− document.querySelector('nav a.current').classList.remove('current')
86− navLink.classList.add('current')
87− document.querySelectorAll('main li').forEach(el => { el.style.display = 'block' })
88− if (selectedType) {
89− document.querySelectorAll(`main li:not([data-type='${selectedType}'])`).forEach(el => { el.style.display = 'none' })
90− }
92+ const currentFilter = navLink.dataset.lang ? 'Lang' : 'Type'
93+
94+ document.querySelector(`nav a.current${currentFilter}`).classList.remove(`current${currentFilter}`)
95+ navLink.classList.add(`current${currentFilter}`)
96+
97+ const typeFilter = document.querySelector('nav a.currentType').dataset.type
98+ const langFilter = document.querySelector('nav a.currentLang').dataset.lang
99+
100+ const sites = document.querySelectorAll('main li')
101+ sites.forEach(el => { el.style.display = 'block' })
102+
103+ sites.forEach(el => {
104+ if (typeFilter !== 'all') {
105+ if (el.dataset.type) {
106+ if (el.dataset.type.trim() !== typeFilter) el.style.display = 'none'
107+ } else {
108+ el.style.display = 'none'
109+ }
110+ }
111+
112+ if (langFilter !== 'all') {
113+ if (!el.dataset.lang.includes(langFilter)) el.style.display = 'none'
114+ }
115+ })
91116}
scripts/sites.js+273−171
@@ -5,641 +5,743 @@
55
66const sites = [
77 {
8− url: 'https://wiki.xxiivv.com',
9− title: 'xxiivv',
10− type: 'wiki',
118 author: 'neauoire',
129 contact: 'aliceffekt@gmail.com',
13− rss: 'https://wiki.xxiivv.com/links/rss.xml',
1410 feed: 'https://wiki.xxiivv.com/twtxt.txt',
11+ langs: ['en'],
12+ rss: 'https://wiki.xxiivv.com/links/rss.xml',
13+ title: 'xxiivv',
14+ type: 'wiki',
15+ url: 'https://wiki.xxiivv.com',
1516 wiki: 'https://wiki.xxiivv.com/scripts/database/glossary.ndtl'
1617 },
1718
1819 {
20+ langs: ['en'],
1921 url: 'http://estevancarlos.com'
2022 },
2123
2224 {
23− url: 'https://electro.pizza',
25+ author: 'rho',
26+ feed: 'https://electro.pizza/twtxt.txt',
27+ langs: ['en'],
2428 title: 'electro pizza',
2529 type: 'blog',
26− author: 'rho',
2730 rss: 'https://electro.pizza/feed.xml',
28− feed: 'https://electro.pizza/twtxt.txt'
31+ url: 'https://electro.pizza'
2932 },
3033
3134 {
32− url: 'https://avanier.now.sh',
33− title: 'Arachne',
34− type: 'wiki',
3535 author: 'joshavanier',
3636 contact: 'joshavanier@protonmail.com',
37− feed: 'https://avanier.now.sh/tw.txt'
37+ feed: 'https://avanier.now.sh/tw.txt',
38+ langs: ['en'],
39+ title: 'Arachne',
40+ type: 'wiki',
41+ url: 'https://avanier.now.sh'
3842 },
3943
4044 {
41− url: 'http://kaemura.com',
42− title: 'kaemura.com',
43− type: 'blog',
4445 author: 'kaemura',
4546 contact: 'chimera1190@gmail.com',
46− feed: 'https://kaemura.com/twttxt.txt'
47+ feed: 'https://kaemura.com/twttxt.txt',
48+ langs: ['en'],
49+ title: 'kaemura.com',
50+ type: 'blog',
51+ url: 'http://kaemura.com'
4752 },
4853
4954 {
50− url: 'https://liamcooke.com',
51− title: 'liamcooke.com',
5255 author: 'slisne',
5356 contact: '@slisne@merveilles.town',
57+ feed: 'https://liamcooke.com/merveilles/tw.txt',
58+ langs: ['en'],
59+ title: 'liamcooke.com',
5460 rss: 'https://liamcooke.com/feed.xml',
55− wiki: 'https://liamcooke.com/merveilles/wiki.ndtl',
56− feed: 'https://liamcooke.com/merveilles/tw.txt'
61+ url: 'https://liamcooke.com',
62+ wiki: 'https://liamcooke.com/merveilles/wiki.ndtl'
5763 },
5864
5965 {
60− url: 'https://electricgecko.de',
61− title: 'electricgecko',
62− type: 'blog',
6366 author: 'electricgecko',
6467 contact: 'desk@electricgecko.de',
65− rss: 'https://electricgecko.de/feed'
68+ langs: ['de', 'en'],
69+ title: 'electricgecko',
70+ rss: 'https://electricgecko.de/feed',
71+ type: 'blog',
72+ url: 'https://electricgecko.de'
6673 },
6774
6875 {
76+ langs: ['en'],
6977 url: 'https://wichniow.ski'
7078 },
7179
7280 {
81+ langs: ['en'],
7382 url: 'https://hraew.autophagy.io'
7483 },
7584
7685 {
86+ langs: ['en'],
7787 url: 'http://evenunto.net'
7888 },
7989
8090 {
91+ langs: ['en'],
8192 url: 'https://anxl.faith'
8293 },
8394
8495 {
85− url: 'https://xvw.github.io',
86− title: 'xvw.github.io',
87− type: 'blog',
8896 author: 'xvw',
8997 contact: 'xaviervdw@gmail.com',
90− rss: 'https://xvw.github.io/atom.xml'
98+ langs: ['fr'],
99+ rss: 'https://xvw.github.io/atom.xml',
100+ title: 'xvw.github.io',
101+ type: 'blog',
102+ url: 'https://xvw.github.io'
91103 },
92104
93105 {
106+ langs: ['en', 'el'],
94107 url: 'https://heracl.es'
95108 },
96109
97110 {
111+ langs: ['en'],
98112 url: 'http://luminghao.com'
99113 },
100114
101115 {
116+ langs: ['en'],
102117 url: 'https://turelio.github.io'
103118 },
104119
105120 {
106− url: 'https://shards.lectronice.com',
107− title: 'shards',
108− type: 'blog',
109121 author: 'lectronice',
110122 contact: 'i.love.spam@lectronice.com',
111− feed: 'https://lectronice.com/hallway/twtxt.txt'
123+ feed: 'https://lectronice.com/hallway/twtxt.txt',
124+ langs: ['en'],
125+ title: 'shards',
126+ type: 'blog',
127+ url: 'https://shards.lectronice.com'
112128 },
113129
114130 {
131+ langs: ['en'],
115132 url: 'https://craze.co.uk'
116133 },
117134
118135 {
136+ langs: ['en'],
119137 url: 'https://shaneckel.com'
120138 },
121139
122140 {
123− url: 'https://cblgh.org',
124− title: 'cblgh.org',
125141 author: 'cblgh',
126142 contact: 'cabal://cblgh.org',
127− feed: 'https://cblgh.org/twtxt.txt'
143+ feed: 'https://cblgh.org/twtxt.txt',
144+ langs: ['en'],
145+ title: 'cblgh.org',
146+ url: 'https://cblgh.org'
128147 },
129148
130149 {
131− url: 'https://ellugar.co',
132− title: 'ellugar',
133− type: 'wiki',
134150 author: 'afk',
135151 contact: 'afk@ellugar.co',
136− rss: 'http://feeds.ellugar.co/ellugar-logs'
152+ langs: ['en'],
153+ rss: 'http://feeds.ellugar.co/ellugar-logs',
154+ title: 'ellugar',
155+ type: 'wiki',
156+ url: 'https://ellugar.co'
137157 },
138158
139159 {
140− url: 'http://chigby.org',
160+ author: 'Cameron Higby-Naquin',
161+ contact: 'me@chigby.org',
162+ langs: ['en'],
141163 title: 'chigby.org',
142164 type: 'portfolio',
143− contact: 'me@chigby.org',
144− author: 'Cameron Higby-Naquin'
165+ url: 'http://chigby.org'
145166 },
146167
147168 {
169+ langs: ['en'],
148170 url: 'https://longest.voyage'
149171 },
150172
151173 {
174+ langs: ['en'],
152175 url: 'https://palomakop.tv'
153176 },
154177
155178 {
179+ langs: ['en'],
156180 url: 'https://v-os.ca'
157181 },
158182
159183 {
184+ langs: ['en'],
160185 url: 'https://jmandel.xyz'
161186 },
162187
163188 {
189+ langs: ['en'],
164190 url: 'https://systems.ws'
165191 },
166192
167193 {
168− url: 'https://2d4.dev',
169− title: '2d4.dev',
170194 author: 'jda0',
171195 contact: 'hi@2d4.dev',
172196 feed: 'https://2d4.dev/tw.txt',
197+ langs: ['en'],
198+ title: '2d4.dev',
199+ url: 'https://2d4.dev',
173200 wiki: 'https://2d4.dev/wiki.ndtl'
174201 },
175202
176203 {
204+ langs: ['en'],
177205 url: 'https://nathanwentworth.co'
178206 },
179207
180208 {
209+ langs: ['en'],
181210 url: 'https://uonai.space'
182211 },
183212
184213 {
214+ langs: ['en'],
185215 url: 'http://controls.ee'
186216 },
187217
188218 {
219+ langs: ['en'],
189220 url: 'https://wasin.io'
190221 },
191222
192223 {
224+ langs: ['en'],
193225 url: 'https://inns.studio'
194226 },
195227
196228 {
229+ langs: ['en'],
197230 url: 'http://kokorobot.ca'
198231 },
199232
200233 {
201− url: 'https://ameyama.com',
202− title: 'ameyama',
203− type: 'blog',
204234 author: 'jrc03c',
205235 contact: 'josh@ameyama.com',
236+ langs: ['en'],
237+ title: 'ameyama',
238+ type: 'blog',
206239 rss: 'https://ameyama.com/blog/rss.xml',
240+ url: 'https://ameyama.com',
207241 wiki: 'https://ameyama.com/data/wiki.ndtl'
208242 },
209243
210244 {
211− url: 'https://wake.st',
212− title: 'wake.st',
213245 author: 'wakest',
214246 contact: '@liaizon@wake.st',
215− feed: 'https://wake.st/twtxt.txt'
247+ feed: 'https://wake.st/twtxt.txt',
248+ langs: ['en'],
249+ title: 'wake.st',
250+ url: 'https://wake.st'
216251 },
217252
218253 {
254+ langs: ['en'],
219255 url: 'https://xarene.la'
220256 },
221257
222258 {
259+ langs: ['en'],
223260 url: 'https://alex.zyzhang.me'
224261 },
225262
226263 {
264+ langs: ['en'],
227265 url: 'http://bildwissenschaft.vortok.info'
228266 },
229267
230268 {
269+ langs: ['en'],
231270 url: 'https://jakofranko.github.com'
232271 },
233272
234273 {
274+ langs: ['en'],
235275 url: 'https://aeriform.io'
236276 },
237277
238278 {
279+ langs: ['en', 'de'],
239280 url: 'http://blog.lucasdidthis.com'
240281 },
241282
242283 {
243− url: 'http://npisanti.com',
244− title: 'npisanti.com',
245284 author: 'npisanti',
246285 contact: 'nicola@npisanti.com',
247− rss: 'http://npisanti.com/journal/rss.xml'
286+ langs: ['en'],
287+ rss: 'http://npisanti.com/journal/rss.xml',
288+ title: 'npisanti.com',
289+ url: 'http://npisanti.com'
248290 },
249291
250292 {
293+ langs: ['en'],
251294 url: 'https://underscorediscovery.ca'
252295 },
253296
254297 {
255− url: 'https://drisc.io',
256− title: 'drisc.io',
257− type: 'wiki',
258298 author: 'drisc',
259299 contact: 'cory@drisc.io',
260− feed: 'https://drisc.io/hallway/twtxt.txt'
300+ feed: 'https://drisc.io/hallway/twtxt.txt',
301+ langs: ['en'],
302+ title: 'drisc.io',
303+ type: 'wiki',
304+ url: 'https://drisc.io'
261305 },
262306
263307 {
308+ langs: ['en'],
264309 url: 'https://ricky.codes'
265310 },
266311
267312 {
268− url: 'https://maxdeviant.com',
313+ author: 'Marshall Bowers',
314+ contact: 'elliott.codes@gmail.com',
315+ langs: ['en'],
269316 title: 'maxdeviant.com',
270317 type: 'hybrid',
271− author: 'Marshall Bowers',
272− contact: 'elliott.codes@gmail.com'
318+ url: 'https://maxdeviant.com'
273319 },
274320
275321 {
322+ langs: ['en'],
276323 url: 'https://tynandebold.com'
277324 },
278325
279326 {
327+ langs: ['en'],
280328 url: 'http://gytis.co'
281329 },
282330
283331 {
332+ langs: ['en'],
284333 url: 'https://nomand.co'
285334 },
286335
287336 {
337+ langs: ['en'],
288338 url: 'http://memoriata.com'
289339 },
290340
291341 {
342+ langs: ['en'],
292343 url: 'https://mmm.s-ol.nu'
293344 },
294345
295346 {
347+ langs: ['en'],
296348 url: 'https://chad.is'
297349 },
298350
299351 {
352+ langs: ['en'],
300353 url: 'https://smidgeo.com/bots'
301354 },
302355
303356 {
357+ langs: ['en', 'ru'],
304358 url: 'https://iko.soy'
305359 },
306360
307361 {
362+ langs: ['en'],
308363 url: 'http://atelieroilandsugar.com'
309364 },
310365
311366 {
367+ langs: ['en'],
312368 url: 'https://magoz.is'
313369 },
314370
315371 {
316− url: 'https://szymonkaliski.com',
317372 author: 'Szymon Kaliski',
373+ langs: ['en'],
374+ rss: 'https://szymonkaliski.com/feed.xml',
318375 type: 'hybrid',
319− rss: 'https://szymonkaliski.com/feed.xml'
376+ url: 'https://szymonkaliski.com'
320377 },
321378
322379 {
323− url: 'https://phse.net',
324− title: 'phse.net',
325− type: 'blog',
326380 author: 'setphen',
381+ feed: 'https://phse.net/twtxt/merv.txt',
382+ langs: ['en'],
327383 rss: 'https://phse.net/post/index.xml',
328− feed: 'https://phse.net/twtxt/merv.txt'
384+ title: 'phse.net',
385+ type: 'blog',
386+ url: 'https://phse.net'
329387 },
330388
331389 {
390+ langs: ['en'],
332391 url: 'https://rosano.ca'
333392 },
334393
335394 {
395+ langs: ['en'],
336396 url: 'https://soyboysky.github.io'
337397 },
338398
339399 {
400+ langs: ['en'],
340401 url: 'https://gndclouds.cc'
341402 },
342403
343404 {
405+ langs: ['en', 'fr'],
344406 url: 'https://xuv.be'
345407 },
346408
347409 {
410+ langs: ['en', 'zh'],
348411 url: 'https://dsdshcym.github.io'
349412 },
350413
351414 {
352− url: 'https://wiki.chronica.xyz',
353− title: 'chronica',
354− type: 'wiki',
355415 author: 'ckipp',
356416 contact: 'ckipp@pm.me',
357417 feed: 'https://chronica.xyz/hallway.txt',
418+ langs: ['en'],
419+ title: 'chronica',
420+ type: 'wiki',
421+ url: 'https://wiki.chronica.xyz',
358422 wiki: 'https://chronica.xyz/glossary.ndtl'
359423 },
360424
361425 {
426+ langs: ['en'],
362427 url: 'https://boffosocko.com'
363428 },
364429
365430 {
366− url: 'https://hex22.org',
367− title: 'hex22',
368431 author: 'kodedninja',
369432 contact: 'karamanhunor@pm.me',
370− feed: 'https://t.seed.hex22.org/twtxt.txt'
433+ feed: 'https://t.seed.hex22.org/twtxt.txt',
434+ langs: ['en'],
435+ title: 'hex22',
436+ url: 'https://hex22.org'
371437 },
372438
373439 {
440+ langs: ['en'],
374441 url: 'https://patrikarvidsson.com'
375442 },
376443
377444 {
445+ langs: ['en'],
378446 url: 'https://sophieleetmaa.com'
379447 },
380448
381449 {
450+ langs: ['en'],
382451 url: 'https://xinniw.github.io'
383452 },
384453
385454 {
386− url: 'https://mboxed.github.io/sodatsu',
387− title: 'sodatsu',
388− type: 'wiki',
389455 author: 'm',
390456 contact: 'mboxxed@gmail.com',
391− feed: 'https://mboxed.github.io/sodatsu/tw.txt'
457+ feed: 'https://mboxed.github.io/sodatsu/tw.txt',
458+ langs: ['en'],
459+ title: 'sodatsu',
460+ type: 'wiki',
461+ url: 'https://mboxed.github.io/sodatsu'
392462 },
393463
394464 {
465+ langs: ['en'],
395466 url: 'https://letters.vexingworkshop.com'
396467 },
397468
398469 {
399− url: 'https://tom.org.nz',
400− title: 'Tom Hackshaw',
401− type: 'portfolio',
402470 author: 'tomupom',
403471 contact: 'tom@tomhackshaw.com',
472+ langs: ['en'],
473+ title: 'Tom Hackshaw',
474+ type: 'portfolio',
475+ url: 'https://tom.org.nz',
404476 wiki: 'https://a.tom.org.nz/glossary.ndtl'
405477 },
406478
407479 {
480+ langs: ['en'],
408481 url: 'https://teknari.com'
409482 },
410483
411484 {
412− url: 'https://colectivo-de-livecoders.gitlab.io',
485+ author: 'clic',
486+ contact: 'https://t.me/clic_laplata',
487+ langs: ['es'],
413488 title: 'Colectivo de Livecoders',
414489 type: 'blog',
415− author: 'clic',
416− contact: 'https://t.me/clic_laplata'
490+ url: 'https://colectivo-de-livecoders.gitlab.io'
417491 },
418492
419493 {
420− url: 'https://www.madewithtea.com',
494+ langs: ['es'],
421495 title: 'madewithtea.com',
422− type: 'blog'
496+ type: 'blog',
497+ url: 'https://www.madewithtea.com'
423498 },
424499
425500 {
426− url: 'https://amorris.ca',
427− title: 'amorris',
428501 author: 'amorris',
429− type: 'blog',
430502 feed: 'https://feed.amorris.ca/hallway.txt',
503+ langs: ['en'],
504+ title: 'amorris',
505+ type: 'blog',
506+ url: 'https://amorris.ca',
431507 wiki: 'https://wiki.amorris.ca/glossary.ndtl'
432508 },
433509
434510 {
435− url: 'http://www.miha-co.ca',
511+ langs: ['en'],
436512 title: 'miha-co',
437− type: 'portfolio'
513+ type: 'portfolio',
514+ url: 'http://www.miha-co.ca'
438515 },
439516
440517 {
441− url: 'https://buzzert.net',
442− title: 'buzzert.net',
443518 author: 'buzzert',
444− type: 'blog'
519+ langs: ['en'],
520+ title: 'buzzert.net',
521+ type: 'blog',
522+ url: 'https://buzzert.net'
445523 },
446524
447525 {
448− url: 'https://notes.stuartpb.com/',
449− title: 'notes.stuartpb.com',
450− type: 'wiki',
451526 author: 'stuartpb',
452527 contact: 's@stuartpb.com',
453− feed: 'https://twtxt.stuartpb.com/xxiivv.txt'
528+ feed: 'https://twtxt.stuartpb.com/xxiivv.txt',
529+ langs: ['en'],
530+ title: 'notes.stuartpb.com',
531+ type: 'wiki',
532+ url: 'https://notes.stuartpb.com/'
454533 },
455534
456535 {
457− url: 'https://xxiii.co',
458− title: 'xxiii',
459− type: 'portfolio',
460536 author: 'serocell',
461537 contact: 'psignal@s900.net',
538+ feed: 'https://xxiii.co/twtxt.txt',
539+ langs: ['en'],
462540 rss: 'https://serocell.com/feeds/serocell.xml',
463− feed: 'https://xxiii.co/twtxt.txt'
541+ title: 'xxiii',
542+ type: 'portfolio',
543+ url: 'https://xxiii.co'
464544 },
465545
466546 {
467− url: 'https://kor.nz',
468− title: 'kor',
469− type: 'wiki',
470547 author: 'kormyen',
471548 contact: 'h@kor.nz',
472549 feed: 'https://kor.nz/twtxt.txt',
550+ langs: ['en'],
551+ title: 'kor',
552+ type: 'wiki',
553+ url: 'https://kor.nz',
473554 wiki: 'https://kor.nz/db/glossary.ndtl'
474555 },
475556
476557 {
477− url: 'https://lublin.se',
478558 author: 'quite',
479559 contact: 'quite@hack.org',
480− feed: 'https://lublin.se/twtxt.txt'
560+ feed: 'https://lublin.se/twtxt.txt',
561+ langs: ['en'],
562+ url: 'https://lublin.se'
481563 },
482564
483565 {
484− url: 'https://zanneth.com',
485− title: 'zanneth.com',
486566 author: 'zanneth',
567+ contact: 'root@zanneth.com',
568+ langs: ['en'],
569+ title: 'zanneth.com',
487570 type: 'blog',
488− contact: 'root@zanneth.com'
571+ url: 'https://zanneth.com'
489572 },
490573
491574 {
492− url: 'https://eli.li',
493− title: 'eli.li',
494575 author: 'eli_oat',
495− type: 'blog',
496576 contact: 'hi@eli.li',
577+ feed: 'https://txt.eli.li/twtxt/twtxt.txt',
578+ langs: ['en'],
497579 rss: 'https://eli.li/feed.rss',
498− feed: 'https://txt.eli.li/twtxt/twtxt.txt'
580+ title: 'eli.li',
581+ type: 'blog',
582+ url: 'https://eli.li'
499583 },
500584
501585 {
502− url: 'https://gueorgui.net',
503− title: 'Gueorgui Tcherednitchenko',
504586 author: 'gueorgui',
587+ contact: 'hello@gueorgui.net',
588+ langs: ['en'],
589+ title: 'Gueorgui Tcherednitchenko',
505590 type: 'portfolio',
506− contact: 'hello@gueorgui.net'
591+ url: 'https://gueorgui.net'
507592 },
508593
509594 {
510− url: 'https://www.gkbrk.com',
511− title: 'Leo',
512595 author: 'Leo',
513− type: 'blog',
514596 contact: 'webring@gkbrk.com',
597+ feed: 'https://www.gkbrk.com/twtxt.txt',
598+ langs: ['en'],
515599 rss: 'https://www.gkbrk.com/feed.xml',
516− feed: 'https://www.gkbrk.com/twtxt.txt'
600+ title: 'Leo',
601+ type: 'blog',
602+ url: 'https://www.gkbrk.com'
517603 },
518604
519605 {
520− url: 'https://www.tatecarson.com',
606+ author: 'Tate Carson',
607+ contact: 'tatecarson@gmail.com',
608+ langs: ['en'],
521609 title: 'Tate Carson',
522610 type: 'portfolio',
523− author: 'Tate Carson',
524− contact: 'tatecarson@gmail.com'
611+ url: 'https://www.tatecarson.com'
525612 },
526613
527614 {
528− url: 'https://azlen.me',
529− title: 'azlen.me',
530615 author: 'azlen',
531− type: 'wiki',
532616 contact: 'webring@azlen.me',
533617 feed: 'https://azlen.me/twtxt.txt',
618+ langs: ['en'],
619+ title: 'azlen.me',
620+ type: 'wiki',
621+ url: 'https://azlen.me',
534622 wiki: 'https://azlen.me/glossary.ndtl'
535623 },
536624
537625 {
538− url: 'https://opinionatedguide.github.io/',
539− title: 'OpGuides',
540626 author: 'vega',
541627 contact: 'vegac@protonmail.com',
542− feed: 'https://opinionatedguide.github.io/twtxt.txt'
628+ feed: 'https://opinionatedguide.github.io/twtxt.txt',
629+ langs: ['en'],
630+ title: 'OpGuides',
631+ url: 'https://opinionatedguide.github.io/'
543632 },
544633
545634 {
546− url: 'https://chrismaughan.com/',
547− title: 'CMaughan',
548635 author: 'cmaughan',
549636 contact: 'mornymorny@gmail.com',
550− feed: 'https://chrismaughan.com/twtxt.txt'
637+ feed: 'https://chrismaughan.com/twtxt.txt',
638+ langs: ['en'],
639+ title: 'CMaughan',
640+ url: 'https://chrismaughan.com/'
551641 },
552642
553643 {
554− url: 'https://oddworlds.org/',
644+ author: 'RaelZero',
645+ contact: 'gaz.gong@gmail.com',
555646 title: 'oddworlds soliloquy',
647+ langs: ['en', 'es'],
556648 type: 'blog',
557− author: 'RaelZero',
558− contact: 'gaz.gong@gmail.com'
649+ url: 'https://oddworlds.org/'
559650 },
560651
561652 {
562− url: 'https://fundor333.com/',
563− title: 'Fundor333',
564− type: 'blog',
565653 author: 'Fundor 333',
566654 contact: 'blog@fundor333.com',
567− feed: 'https://fundor333.com/twtxt.txt'
655+ feed: 'https://fundor333.com/twtxt.txt',
656+ langs: ['en'],
657+ title: 'Fundor333',
658+ type: 'blog',
659+ url: 'https://fundor333.com/'
568660 },
569661
570662 {
571− url: 'https://cass.si/',
572− contact: 'm@cass.si'
663+ contact: 'm@cass.si',
664+ langs: ['en'],
665+ url: 'https://cass.si/'
573666 },
574667
575668 {
576− url: 'https://dotcomboom.somnolescent.net/',
577− title: 'dotcomboom.somnolescent.net',
578669 author: 'dcb',
579670 contact: 'dotcomboom@somnolescent.net',
580− feed: 'https://dotcomboom.somnolescent.net/twtxt.txt'
671+ feed: 'https://dotcomboom.somnolescent.net/twtxt.txt',
672+ langs: ['en'],
673+ title: 'dotcomboom.somnolescent.net',
674+ url: 'https://dotcomboom.somnolescent.net/'
581675 },
582676
583677 {
584− url: 'https://cadmican.neocities.org/',
585− title: 'cadmican',
678+ author: 'Nihiltarier',
586679 contact: 'arachi@airmail.cc',
587− author: 'Nihiltarier'
680+ langs: ['en'],
681+ title: 'cadmican',
682+ url: 'https://cadmican.neocities.org/'
588683 },
589684
590685 {
591− url: 'https://jskjott.com',
592− title: 'jskjott',
686+ author: 'Jonathan Skjøtt',
593687 contact: 'jonathan@jskjott.com',
594− author: 'Jonathan Skjøtt'
688+ langs: ['en'],
689+ title: 'jskjott',
690+ url: 'https://jskjott.com'
595691 },
596692
597693 {
598− url: 'https://sixey.es/',
599− title: 'sixey.es',
600− contact: 'elmusho@gmail.com',
601694 author: 'sixeyes',
602− type: 'portfolio'
695+ contact: 'elmusho@gmail.com',
696+ langs: ['en'],
697+ title: 'sixey.es',
698+ type: 'portfolio',
699+ url: 'https://sixey.es/'
603700 },
604701
605702 {
606− url: 'https://tilde.town/~dustin/',
607− title: '0xdstn',
608− contact: '0xdstn@protonmail.com',
609703 author: '0xdstn',
610− type: 'wiki'
704+ contact: '0xdstn@protonmail.com',
705+ langs: ['en'],
706+ title: '0xdstn',
707+ type: 'wiki',
708+ url: 'https://tilde.town/~dustin/'
611709 },
612−
613− {
614− url: 'https://jameschip.io/',
615− title: 'James Chip',
616− contact: 'henderson.j@protonmail.com',
710+
711+ {
617712 author: 'James',
618− rss: 'https://jameschip.io/index.xml'
713+ contact: 'henderson.j@protonmail.com',
714+ langs: ['en'],
715+ rss: 'https://jameschip.io/index.xml',
716+ title: 'James Chip',
717+ url: 'https://jameschip.io/'
619718 },
620719
621− {
622− url: 'https://dym.sh',
623− type: 'hybrid',
720+ {
624721 author: 'DYM',
625722 contact: 're@dym.sh',
626− rss: 'https://dym.sh/rss.xml'
723+ langs: ['en', 'ru'],
724+ rss: 'https://dym.sh/rss.xml',
725+ type: 'hybrid',
726+ url: 'https://dym.sh'
627727 },
628728
629729 {
630− url: 'https://patrick-is.cool/',
631730 author: 'Patrick Monaghan',
632731 contact: '0x5f.manpat@gmail.com',
633− type: 'portfolio'
732+ langs: ['en'],
733+ type: 'portfolio',
734+ url: 'https://patrick-is.cool/'
634735 },
635736
636737 {
637− url: 'https://icyphox.sh',
638− type: 'hybrid',
639738 author: 'icyphox',
640739 contact: 'x@icyphox.sh',
740+ feed: 'https://icyphox.sh/twtxt.txt',
741+ langs: ['en'],
641742 rss: 'https://icyphox.sh/blog/feed.xml',
642− feed: 'https://icyphox.sh/twtxt.txt'
743+ type: 'hybrid',
744+ url: 'https://icyphox.sh'
643745 }
644746
645747]