#!/bin/bash # hitler.rip # script to build my website using pandoc # © 2025 hitler.rip # licensed under AGPLv3-or-later; see licenses/code.md for more information filterfile=$( realpath ./con/links.lua ) convert () { pandoc "$1" -o "$2" \ -f gfm -t html5 \ --lua-filter="$filterfile" } echo "[build] starting to build webpage..." rm -rf ./tmp/ rm -rf ./web mkdir -p ./con/ mkdir -p ./src/articles/ mkdir -p ./tmp/articles/ mkdir -p ./web/articles/ mkdir -p ./web/licenses/ mkdir -p ./web/links/ mkdir -p ./dir/ touch ./con/header.html touch ./con/footer.html touch ./con/style.css touch ./con/rss-header.xml touch ./con/rss-footer.xml touch ./con/contact.md touch ./src/index.md touch ./src/articles/index.md echo "[build] writing index..." cd ./src/ for i in *.md; do echo "[build] converting: $i" filename=$( echo "$i" | rev | cut -c4- | rev ) convert "$i" "../tmp/$filename.html" if [ "$filename" == "index" ]; then convert "../con/contact.md" "../tmp/con-contact-tmp-file.html" echo "[build] skipping index file for later..." else mkdir -p ../web/"$filename"/ cat ../con/header.html \ ../tmp/"$filename".html \ ../con/footer.html \ > ../web/"$filename"/index.html cp "$i" ../web/"$filename"/index.md fi done echo "[build] writing articles..." cd ./articles/ declare -A articlearr declare -a workingarr declare -a thebestarr for i in *.md; do echo "[build] converting: $i" filename=$( echo "$i" | rev | cut -c4- | rev ) convert "$i" "../../tmp/articles/$filename.html" if [ "$filename" == "index" ]; then echo "[build] skipping index file for later..." else mkdir -p ../../web/articles/"$filename"/ cat ../../con/header.html \ ../../tmp/articles/"$filename".html \ ../../con/footer.html \ > ../../web/articles/"$filename"/index.html cp "$i" ../../web/articles/"$filename"/index.md export WEBMETA_DATE="" if [ -e "$filename".meta ]; then echo "[build] running script: $filename.meta" source ./"$filename".meta # `.meta` is a simple shell script that uses `export` to # set some variables, notably: # WEBMETA_TITLE (title string) # WEBMETA_DATE (date string YYYY-MM-DD) # WEBMETA_AUTH (author string) # WEBMETA_SUMMARY (summary string) # please note that you have to actually check if this data is correct # and you should not just import random `.meta` files as they can arbitrarily # execute code on your system and are directly injected into the HTML. # # NOTE: # I do not expect to have multiple articles written on the same day # as I am a lazy fuck. The generator below does not expect multiple # articles to have the exact same date. # If I were you, I would maybe add hours and minutes to the timestamps # and maybe change this script accordingly. fi if [ "$WEBMETA_DATE" == "" ]; then export WEBMETA_DATE="2001-09-11*" fi articlearr["$filename"]="$WEBMETA_DATE" fi done echo "[build] sorting articles..." workingarr=($( sort -nr < <(printf '%s\n' "${articlearr[@]}") )) for date in "${workingarr[@]}"; do for key in "${!articlearr[@]}"; do if [ "${articlearr[$key]}" == "$date" ]; then thebestarr+=("$key") fi done done for i in "${thebestarr[@]}"; do export WEBMETA_TITLE="" export WEBMETA_DATE="" export WEBMETA_AUTH="" export WEBMETA_SUMMARY="" if [ -e "$i".meta ]; then echo "[build] re-running script: $i.meta" source ./"$i".meta # see above fi if [ "$WEBMETA_DATE" == "" ]; then export WEBMETA_DATE="2001-09-11*" fi if [ "$WEBMETA_AUTH" == "" ]; then export WEBMETA_AUTH="Anonymous" fi if [ "$WEBMETA_SUMMARY" == "" ]; then export WEBMETA_SUMMARY="redacted" fi if [ "$WEBMETA_TITLE" == "" ]; then export WEBMETA_TITLE="$i" fi if [ "$i" == "${thebestarr[0]}" ]; then tee ../../tmp/articles/gen-first-article-tmp.html > /dev/null << EOF

Latest Post:

See more Articles →
EOF tee ../../tmp/articles/gen-first-article-tmp.md > /dev/null << EOF ## Latest Post: ## [$WEBMETA_TITLE](/articles/$i) ###### \`$WEBMETA_DATE\` by $WEBMETA_AUTH $WEBMETA_SUMMARY EOF fi touch ../../tmp/articles/gen-articles-tmp-list.html tee -a ../../tmp/articles/gen-articles-tmp-list.html > /dev/null << EOF

$WEBMETA_TITLE

$WEBMETA_DATE by $WEBMETA_AUTH

$WEBMETA_SUMMARY

EOF touch ../../tmp/articles/gen-articles-tmp-list.md tee -a ../../tmp/articles/gen-articles-tmp-list.md > /dev/null << EOF ## [$WEBMETA_TITLE]($i) ###### \`$WEBMETA_DATE\` by $WEBMETA_AUTH $WEBMETA_SUMMARY EOF touch ../../tmp/articles/gen-articles-tmp-rss.xml tee -a ../../tmp/articles/gen-articles-tmp-rss.xml > /dev/null < $WEBMETA_TITLE $(date -d "${WEBMETA_DATE:0:10}" +"%a, %d %b %Y %H:%M:%S +0000") $WEBMETA_AUTH $WEBMETA_SUMMARY /articles/$i /articles/$i EOF done echo "[build] generating feed..." cd ../.. cat ./con/header.html \ ./tmp/index.html \ ./tmp/articles/gen-first-article-tmp.html \ ./tmp/con-contact-tmp-file.html \ ./con/footer.html \ > ./web/index.html cat ./src/index.md \ ./tmp/articles/gen-first-article-tmp.md \ ./con/contact.md \ > ./web/index.md cat ./con/header.html \ ./tmp/articles/index.html \ ./tmp/articles/gen-articles-tmp-list.html \ ./con/footer.html \ > ./web/articles/index.html cat ./src/articles/index.md \ ./tmp/articles/gen-articles-tmp-list.md \ > ./web/articles/index.md cat ./con/rss-header.xml \ ./tmp/articles/gen-articles-tmp-rss.xml \ ./con/rss-footer.xml \ > ./web/articles/feed.xml echo "[build] creating links..." tee ./tmp/temp-content-links-site.html > /dev/null << EOF

Links

Dynamic Link generation is currently not possible. EOF cat ./con/header.html \ ./tmp/temp-content-links-site.html \ ./con/footer.html \ > ./web/links/index.html cd ./lnk/ for i in *.meta; do echo "[build] linking to: $i" filename=$( echo "$i" | rev | cut -c6- | rev ) content=$( cat "$i" ) mkdir -p ../web/links/"$filename"/ tee ../web/links/"$filename"/index.html > /dev/null << EOF $filename redirect... EOF done cd .. echo "[build] creating 404 page..." tee ./tmp/temp-404-page.html > /dev/null << EOF

not found :(

This page does not exist on this server. Return home. EOF cat ./con/header.html \ ./tmp/temp-404-page.html \ ./con/footer.html \ > ./web/404.html echo "[build] copying static files..." cp ./con/style.css ./web/style.css cp ./con/icon.png ./web/icon.png cp ./con/banner.png ./web/banner.png cp ./licenses/* ./web/licenses/ cp -r ./dir/* ./web/ echo "[build] removing temporary build files..." rm -rf ./tmp echo "[build] done!"