Home

Awesome

Gopher-and-Gemini-Walker

This is a terminal utility to navigate a folder structure containing a Gopher hole or a Gemini capsule. It is useful to verify your Gopher hole or Gemini capsule before deploying them to the hosting environment. This utility may be useful for people creating Gopher holes or Gemini capsules by hand in their local machines. It allows to test and inspect the Gopher hole or Gemini capsule in the file system of a local machine. This utility does not access the network.

This utility was developed to test and navigate the Hugo-2-Gopher-and-Gemini generated Gopher holes and Gemini capsules. It is a complement to the Test-Hugo-2-Gopher-and-Gemini repository. However, it can be used stand alone to navigate any Gopher hole or Gemini capsule.

Introduction

When creating a Gopher hole or a Gemini capsule you start by creating the files (gophermaps for Gopher or <name>.gmi for Gemini) in a local machine and then uploading them to the hosting environment. Even that gophermaps and <name>.gmi (or <name>.gemini) files are easy to create, they normally live in a folder (directory) structure and refer to other files in that structure. In addition, they may have links to other locations.

This utility ggwalker.py is a terminal (command line) browser like utility that allows you to browse your Gopher hole or Gemini capsule in your local machine by navigating the folder structure of the hole or capsule, without using any network communication. Similar to Gopher or Gemini browsers, if a external link or a non-textual file is found, the default OS application is invoked to process the link. Than way, this utility does not opens any network connection and only works in local files.

Installation

There is no much to install. Just get the zip or link for this repository and unzip it or clone it in your machine. You need to have python 3 installed (normally installed by default in most Linux distributions). The executable is src/ggwalker.py

Execution

You can execute ggwalker.py without any argument and get to the following prompt:

~$ src/ggwalker.py
Welcome to Gopher and Gemini walker
Type ? or help for list of commands.
walker>

But, most likely you want to execute it with the path to your Gopher hole or Gemini capsule, as follows:

~$ src/ggwalker.py  ~/sources/site

In this example, ~/sources/site is the folder containing my Gopher hole (~/sources/site/gophermap file) or Gemini capsule, in which case there will be an index.gmi file (i.e. ~/sources/site/index.gmi).

Typical session (example)

In this session, we will use the test directory in this repository. The test directory has two sites, namely test/toyhole (a sample Gopher site), and test/toycapsule (a Gemini site). They serve two purposes. First, they are a minimal test suite. Second and probably most important they describe how to write a gophermap (test/toyhole) and a Gemini file (test/toycapsule). They follow the traditional toybox.zip that many of us used to learn Gopher.

For our typical session, let execute ggwalker.py, as follows:

~$ src/ggwalker.py  test/toyhole

Let try the help:

walker>?
Documented commands (type help <topic>):
========================================
EOF  back  dump  help   paths  read    save  shell  urls 
add  down  exit  links  quit   remove  set   up     visit

Now, let visit the gopher hole we passed as argument (test/toyhole). The purpose of toyhole is to present a very small example of a Gopher hole, and to describe how you can write your own gophermap. So, let visit it, as follows:

walker> visit
  Gopher menu [Gopher-and-Gemini-Walker/test/toyhole/gophermap]  
                                                                      
               _____             _                 __  __             
              / ____|           | |               |  \/  |            
             | |  __  ___  _ __ | |__   ___ _ __  | \  / | __ _ _ __  
             | | |_ |/ _ \| '_ \| '_ \ / _ \ '__| | |\/| |/ _` | '_ \ 
             | |__| | (_) | |_) | | | |  __/ |    | |  | | (_| | |_) |
              \_____|\___/| .__/|_| |_|\___|_|    |_|  |_|\__,_| .__/ 
                          | |                                  | |    
                          |_|                                  |_|    
                                                                      

         A Gopher server exposes a directory structure to the network using
         the gopher protocol (RFC 1436).  In that respect, it is similar to
         FTP  (RFC 959).  The main  difference is that  Gopher  looks for a

