#!/bin/sh blog_domain='https://blog.kageru.moe/' output() { echo "$1" >> index.html } output_rss() { echo "$1" >> rss.xml } add_header() { output '

Blog index

' output_rss ' kageru kageru’s blog' output_rss " kageru’s blog" } add_footer() { html_entry "legacy" "before 2020" "Older posts" output '' output_rss '' } html_entry() { output '' path="$1" time="$2" title="$3" output "$title" output "$time" } rss_entry() { # The content is the output minus the first line # (which would otherwise be a redundant title in most rss readers) # and with escaped html. # The sed expression is stolen from https://stackoverflow.com/questions/12873682/12873723#12873723 output_rss " $1 $blog_domain$2 $(tail -n+2 "$2" | sed 's/&/\&/g; s//\>/g; s/"/\"/g; s/'"'"'/\'/g') " } create_entry() { path="$9" outpath="content/$(basename "$path" .md).html" # convert new markdown posts to html pandoc "$path" -t html -f markdown -o "$outpath" # then add it to the index title="$(rg 'h1' "$outpath" | head -n1 | rg -o '(?<=>).*(?=<)' --pcre2)" created=$(git log --follow --format=%as "$path" | tail -1) html_entry "$outpath" "created on $created" "$title" rss_entry "$title" "$outpath" } has_updates() { git fetch &> /dev/null diff="$(git diff master origin/master)" if [ "$diff" ]; then return 0 else return 1 fi } cd /home/nginx/html/blog if has_updates; then git pull &> /dev/null rm -f index.html rm -f rss.xml add_header ls -ltu src/*.md | tail -n+1 | while read f; do create_entry $f; done add_footer # Human-readable output for the cron notification echo 'Updated blog to:' git log -1 fi