intitial commit
This commit is contained in:
		
						commit
						eb46f77010
					
				
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,2 @@
 | 
			
		||||
www/index.html
 | 
			
		||||
www/webring.opml
 | 
			
		||||
							
								
								
									
										43
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,43 @@
 | 
			
		||||
# DOZENSRING
 | 
			
		||||
 | 
			
		||||
> a webring for the dozensweb
 | 
			
		||||
 | 
			
		||||
## ABOUT
 | 
			
		||||
 | 
			
		||||
this project provides a webcomponent
 | 
			
		||||
for members of the dozensweb
 | 
			
		||||
 | 
			
		||||
it should:
 | 
			
		||||
 | 
			
		||||
- provide "next" and "previous" links, and a link to the index
 | 
			
		||||
 | 
			
		||||
- link to an opml file for all sites that provide a feed
 | 
			
		||||
 | 
			
		||||
- store member info in a recfile
 | 
			
		||||
 | 
			
		||||
see it live at https://tilde.town/~dozens/webring/dozens/
 | 
			
		||||
 | 
			
		||||
## GETTING STARTED
 | 
			
		||||
 | 
			
		||||
everything you need to know to get started
 | 
			
		||||
is in `src/example.html`.
 | 
			
		||||
 | 
			
		||||
you will need:
 | 
			
		||||
 | 
			
		||||
- git
 | 
			
		||||
 | 
			
		||||
- a text editor
 | 
			
		||||
 | 
			
		||||
- (optional) just: a task runner.
 | 
			
		||||
  https://github.com/casey/just
 | 
			
		||||
 | 
			
		||||
- (optional) GNU recutils: a plain text database.
 | 
			
		||||
  https://www.gnu.org/software/recutils/
 | 
			
		||||
 | 
			
		||||
## CONTRIBUTING
 | 
			
		||||
 | 
			
		||||
1. Download the code
 | 
			
		||||
 | 
			
		||||
2. Add an entry to the recfile
 | 
			
		||||
 | 
			
		||||
3. email a patch to dozens@tilde.team
 | 
			
		||||
							
								
								
									
										124
									
								
								db/members.rec
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								db/members.rec
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,124 @@
 | 
			
		||||
%rec: member
 | 
			
		||||
%doc: a member of the webring
 | 
			
		||||
%key: id
 | 
			
		||||
%unique: id name url feed
 | 
			
		||||
%auto: id created
 | 
			
		||||
%type: id int
 | 
			
		||||
%type: created date
 | 
			
		||||
%type: title,url,feed line
 | 
			
		||||
%typedef: Name_t regexp /[a-z]{3,13}/
 | 
			
		||||
%type: name Name_t
 | 
			
		||||
%allowed: id created title name url feed
 | 
			
		||||
%mandatory: id title name url
 | 
			
		||||
%sort: id
 | 
			
		||||
 | 
			
		||||
id: 0
 | 
			
		||||
created: Thu, 12 Oct 2023 18:51:39 -0600
 | 
			
		||||
title: tilde.town
 | 
			
		||||
name: town
 | 
			
		||||
url: http://tilde.town/~dozens/
 | 
			
		||||
 | 
			
		||||
id: 1
 | 
			
		||||
created: Thu, 12 Oct 2023 18:52:05 -0600
 | 
			
		||||
title: dozens and dragons
 | 
			
		||||
name: dozensanddragons
 | 
			
		||||
url: https://dozensanddragons.neocities.org/
 | 
			
		||||
feed: https://dozensanddragons.neocities.org/rss.xml
 | 
			
		||||
 | 
			
		||||
id: 2
 | 
			
		||||
created: Thu, 12 Oct 2023 18:52:45 -0600
 | 
			
		||||
title: supervegan
 | 
			
		||||
name: supervegan
 | 
			
		||||
url: https://supervegan.neocities.org/
 | 
			
		||||
feed: https://supervegan.neocities.org/feed.xml
 | 
			
		||||
 | 
			
		||||
id: 3
 | 
			
		||||