...

        Few examples are:
 1 (TXT) A text file (relative to this gopgermap)
 2 (BIN) A pdf file (relative to the gopher site)
 3 (PIC) an image file
 4 (DIR) The stuff directory (relative to this gopgermap)
 5 (DIR) The stuff directory (relative to the gopher site)

...

walker>

Now, we can go to the text file that is link number 1. We do that bu just typing 1, as follows

walker> 1
Text file [Gopher-and-Gemini-Walker/test/toyhole/stuff/text.txt] 

This is a text file.

walker> 

Our text file is not very exciting, but enough to illustrate how it works. Ok, now what? There is no menu to select from, but remember that we can always use ? to get help. In this case, it makes sense to go back to the previous page. We do that by using the back command, as follows:

walker> back

We now got back to the first page. We can go to any of the links in that page by typing the number of the link. But, we can also list all the raw links in the page by using the links command, as follows:

walker> links
                                List of raw links in the page                                
 1 (TXT) stuff/text.txt
 2 (BIN) /stuff/a-file.pdf
 3 (PIC) stuff/image.jpg
 4 (DIR) stuff
 5 (DIR) /stuff
 6 (DIR) gopher://sdf.org/
 7 (DIR) gopher://gopher.floodgap.com/
 8 (URL) http://sdf.org/
 9 (URL) https://www.floodgap.com/
10 (URL) gemini://myserver.com/
walker> 

Now you have enough information to navigate your own Gopher hole or Gemini capsule. You can exit this session using exit or quit, as follows:

walker> exit

You can do the same exercise using test/toycapsule.

Most commands can be abbreviated to the first one or two letters. In here, we used the commands visit, back, links and exit that can be abbreviated as v, b, l and e.

Few extra notes on this session

Note that link 10 above refers to gemini://myserver.com which in this case refers to our own test/toycapsule. You can also have a gopher://myserver.com being listed as a link on the Gemini capsule. If you want to navigate between them, you can execute ggwalker.py, as follows:

src/ggwalker.py  -s gemini://myserver.com -s gopher://myserver.com  test/toyhole test/toycapsule

Note that we passed two site URLs using the -s option, and two paths to navigate to. We can now do visit 1 or visit 2 to visit one of the paths. If we go to a link that has a fully qualified url, for example gemini://myserver.com/stuff/text.txt then ggwalker.py will change it to test/toycapsule/stuff/text.txt and navigate to it.

Commands

As we saw in the previous section, there is a set of commands that ggwalker.py will accept during an interactive session. Most of those commands can be abbreviated to one or two letters. In here we will present all the commands by type.

Basic commands

Basic commands that most users will need.

exit (e) / Quit (q) / EOF

Exit the ggwalker.py session. It can be abbreviated to e, q, or <ctrl>-D.

help (?)

Provide help about the different commands. It can be abbreviated to ?. Detailed help for a command can be obtained using help <command> (same as ? <command>)

shell (!)

Provides a way to execute shell commands. For example, ! ls.

Paths and URLs

A path is the base directory of a Gopher hole or a Gemini capsule. Meaning it corresponds to / in your site. For example, in this repository you can find two paths, namely Gopher-and-Gemini-Walker/test/toyhole and Gopher-and-Gemini-Walker/test/toycapsule. You can pass multiple paths via command line arguments as follows:

src/ggwalker.py  Gopher-and-Gemini-Walker/test/toyhole  Gopher-and-Gemini-Walker/test/toycapsule

A site URL, in this context, corresponds to the URL the deployed Gopher hole or Gemini capsule will have. In most cases, you will not need to use them, unless you are using full URLs for all your references. For example, using our test directory, if I refer to a text file as stuff/text.txt the re is no need to supply the site URL, but if I use gemini://stuff/text.txt instead, then you need to provide the site URL, so that ggwalker.py can find it (otherwise, it will try to launch a gemini browser). You can pass multiple site URLs via command line arguments using the -s flag, as follows:

src/ggwalker.py  -s gemini://myserver.com  -s gopher://myserver.com 
add (a)

You can add both paths and site URLs using the add command. The syntax is: `a[dd] [ p[ath] <path> | u[rl] <url>]'. For example:

walker> add path Gopher-and-Gemini-Walker/test/toyhole
or
walker> a p Gopher-and-Gemini-Walker/test/toyhole
walker> add url gemini://myserver.com
or
walker> a u gemini://myserver.com
paths (p)

You can list all the paths with the paths command. Note that each path is assign a number that will be used for other commands that accept paths. For example:

walker> p
               List of Paths
  1    ~/src/Gopher-and-Gemini-Walker/test/toyhole
  2    ~/src/Gopher-and-Gemini-Walker/test/toycapsule
walker> 
urls

Similar to paths, urls list all the site URLs. This command does not have an abbreviation.

remove ('re')

You can remove a path using its full name or its number. The syntax is: re[move] [p[ath] <number>|<path>] [u[rl] <number>|<url>].

Configuration files

Paths and site URLs are long and cumbersome to type every time that you execute ggwalker.py. In addition, they are for most parts static and don't change much over time. Therefore is convenient to have a save and read commands.

save (s)

Saves the paths and site URLs to a json file. If no filename is given then config.json will be used. The syntax is: s[ave] [<file-name>]

read (r)

Read a config file. If no filename is given then config.json will be used. The syntax is: r[ead] [<file-name>]

Navigation

The main purpose of ggwalker.py is to allow you to navigate your Gopher hole and/or Gemini capsule. You start navigating by using the visit command.

visit (v)

You visit a path. Therefore you must provide a path name or a path number. If only one path exists, then the path number is optional. The syntax is: v[isit] [<path-number>|<path>]

Visit takes you to the first page of the site at the path. Gopher sites may have a gophermap file under that path, otherwise the directory content is listed. Gemini sites require an index.gmi or index.gemini file under that path. In either case, that is the page that will be output.

<number>

Gopher and Gemini pages have links to other pages, files, directories, URLs, etc. Those links are numbered by most clients, and ggwalker.py do the same. You navigate to those links by inputting the link number. For example:

...
 1 (TXT) A text file (relative to this gopgermap)
 2 (BIN) A pdf file (relative to the gopher site)
 3 (PIC) an image file
 4 (DIR) The stuff directory (relative to this gopgermap)
 5 (DIR) The stuff directory (relative to the gopher site)
...

walker> 2

Entering number two above takes you to the pdf file, which will be open in the default application for pdf reading in your system. Note that each time you navigate to a link, you are leaving the page and so the page links are not longer available. However when you get back to the page, they become available again.

links (l)

The links shown when the page is output are the human readable label for the link. You can use the link command to see the real link. Using the previous example:

walker> l
 1 (TXT) stuff/text.txt
 2 (BIN) /stuff/a-file.pdf
 3 (PIC) stuff/image.jpg
 4 (DIR) stuff
 5 (DIR) /stuff
...

walker>
back (b)

When you are in a page, sometimes you want to go to the previous page. You can do that using the back command. You can keep going back until you reach the initial page of the site. In which case, back just reload that page.

forward (f)

If you have used the back command, you may want to go forward to the page in which you were before. You do that using the forward command. If you reached the last page, then forward just reload that last page.

You can think of back and forward as the back and forward arrows in a browser.

Miscellaneous

These are debugging commands.

dump

This command just dump all the internal data structures.

Conclusion

This utility may be useful for people creating Gopher holes or Gemini capsules by hand in their local machines. It allows to test and inspect the Gopher hole or Gemini capsule before deploying them into the hosting environment.

It was developed as a complement to he Test-Hugo-2-Gopher-and-Gemini repository. Which in turn was created to test the Hugo-2-Gopher-and-Gemini generated Gopher holes and Gemini capsules.