#!/bin/sh set -eu MARKDOWN=pandoc IFS=' ' # Create tab separated file with filename, title, creation date, last update index_tsv() { for f in "$1"/*.md do created=$(git log --pretty='format:%aI' "$f" 2> /dev/null | tail -1) updated=$(git log --pretty='format:%aI' "$f" 2> /dev/null | head -1) title=$(sed -n '/^# /{s/# //p; q;}' "$f") printf '%s\t%s\t%s\t%s\n' "$f" "${title:="No Title"}" "${created}" "${updated}" done } index_html() { # Print header title=$(sed -n '/^# /{s/# //p; q;}' index.md) sed -e 's/{{TITLE}}//g' header.html # Intro text $MARKDOWN index.md # Posts while read -r f title created updated; do link=$(echo "$f" | sed -E 's|.*/(.*).md|\1.html|') created=$(echo "$created" | sed -E 's/T.*//') # Reverse date from YYYY-MM-DD to DD-MM-YY created=$(echo "$created" | awk -F'-' '{printf("%02d-%02d-%02d\n",$3,$2,$1)}') echo "$created — $title
" done < "$1" # Print footer after post list year=$(date +"%Y") sed "s/{{YEAR}}/$year/" footer.html } atom_xml() { uri=$(sed -rn '/atom.xml/ s/.*href="([^"]*)".*/\1/ p' header.html) host=$(echo "$uri" | sed -r 's|.*//([^/]+).*|\1|') first_commit_date=$(git log --pretty='format:%ai' . | cut -d ' ' -f1 | tail -1) cat < https://justine.smithies.me.uk/public/favicon-32x32.png $(grep -o '<title>.*' header.html | sed 's/\(\|{{TITLE}}<\/title>\)//g') $(date -Iseconds) $(git config user.name) tag:$host,$first_commit_date:default-atom-feed EOF while read -r f title created updated; do day=$(echo "$created" | sed 's/T.*//') content=$($MARKDOWN "$f" | sed 's/&/\&/g; s//\>/g; s/"/\"/g; s/'"'"'/\'/g') cat < $title $content tag:$host,$day:$f $created $updated EOF done < "$1" echo '' } write_page() { filename=$1 target=$(echo "$filename" | sed -r 's|\w+/(.*).md|build/\1.html|') # year=$(date +"%Y") created=$(echo "$3" | sed 's/T.*//') # Reverse date from YYYY-MM-DD to DD-MM-YY created=$(echo "$created" | awk -F'-' '{printf("%02d-%02d-%02d\n",$3,$2,$1)}') updated=$(echo "$4" | sed 's/T.*//') # Reverse date from YYYY-MM-DD to DD-MM-YY updated=$(echo "$updated" | awk -F'-' '{printf("%02d-%02d-%02d\n",$3,$2,$1)}') dates_text="Published on ${created}" if [[ "$created" == "00-00-00" ]]; then dates_text="" elif [ "$created" != "$updated" ]; then dates_text="$dates_text ( Updated ${updated} )" fi title=$2 $MARKDOWN "$filename" | \ sed -e '1,/h1>/{/h1>/a\ '$dates_text'' -e '}' | \ cat header.html - | \ sed "s/{{TITLE}}/ - $title/" \ > "$target" && sed "s/{{YEAR}}/$year/" footer.html >> "$target" } rm -fr build && mkdir build # Blog posts index_tsv posts | sort -rt " " -k 3 > build/posts.tsv index_html build/posts.tsv > build/index.html atom_xml build/posts.tsv > build/atom.xml while read -r f title created updated; do write_page "$f" "$title" "$created" "$updated" done < build/posts.tsv # Pages index_tsv pages > build/pages.tsv while read -r f title created updated; do write_page "$f" "$title" "$created" "$updated" done < build/pages.tsv # Create public directory if it doesn't exist and sync with build/public mkdir -p public/ rsync -r public/ build/public