#!/bin/sh set -eu MARKDOWN=smu IFS=' ' # Create tab separated file with filename, title, creation date, last update index_tsv() { for f in "$1"/*.md do title=$(sed -n '/^# /{s/# //p; q}' "$f") printf '%s\t%s\t%s\t%s\n' "$f" "${title:="No Title"}" done } index_html() { # Print header title=$(sed -n '/^# /{s/# //p; q}' index.md) sed "s/{{TITLE}}/$title/" header.html # Intro text $MARKDOWN index.md echo "" # Print footer after post list cat footer.html } atom_xml() { uri=$(sed -rn '/atom.xml/ s/.*href="([^"]*)".*/\1/ p' header.html) domain=$(echo "$uri" | sed 's/atom.xml//g' | sed 's|/[^/]*$||') first_commit_date=$(git log --pretty='format:%ai' . | cut -d ' ' -f1 | tail -1) cat < $(sed -n '/^# /{s/# //p; q}' index.md) $(date +%FT%TZ) $(git config user.name) $domain,$first_commit_date:default-atom-feed/ EOF while read -r f title created; do content=$($MARKDOWN "$f" | sed 's/&/\&/g; s//\>/g; s/"/\"/g; s/'"'"'/\'/g') post_link=$(echo "$f" | sed -E 's|posts/(.*).md|\1|') basic_date=$(echo $(head -3 "$f" | tail -1)) published_date=$(date -d $basic_date -u +%Y-%m-%dT10:%M:%SZ) cat < $title $content $domain/$post_link $published_date $published_date EOF done < "$1" echo '' } write_page() { filename=$1 directory=$(echo $(basename "$filename" .md)) $(mkdir -p build/$directory) target=$(echo "$filename" | sed -r 's|\w+/(.*).md|build/\1/index.html|') created=$(echo $(head -3 "$filename" | tail -1)) title=$2 $MARKDOWN "$filename" | \ cat header.html - |\ sed "s|{{TITLE}}|$title|" \ > "$target" && cat footer.html >> "$target" } rm -rf 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; do write_page "$f" "$title" "$created" done < build/posts.tsv # Pages index_tsv pages > build/pages.tsv while read -r f title created; do write_page "$f" "$title" "$created" done < build/pages.tsv