23/11 2019 d1faa7e
Static Sites With Bash

After going through a bunch of static site generators (pelican, hugo, vite), I decided to roll my own. If you are more of the ‘show me the code’ kinda guy, here you go.

Text formatting: I chose to write in markdown, and convert to html with lowdown.

Directory structure: I host my site on GitHub pages, so docs/ has to be the entry point. Markdown formatted posts go into posts/, get converted into html, and end up in docs/index.html, something like this:

posts=$(ls -t ./posts)     # chronological order!
for f in $posts; do
    file="./posts/"$f      # `ls` mangled our file paths
    echo "generating post $file"

    html=$(lowdown "$file")
    echo -e "html" >> docs/index.html
done

Assets: Most static site generators recommend dropping image assets into the site source itself. That does have it’s merits, but I prefer hosting images separately:

# strip file extension
ext="${1##*.}"

# generate a random file name
id=$( cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 2 | head -n 1 )
id="$id.$ext"

# copy to my file host
scp -P 443 "$1" emerald:files/"$id" 
echo "https://files.nerdypepper.tech/$id"

Templating: generate.sh brings the above bits and pieces together (with some extra cruft to avoid javascript). It uses sed to produce nice titles from the file names (removes underscores, title-case), and date(1) to add the date to each post listing!

⟵ Back