Added list2map.sh tool
This commit is contained in:
+27
-1
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Bopher Tools is a small collection of simple shell scripts that:
|
Bopher Tools is a small collection of simple shell scripts that:
|
||||||
|
|
||||||
- are written in pure Bash with no external dependencies;
|
- are written in pure Bash with no external dependencies (unless explicitly stated otherwise);
|
||||||
- are totally independent from each other (but can be combined in the true spirit of Unix philosophy);
|
- are totally independent from each other (but can be combined in the true spirit of Unix philosophy);
|
||||||
- only accept input from stdin and only output their results into stdout;
|
- only accept input from stdin and only output their results into stdout;
|
||||||
- aim to ease your life when it comes to creating and publishing your own content in Gopherspace.
|
- aim to ease your life when it comes to creating and publishing your own content in Gopherspace.
|
||||||
@@ -133,3 +133,29 @@ When running `cat example.gmi | bash gmi2txt.sh 67 5`, this file translates to t
|
|||||||
|
|
||||||
See ya!
|
See ya!
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## `list2map.sh`
|
||||||
|
|
||||||
|
This tool, which probably is the smallest but the most sophisticated one in the entire collection, accepts the list of files and directories (possibly generated with `find` command) and generates, line by line, a portion of Gophermap based on their type (for this, it requires the external `file` command dependency), root directory name and hostname/port number optionally passed to the script on invocation. The tool automatically applies the following rules:
|
||||||
|
|
||||||
|
- only the basename part of the file/directory is used as the entry name/description;
|
||||||
|
- if the file is a directory (MIME type `inode/directory`), the generated selector will actually refer to the `index.map` file in that directory and the entry type will be 1;
|
||||||
|
- files (or directories) named `index.map` are not themselves included in the output;
|
||||||
|
- if the file's MIME type starts with `text`, the entry type will be set to 0, otherwise it will be set to 9.
|
||||||
|
|
||||||
|
Note that the tool itself doesn't do any filtering on input names or how they are presented. All filtering, if necessary, should be done on the `find` invocation step.
|
||||||
|
|
||||||
|
Example - build a Gophermap fragment from this repo's starting directory, excluding all dotfiles, using `.` as root and assuming we'll serve this map from `example.com:777`:
|
||||||
|
```
|
||||||
|
$ find . ! -path '.' ! -path '*/.*' | bash tools/list2map.sh . example.com 777
|
||||||
|
0COPYING /COPYING example.com 777
|
||||||
|
1tools /tools/index.map example.com 777
|
||||||
|
0gopherinfo.sh /tools/gopherinfo.sh example.com 777
|
||||||
|
0phlow.sh /tools/phlow.sh example.com 777
|
||||||
|
0gmi2map.sh /tools/gmi2map.sh example.com 777
|
||||||
|
0gmi2txt.sh /tools/gmi2txt.sh example.com 777
|
||||||
|
0README-tools.md /tools/README-tools.md example.com 777
|
||||||
|
0list2map.sh /tools/list2map.sh example.com 777
|
||||||
|
0bopher-ng.sh /bopher-ng.sh example.com 777
|
||||||
|
0README.md /README.md example.com 777
|
||||||
|
```
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# A simple tool for Gophermap fragment generation from existing file/directory lists
|
||||||
|
# Depends on file external command to determine the type
|
||||||
|
#
|
||||||
|
# Usage: find [root] [params] | list2map.sh
|
||||||
|
#
|
||||||
|
# Created by Luxferre in 2023, released into public domain
|
||||||
|
|
||||||
|
shopt -s extglob # enable extended pattern matching (just to be sure)
|
||||||
|
|
||||||
|
RDIR="$1" # root directory, no substitution if empty
|
||||||
|
THOST="$2" # can be empty per spec
|
||||||
|
TPORT="$3" # can be empty too
|
||||||
|
INDEXFILE='index.map' # the basename to consider an index file
|
||||||
|
|
||||||
|
typequery() { # external command wrapper to fetch the file's MIME type
|
||||||
|
local res="$(file -Nn --mime-type "$1")"
|
||||||
|
printf '%s' "${res##*: }"
|
||||||
|
}
|
||||||
|
|
||||||
|
while read -rs fpath; do # fully line-based operation
|
||||||
|
ftype="$(typequery "$fpath")" # MIME type here
|
||||||
|
bname="${fpath##*/}" # basename here
|
||||||
|
[[ "$bname" == "$INDEXFILE" ]] && continue # skip index map
|
||||||
|
etype=9 # default map entry type is binary until proven otherwise
|
||||||
|
esel="${fpath##$RDIR}" # if RDIR is empty, they are the same
|
||||||
|
if [[ "$ftype" == 'inode/directory' ]]; then # it's a directory
|
||||||
|
etype=1
|
||||||
|
esel="${esel}/${INDEXFILE}" # update the selector
|
||||||
|
elif [[ "${ftype%%/*}" == 'text' ]]; then # update etype for text files
|
||||||
|
etype=0
|
||||||
|
fi
|
||||||
|
# output the RFC-compliant Gophermap line
|
||||||
|
printf '%s%s\t%s\t%s\t%s\r\n' "$etype" "$bname" "$esel" "$THOST" "$TPORT"
|
||||||
|
done
|
||||||
Reference in New Issue
Block a user