GOPHER 2.0 - MARKUP
This is post 3 of 4 (?) in which I talk about one of my favorite
subjects: linked documents and lightweight markup languages.
Ratfactor's Apologia
=================================================================
I knew that the title "Gopher 2.0" would be a little contentious.
It's certainly more attention-grabbing than "Ideas for a New Con-
tent Delivery Protocol Heavily Inspired by Gopher". (Though now
that I see it, the last "PHIG" part does make me smile.)
Part of me wishes I could have thought of a better name for these
posts... *but* part of me doesn't.
I don't mind stirring the pot to see where everybody stands on
the upgrade vs. clean break issue. I was already leaning hard
towards the "clean break" camp because I love retrocomputing and
I want old machines and old software to keep working as-is for as
long as possible.
Now I'm completely convinced. :-)
Also, this reminds me somewhat tangentially of Cunningham's Law
[0]
"The best way to get the right answer on the Internet
is not to ask a question, it's to post the wrong an-
swer."
Where in this case, Gopher 2.0 is the "wrong" title for the
"right" (for me) content.
Why markup - encoding
=================================================================
Far more than the protocol, this is where I start to really get
excited.
I loooooove "plain text" documents.
But.
There's no such thing.
If you said "plain text" far enough back in time, I wouldn't know
if you were talking about something encoded in EBCDIC or ASCII.
If you say it now, I don't know if you're talking about 7-bit
ASCII or 8-bit ISO 8859-1 (Latin-1) or a multi-byte Unicode en-
coding or something else entirely!
And let's not even speak of line endings ("\r\n" vs "\n").
Please. Let's not speak of it. The wounds are still too fresh.
So do I *even need* to mention that UTF-8 would be required for
any next-gen document format?
Okay: UTF-8 is required. That's a position I'm happy to defend.
Why markup - hypertext
=================================================================
I am deeply invested in the concept of hypertext. [1]
I've experimented with Wikis and HTML content generators to a de-
gree that may not even be healthy. :-)
One of my favorite tools is the lightweight VimWiki plugin for
Vim, which allows me to quickly create, edit, arrange, and navi-
gate text documents within my editor. (And yes, I'm aware of and
jealous of Emacs and Org Mode.)
For VimWiki (or any hypertext document system) to work, it needs
to have a way to link directly to other documents.
HTML does this with anchors:
<a href="wigglers">Wigglers</a>
VimWiki does this with links:
[[wigglers|Wigglers]]
Gopher does this with "Directory Entities" (but only in directory
listings):
0/docs/wigglers[TAB]Wigglers[TAB]example.com[TAB]70
And informally, many folks have adopted this presumably Markdown-
inspired "reference-style" link pattern for Gopher content:
Wigglers [1]
...
[1]
gopher://docs/wigglers
What I like about the Gopher directory entity style is that it
enforces (or at least strongly suggests) a one-line-each linear
list of links. What I don't like about them is typing and read-
ing them.
I like the "reference-style" links for the same reasons. I also
like that the path is completely visible and not replaced with
alternate text. What I don't like about them is that they are
not actually part of Gopher.
Why markup - text wrapping
=================================================================
One of the biggest problems I have with viewing Gopher content is
that it doesn't display well on different sized screens.
Isn't it painfully ironic that something as *simple* as *text* is
so hard to format for a cell phone screen vs an old 80-column
terminal vs a widescreen desktop monitor?
This is one thing that HTML gets 100% correct: by default, all
text reflows to fit the container.
The problem is that we can't just remove all of the line ending
characters from our documents and hope for the best: we'd lose
source code formatting, ASCII art, and all the other little de-
tails that make "plain" text so wonderful to view!
So somehow you have to specify, "here is paragraph text - please
make this look right for my readers," but also, "here is a cool
Figlet logo or a diagram made out of | + - characters, don't
touch this!"
Markup perspectives
=================================================================
Like HTTP comes with HTML (or vice versa), I believe a next-gen
rodent-based protocol for content specifies the format of that
content to the degree that we can link to other documents and
identify, minimally, how to display that content.
But, again, this format needs to balance the concerns of the
three perspectives I used to look at the protocol: developers,
content creators, and end-users.
Let's look at each of those now:
1. Developers
In my mind, a good format specification is unambiguous, simple,
and flexible. In the spirit of Gopher, I suggest a format that
is as *easy to parse as possible*.
Therefore, I currently favor an extremely limited line-based syn-
tax. I'll show examples later.
2. Content creators
As a content creator, I want the syntax to get out of my way and
let me type as rapidly as I can compose my thoughts.
I want the flexibility to be able to accomplish any (reasonable)
thing I can think of doing with plain text, but not have to memo-
rize a huge set of rules.
I feel like developer and content creator perspectives don't have
to be at odds so long as both agree on *utter simplicity* as a
core tenant.
3. End-users
As an end-user, I want to be able to view content so that it is
formatted as nicely for my screen as possible; I want to be able
to view a document on my phone, printed out on paper, or jacked
into my cyberdeck on the neon rooftop of a megacorp in the pour-
ing rain.
About the markup example
=================================================================
I'm already dogfooding [2] a prototype of this syntax and have
been using it since mentioning a tool I created called Text Ju-
nior (tjr) in a post back in April. [3]
(By the way, piping through groff hasn't been quite the panacea
I'd hoped it would be, but I'm otherwise pretty happy with the
little tool and the syntax. I've been noodling with a replacement
written in AWK/gawk.)
I've borrowed things I like from existing syntaxes such as Mark-
down, AsciiDoc, and various wikis. I honestly can't keep them
all straight anymore.
The common feature here is that all formatting is "line-based":
paragraphs are separated by blank lines. Headings are on lines
that start with one or more "#" characters. Other blocks start
and end with lines containing nothing but symmetrical triplets of
characters that are easy to type on the keyboard and are hopeful-
ly easy to remember (because of certain existing conventions).
Unambiguity, ease of typing, and ease of parsing are the primary
goals (in that order).
Markup example
=================================================================
Enough talk, let's see an example:
# Example Document
Hello.
Here is a paragraph of text.
It reflows as needed to fit the desired output width.
I like the idea of enforcing that links be on a line of their own.
I'm not super sure about the exact syntax.
For reasons I'll get into in Part 4 (the client), I want to support relative document links.
So here's something to look at:
link:/docs/wigglers
link://example.com/danglers
http://example.com/
telnet://example.com:23
The first two are for *this* new imaginary protocol. The last two are for *other* protocols in URL form.
Also note that there is no "display" text for the links.
I like the idea that the end-user is completely aware of where they're going when they follow a link.
Now a "preformatted" or "code" block:
```
example(){ +------------------------+
print("Hello world!"); | Code or art goes here |
} +------------------------+
```
I consider these to be nice-to-have formatting items:
"""
A block quote will stand out from the paragraph text.
It will also flow and wrap like paragraph.
"""
It's also hard to make a good document without this ability:
1. Ordered and unordered lists are always nice to have
2. I'm not certain how necessary it is to support nested lists. I guess it would be nice.
The end.
Example rendering
=================================================================
Here's an example rendering as it might appear if your screen
just happened to match the width of this document. :-) Of course,
you have to use your imagination to visualize how links might be
highlighted and such:
EXAMPLE DOCUMENT
Hello. Here is a paragraph of text. It reflows as needed to fit
the desired output width.
I like the idea of enforcing that links be on a line of their
own. I'm not super sure about the exact syntax. For reasons
I'll get into in Part 4 (the client), I want to support relative
document links. So here's something to look at:
link:/docs/wigglers
link://example.com/danglers
http://example.com/
telnet://example.com:23
The first two are for *this* new imaginary protocol. The last two
are for *other* protocols in URL form. Also note that there is
no "display" text for the links. I like the idea that the end-
user is completely aware of where they're going when they follow
a link.
Now a "preformatted" or "code" block:
example(){ +------------------------+
print("Hello world!"); | Code or art goes here |
} +------------------------+
I consider these to be nice-to-have formatting items:
A block quote will stand out from the paragraph text.
It will also flow and wrap like paragraph.
It's also hard to make a good document without this ability:
1. Ordered and unordered lists are always nice to have
2. I'm not certain how necessary it is to support nested
lists. I guess it would be nice.
The end.
Okay, that's it
=================================================================
(I had to fake the ordered list because I don't actually have
that working in tjr yet.)
Again, the client will be given leeway to display the document in
whatever way makes it most enjoyable for the end-user.
By the way, I could also see an argument being made for standard-
izing *strong* and _emphasized_ text. But, making unambiguous
rules for these that covers all corner cases is extremely hard.
Also, it breaks the "line-based" nature of the formatting so far.
There are lots of other little details and persuasive arguments I
could try to pack in here, but I think this post has gone on long
enough.
Actually, the next part, The Client, is where I'm *most excited*.
Thanks for reading thus far!
Well, almost done
=================================================================
Oh, one more thing: I've read all of the feedback (I could find)
so far and taken it all to heart. I'm happy to see the passion
and *no hard feelings* if I've rubbed some folks the wrong way
with all of this.
I wanted to specifically acknowledge what gallowsgryph wrote
about a next-gen protocol: [4]
"And I have a name suggestion for it: /Meerkat/. The
burrowing Savannah dweller that have large fami-
lies... Much like pubnix groups, if you think about
it."
I *love* that suggestion. "Meerkat Protocol." "MML - Meerkat
Markup Language." That could work.
What other rodents and small mammals could be pressed into ser-
vice? Shrews, moles, voles, mice, rats, hedgehogs, hamsters,
lemmings...
Ha! This is fun.
*** ****
******* ********
*******love*******
****ratfactor***
************
********
****
**
See you in cyberspace, Gophers!
[0]
https://en.wikipedia.org/wiki/Ward_Cunningham#Cunningham's_Law
[1]
https://en.wikipedia.org/wiki/Hypertext
[2]
https://en.wikipedia.org/wiki/Eating_your_own_dog_food
[3]
gopher://sdf.org/0/users/ratfactor/phlog/2019-04-21-text-junior
[4]
gopher://sdf.org/0/users/gallowsgryph/phlog/2019-06-07_gopher2_part2.txt