on 4e9552a help sign in
webring/scripts/portal.js
71 lines 2.8 kB history raw
1'use strict'
3function Portal (sites) {
4 this.el = document.createElement('div')
5 this.el.id = 'portal'
6 this.sites = sites
8 // Templates
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 }
14 function _buttons () {
15 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> | <a href="hallway.html">The Hallway</a> | <a href="wiki.html">The Wiki</a> | <a id="opml">OPML</a></p>`
16 }
18 function _directory (sites) {
19 return `
20 <ul>${sites.reduce( (acc, site, id) =>
21 `${acc}<li ${site.type ? `data-type="${site.type}"` : ''} id='${id}'><a href='${site.url}'>${_name(site)}</a></li>`
22 , '')}</ul>\n${_readme()}${_buttons()}`
23 }
25 function _name (site) {
26 return site.title || `${site.url.split('//')[1]}`
27 }
29 function _redirect (site) {
30 return `<p id='footer'>Redirecting to <a href="${site.url}">${site.url}</a></p><meta http-equiv="refresh" content="3; url=${site.url}">
31 <p class='buttons'><a href='#' onClick="portal.reload('')">Directory</a> | <a href='#${site.url}' 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>`
32 }
34 //
36 this.install = function (host) {
37 host.appendChild(this.el)
38 }
40 this.start = function () {
41 this.el.innerHTML = window.location.hash && window.location.hash.length > 4 ? _redirect(this.next()) : _directory(this.sites)
42 }
44 this.reload = function () {
45 setTimeout(() => { window.location.reload() }, 500)
46 }
48 this.navigate = function (target) {
49 setTimeout(() => { window.location.href = target }, 3000)
50 }
52 this.locate = function () {
53 const hash = window.location.hash.replace('#', '').trim()
55 if (hash == 'random') {
56 return Math.floor(Math.random() * this.sites.length)
57 }
59 for (const id in this.sites) {
60 const site = this.sites[id]
61 if (site.url.indexOf(hash) > -1) {
62 return parseInt(id)
63 }
64 }
65 return -1
66 }
68 this.next = function (loc = this.locate()) {
69 return loc == this.sites.length - 1 ? this.sites[0] : this.sites[loc + 1]
70 }