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!