created: Thu, 12 Oct 2023 18:53:18 -0600
 | 
			
		||||
title: Society For Putting Things On Top Of Other Things
 | 
			
		||||
name: society
 | 
			
		||||
url: https://society.neocities.org/
 | 
			
		||||
feed: https://society.neocities.org/rss.xml
 | 
			
		||||
 | 
			
		||||
id: 4
 | 
			
		||||
created: Thu, 12 Oct 2023 18:53:58 -0600
 | 
			
		||||
title: dream journal
 | 
			
		||||
name: dreams
 | 
			
		||||
url: https://tilde.team/~dozens/dreams/
 | 
			
		||||
feed: https://tilde.team/~dozens/dreams/rss.xml
 | 
			
		||||
 | 
			
		||||
id: 5
 | 
			
		||||
created: Thu, 12 Oct 2023 18:56:55 -0600
 | 
			
		||||
title: tildewhirl podcast
 | 
			
		||||
name: tildewhirl
 | 
			
		||||
url: http://tilde.town/~dozens/podcast/
 | 
			
		||||
feed: http://tilde.town/~dozens/podcast/rss.xml
 | 
			
		||||
 | 
			
		||||
id: 6
 | 
			
		||||
created: Thu, 12 Oct 2023 19:01:23 -0600
 | 
			
		||||
title: list blog
 | 
			
		||||
name: lists
 | 
			
		||||
url: http://tilde.town/~dozens/listblog/
 | 
			
		||||
feed: http://tilde.town/~dozens/listblog/feed.xml
 | 
			
		||||
 | 
			
		||||
id: 7
 | 
			
		||||
created: Thu, 12 Oct 2023 19:01:55 -0600
 | 
			
		||||
title: consume
 | 
			
		||||
name: consume
 | 
			
		||||
url: http://tilde.town/~dozens/consume/
 | 
			
		||||
feed: https://tilde.town/~dozens/consume/feed.xml
 | 
			
		||||
 | 
			
		||||
id: 8
 | 
			
		||||
created: Thu, 12 Oct 2023 19:07:48 -0600
 | 
			
		||||
title: piblog
 | 
			
		||||
name: piblog
 | 
			
		||||
url: http://tilde.town/~dozens/piblog/
 | 
			
		||||
feed: http://tilde.town/~dozens/piblog/feed.xml
 | 
			
		||||
 | 
			
		||||
id: 9
 | 
			
		||||
created: Thu, 12 Oct 2023 19:08:44 -0600
 | 
			
		||||
title: status cafe
 | 
			
		||||
name: statuscafe
 | 
			
		||||
url: https://status.cafe/users/dozens
 | 
			
		||||
feed: https://status.cafe/users/dozens.atom
 | 
			
		||||
 | 
			
		||||
id: 10
 | 
			
		||||
created: Thu, 12 Oct 2023 19:10:05 -0600
 | 
			
		||||
title: mastodon
 | 
			
		||||
name: mastodon
 | 
			
		||||
url: https://tiny.tilde.website/@dozens
 | 
			
		||||
feed: https://tiny.tilde.website/@dozens.rss
 | 
			
		||||
 | 
			
		||||
id: 11
 | 
			
		||||
created: Thu, 12 Oct 2023 19:11:34 -0600
 | 
			
		||||
title: linkhut
 | 
			
		||||
name: linkhut
 | 
			
		||||
url: https://ln.ht/~dozens
 | 
			
		||||
feed: https://ln.ht/_/feed/~dozens
 | 
			
		||||
 | 
			
		||||
id: 12
 | 
			
		||||
created: Thu, 12 Oct 2023 19:12:35 -0600
 | 
			
		||||
title: peertube
 | 
			
		||||
name: peertube
 | 
			
		||||
url: https://tube.tchncs.de/a/dozens/video-channels
 | 
			
		||||
feed: https://tube.tchncs.de/feeds/videos.xml?accountId=47463
 | 
			
		||||
 | 
			
		||||
id: 13
 | 
			
		||||
