$ git clone -q https://github.com/biox/pa.git
$ cd pa/contrib
$ ls -1 -p
pa-bemenu
pa-completion.bash
pa-completion.fish
pa-dmenu
pa-fuzzel
pa-pass
pa-rekey
pa-rofi
pa-ssg
pa-urn
pa-wmenu
$ nl -b a -s ' ' -w 3 pa-ssg
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#!/bin/sh
#
# pa's static site generator from repo

genpage() {
    if [ -f "$file" ]; then
        dir=$(dirname "$file")
        title=pa/$file
    else
        dir=$file
        title=pa/$file/
    fi

    url=https://github.com/biox/pa

    printf '<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<meta name="color-scheme" content="light dark">
<title>%s</title>
<style>
body{
  font-family:monospace;
  font-size:10pt;
  margin-left:auto;
  margin-right:auto;
  width:84ch;
}
a{color:black;text-decoration:none;}
@media(prefers-color-scheme:dark){a{color:white;}}
a:hover{background-color:#ddd;color:black;}
#file{display:flex;flex-direction:row;gap:1ch;}
.l{color:#555;}
.l:target{color:#b82;}
pre{margin:0;}
</style>
</head>
<body>
<pre><code>$ git clone -q <a href="%s">%s</a>.git
$ cd ' "$title" "$url" "$url"

    if [ "$dir" = "." ]; then
        printf 'pa\n'
    else
        printf '<a href="../index.html">%s/</a>' "$(dirname "pa/$dir")"
        basename "$dir"
    fi

    printf '$ ls -1 -p\n'

    git ls-tree --name-only HEAD "$dir/" | while read -r entry; do
        name=$(basename "$entry")
        if [ -d "$entry" ]; then
            printf '<a href="%s/index.html">%s/</a>\n' "$name" "$name"
        elif [ "$entry" = "$file" ]; then
            printf '<strong>%s</strong>\n' "$name"
        elif [ "$entry" = "README" ]; then
            printf '<a href="index.html">README</a>\n'
        else
            printf '<a href="%s.html">%s</a>\n' "$name" "$name"
        fi
    done

    if [ -d "$file" ]; then
        printf '</code></pre>\n</body>\n</html>\n'
        return
    fi

    raw=$(basename "$file")
    if [ "$file" = "README" ] || [ "$file" = "LICENSE" ]; then
        printf '$ cat <a href="%s">%s</a>\n' "$raw" "$raw"
        printf '</code></pre>\n<div id="file">\n<pre><code>'
    else
        printf '$ nl -b a -s '"' '"' -w 3 <a href="%s">%s</a>\n' "$raw" "$raw"
        printf '</code></pre>\n<div id="file">\n<pre>'
        l=1
        while [ "$l" -le "$(wc -l "$file" | cut -d' ' -f1)" ]; do
            printf '<a href="#L%d" id="L%d" class="l">%3d</a>\n' "$l" "$l" "$l"
            l=$((l + 1))
        done
        printf '</pre>\n<pre><code>'
    fi

    sed -e 's & \&amp; g' \
        -e 's < \&lt; g' \
        -e 's \(https://[^ ">]\+\) <a\ href="\1">\1</a> g' "$file"

    printf '</code></pre>\n</div>\n</body>\n</html>\n'
}

gen404() {
    printf '<!DOCTYPE html>
<html lang="en">
<meta charset="utf-8">
<meta http-equiv="Refresh" content="0; URL=/%s">
<meta name="color-scheme" content="light dark">
<title>pa: not found</title>
</html>\n' "$1"
}

cd "$(git -C "$(dirname "$0")" rev-parse --show-toplevel)" || exit

git ls-tree -dr --name-only HEAD | while read -r file; do
    mkdir -p "site/$file"
    genpage >"site/$file/index.html"
    gen404 "$file" >"site/$file/404.html"
done

git ls-tree -r --name-only HEAD | while read -r file; do
    cp "$file" "site/$file"
    genpage >"site/$file.html"
done

cp "site/README.html" "site/index.html"
gen404 >"site/404.html"