created: Thu, 12 Oct 2023 19:13:08 -0600
 | 
			
		||||
title: basement quest
 | 
			
		||||
name: quest
 | 
			
		||||
url: http://tilde.town/~dozens/quest/
 | 
			
		||||
feed: ttps://tilde.town/~dozens/quest/rss.xml
 | 
			
		||||
 | 
			
		||||
id: 14
 | 
			
		||||
created: Fri, 13 Oct 2023 19:28:08 -0600
 | 
			
		||||
title: gamelog
 | 
			
		||||
name: gamelog
 | 
			
		||||
url: http://tilde.town/~dozens/gamelog/
 | 
			
		||||
feed: https://tilde.town/~dozens/gamelog/feed.xml
 | 
			
		||||
 | 
			
		||||
id: 15
 | 
			
		||||
created: Fri, 13 Oct 2023 19:29:38 -0600
 | 
			
		||||
title: pro toad and superb owl
 | 
			
		||||
name: protoad
 | 
			
		||||
url: https://git.tilde.town/dozens/protoadandsuperbowl/
 | 
			
		||||
feed: https://git.tilde.town/dozens/protoadandsuperbowl/raw/branch/master/feed.xml
 | 
			
		||||
							
								
								
									
										49
									
								
								justfile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								justfile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,49 @@
 | 
			
		||||
# list all recipes
 | 
			
		||||
default:
 | 
			
		||||
  just --list --unsorted
 | 
			
		||||
 | 
			
		||||
# add a new webring member
 | 
			
		||||
new:
 | 
			
		||||
  #!/usr/bin/env sh
 | 
			
		||||
  read -p "name (lowercase, 3-13 characters): " name
 | 
			
		||||
  read -p "title: " title
 | 
			
		||||
  read -p "url: " url
 | 
			
		||||
  read -p "feed: " feed
 | 
			
		||||
  recins --verbose -t member \
 | 
			
		||||
    -f "name" -v "$name" \
 | 
			
		||||
    -f "title" -v "$title" \
 | 
			
		||||
    -f "url" -v "$url" \
 | 
			
		||||
    -f "feed" -v "$feed" \
 | 
			
		||||
    db/members.rec
 | 
			
		||||
alias add := new
 | 
			
		||||
 | 
			
		||||
# rec2json
 | 
			
		||||
_json:
 | 
			
		||||
  recsel db/members.rec \
 | 
			
		||||
  | rec2csv \
 | 
			
		||||
  | csvjson \
 | 
			
		||||
  | jq '. | {data: .}'
 | 
			
		||||
 | 
			
		||||
# build html
 | 
			
		||||
html:
 | 
			
		||||
  recsel db/members.rec \
 | 
			
		||||
  | rec2csv \
 | 
			
		||||
  | csvjson \
 | 
			
		||||
  | jq '. | {data: .}' \
 | 
			
		||||
  | mustache - src/example.html www/index.html
 | 
			
		||||
 | 
			
		||||
# build opml
 | 
			
		||||
opml:
 | 
			
		||||
  recsel db/members.rec \
 | 
			
		||||
  | rec2csv \
 | 
			
		||||
  | csvjson \
 | 
			
		||||
  | jq '. | {data: .}' \
 | 
			
		||||
  | jq '{ data: [ .data[] | select(.feed != null) ] }' \
 | 
			
		||||
  | mustache - src/example.opml www/webring.opml
 | 
			
		||||
 | 
			
		||||
# compile html and opml
 | 
			
		||||
build: html opml
 | 
			
		||||
 | 
			
		||||
# upload
 | 
			
		||||
up:
 | 
			
		||||
  rsync -zaP www/ tilde:public_html/webring/dozens
 | 
			
		||||
							
								
								
									
										143
									
								
								src/example.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										143
									
								
								src/example.html
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,143 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html>
 | 
			
		||||
  <head>
 | 
			
		||||
    <meta charset="UTF-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width" />
 | 
			
		||||
    <title>webring</title>
 | 
			
		||||
    <style type="text/css" media="screen">
 | 
			
		||||
body {
 | 
			
		||||
  max-width: 70ch;
 | 
			
		||||
  margin: 0 auto;
 | 
			
		||||
}
 | 
			
		||||
    </style>
 | 
			
		||||
  </head>
 | 
			
		||||
  <body>
 | 
			
		||||
    <header>
 | 
			
		||||
      <h1>a very powerful webring</h1>
 | 
			
		||||
    </header>
 | 
			
		||||
    <main>
 | 
			
		||||
      <section id="about">
 | 
			
		||||
        <h2>about</h2>
 | 
			
		||||
        <p>
 | 
			
		||||
this is a webring.
 | 
			
		||||
a webring is like an onion ring
 | 
			
		||||
except it is more abstract and intangible and you can't eat it.
 | 
			
		||||
but if you imagine the breading of the onion ring
 | 
			
		||||
as a series of websites instead of fried batter,
 | 
			
		||||
then you will notice that if you follow
 | 
			
		||||
the breadcrumbs, as it were,
 | 
			
		||||
by the time you've gotten to the bottom of the list,
 | 
			
		||||
then you've arrived back at the top!
 | 
			
		||||
        </p>
 | 
			
		||||
      </section>
 | 
			
		||||
      <section>
 | 
			
		||||
        <h2>members</h2>
 | 
			
		||||
        <ul>
 | 
			
		||||
          {{#data}}
 | 
			
		||||
          <li>
 | 
			
		||||
            <a href="{{{url}}}">{{{title}}}</a>
 | 
			
		||||
          </li>
 | 
			
		||||
          {{/data}}
 | 
			
		||||
        </ul>
 | 
			
		||||
      </section>
 | 
			
		||||
      <section id="feeds">
 | 
			
		||||
        <h2>feeds</h2>
 | 
			
		||||
        <p>
 | 
			
		||||
here's a special bonus,
 | 
			
		||||
just for you,
 | 
			
		||||
our special friend.
 | 
			
		||||
a special little treat
 | 
			
		||||
for special little you.
 | 
			
		||||
it's an opml file of all webring members
 | 
			
		||||
that have a feed.
 | 
			
		||||
<a href="webring.opml">here you go!</a>
 | 
			
		||||
        </p>
 | 
			
		||||
      </section>
 | 
			
		||||
      <section>
 | 
			
		||||
        <h2>how it works</h2>
 | 
			
		||||
        <p>
 | 
			
		||||
this webring requires no client/member-side javascript.
 | 
			
		||||
it works by navigating to this page
 | 
			
		||||
with certain query parameters. e.g.
 | 
			
		||||
<code>?name=town&dir=next</code>.
 | 
			
		||||
then this page will do some javascript
 | 
			
		||||
and redirect the user to the next (or previous) page in the ring.
 | 
			
		||||
so you can make the whole thing work
 | 
			
		||||
with just a couple of anchor tags on your site.
 | 
			
		||||
        </p>
 | 
			
		||||
      </section>
 | 
			
		||||
      <section id="join">
 | 
			
		||||
        <h2>join</h2>
 | 
			
		||||
        <p>
 | 
			
		||||
to join this <del>onion</del> webring,
 | 
			
		||||
add your information to <code>db/members.rec</code>
 | 
			
		||||
at <a href="https://git.tilde.town/dozens/webring">https://git.tilde.town/dozens/webring</a>
 | 
			
		||||
        </p>
 | 
			
		||||
      </section>
 | 
			
		||||
      <section id="snippet">
 | 
			
		||||
        <h2>snippet</h2>
 | 
			
		||||
        <p>
 | 
			
		||||
once you have been added to the database,
 | 
			
		||||
you can include the webring html on your page however you like.
 | 
			
		||||
here's an example:
 | 
			
		||||
        </p>
 | 
			
		||||
        <code>
 | 
			
		||||
          <pre>
 | 
			
		||||
<div>
 | 
			
		||||
<p>this site is a member of a very powerful webring!</p>
 | 
			
		||||
<p>
 | 
			
		||||
  <a href="https://tilde.town/~dozens/webring/dozens/index.html?name=yoursitename&dir=prev">previous</a> |
 | 
			
		||||
  <a href="https://tilde.town/~dozens/webring/dozens/index.html">all</a> |
 | 
			
		||||
  <a href="https://tilde.town/~dozens/webring/dozens/index.html?name=yoursitename&dir=next">next</a> >
 | 
			
		||||
</p>
 | 
			
		||||
</div>
 | 
			
		||||
          </pre>
 | 
			
		||||
        </code>
 | 
			
		||||
        <p>
 | 
			
		||||
that'd look like this:
 | 
			
		||||
        </p>
 | 
			
		||||
        <blockquote>
 | 
			
		||||
<div>
 | 
			
		||||
<p>this site is a member of a very powerful webring!</p>
 | 
			
		||||
<p>
 | 
			
		||||
  < <a href="https://tilde.town/~dozens/webring/dozens/index.html?name=yoursitename&dir=prev">previous</a> |
 | 
			
		||||
  <a href="https://tilde.town/~dozens/webring/dozens/index.html">all</a> |
 | 
			
		||||
  <a href="https://tilde.town/~dozens/webring/dozens/index.html?name=yoursitename&dir=next">next</a> >
 | 
			
		||||
</p>
 | 
			
		||||
</div>
 | 
			
		||||
        </blockquote>
 | 
			
		||||
      </section>
 | 
			
		||||
    </main>
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
const members = [
 | 
			
		||||
  {{#data}}
 | 
			
		||||
  {
 | 
			
		||||
    "id": {{{id}}},
 | 
			
		||||
    "name": "{{{name}}}",
 | 
			
		||||
    "url": "{{{url}}}",
 | 
			
		||||
  },
 | 
			
		||||
  {{/data}}
 | 
			
		||||
]
 | 
			
		||||
const last = members.length - 1
 | 
			
		||||
const query = window.location.search
 | 
			
		||||
const params = new URLSearchParams(query)
 | 
			
		||||
const name = params.get('name')
 | 
			
		||||
const dir = params.get('dir')
 | 
			
		||||
if (name && dir) {
 | 
			
		||||
  const step = (dir === 'next') ? 1 : (dir === 'prev') ? -1 : 0
 | 
			
		||||
  const member = members.filter(member => member.name === name)[0]
 | 
			
		||||
  if (!(typeof member === "undefined")) {
 | 
			
		||||
    const next = (member.id + step > last)
 | 
			
		||||
      ? 0
 | 
			
		||||
      : (member.id + step < 0)
 | 
			
		||||
      ? last
 | 
			
		||||
      : member.id + step
 | 
			
		||||
    const loc = members.filter(m => m.id === next)[0]
 | 
			
		||||
    window.location.replace(loc.url)
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
							
								
								
									
										16
									
								
								src/example.opml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/example.opml
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,16 @@
 | 
			
		||||
<?xml version="1.0" encoding="ISO-8859-1"?>
 | 
			
		||||
<opml version="2.0">
 | 
			
		||||
  <head>
 | 
			
		||||
    <title>webring</title>
 | 
			
		||||
    <text>webring</text>
 | 
			
		||||
    <ownerName>dozens</ownerName>
 | 
			
		||||
    <ownerEmail>dozens@tilde.team</ownerEmail>
 | 
			
		||||
  </head>
 | 
			
		||||
  <body>
 | 
			
		||||
    <outline text="webring" title="webring">
 | 
			
		||||
      {{#data}}
 | 
			
		||||
      <outline text="{{{name}}}" title="{{{title}}}" type="rss" xmlUrl="{{{feed}}}" />
 | 
			
		||||
      {{/data}}
 | 
			
		||||
    </outline>
 | 
			
		||||
  </body>
 | 
			
		||||
</opml>
 | 
			
		||||
							
								
								
									
										0
									
								
								www/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								www/.gitkeep
									
									
									
									
									
										Normal file
									
								
							
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user