#!/usr/bin/make -f ifneq ($(filter-out help,$(MAKECMDGOALS)),) include config endif # The following can be configured in config BLOG_DATE_FORMAT_INDEX ?= %x BLOG_DATE_FORMAT ?= %x %X .PHONY: help init build deploy clean ARTICLES = $(shell git ls-tree HEAD --name-only -- articles/ 2>/dev/null) help: $(info blog init|build|deploy|clean) init: git init git config user.name '$(shell printf "Git user name: ">/dev/tty; head -n1)' git config user.email '$(shell printf "Git user email: ">/dev/tty; head -n1)' mkdir -p articles data templates printf '$$TITLE' > templates/header.html printf '' > templates/footer.html printf '' > templates/index_footer.html printf '

$$TITLE

' > templates/article_header.html printf '' > templates/article_footer.html printf 'blog\n' > .git/info/exclude git add . git commit -em "Initial commit" build: blog/index.html $(patsubst articles/%,blog/%.html,$(ARTICLES)) deploy: build rsync -rLtvz blog/ data/ $(BLOG_REMOTE) clean: rm -rf blog config: printf 'BLOG_REMOTE:=%s\n' \ '$(shell printf "Blog remote (eg: host:/var/www/html): ">/dev/tty; head -n1)' \ > $@ blog/index.html: $(ARTICLES) $(addprefix templates/,$(addsuffix .html,header index_header index_entry index_footer footer)) mkdir -p blog TITLE="index"; \ export TITLE; \ envsubst < templates/header.html > $@ envsubst < templates/index_header.html >> $@ for f in $(ARTICLES); do \ printf '%s ' "$$f"; \ git log --diff-filter=A --date="format:%s $(BLOG_DATE_FORMAT_INDEX)" --pretty=format:'%ad ' -- "$$f"; \ done | sort -k2nr | cut -d" " -f1,3- | while IFS=" " read -r FILE DATE; do \ URL="`printf '%s' "\$$FILE" | sed 's,^articles/,,'`.html" \ DATE="$$DATE" \ TITLE="`head -n1 "\$$FILE"`" \ envsubst < templates/index_entry.html; \ done >> $@ envsubst < templates/index_footer.html >> $@ envsubst < templates/footer.html >> $@ blog/%.html: articles/% $(addprefix templates/,$(addsuffix .html,header article_header article_footer footer)) mkdir -p blog TITLE="$(shell head -n1 $<)"; \ export TITLE; \ DATE_POSTED="$(shell git log --diff-filter=A --date="format:$(BLOG_DATE_FORMAT)" --pretty=format:'%ad' -- "$<")"; \ export DATE_POSTED; \ DATE_EDITED="$(shell git log -n 1 --date="format:$(BLOG_DATE_FORMAT)" --pretty=format:'%ad' -- "$<")"; \ export DATE_EDITED; \ TAGS="$(shell grep -i '^; *tags:' "$<" | cut -d: -f2- | paste -sd ',')"; \ export TAGS; \ envsubst < templates/header.html > $@; \ envsubst < templates/article_header.html >> $@; \ sed -e 1d \ -e '/^;/d' \ -e 's//\>/g' \ -e '/^```$$/{s,.*,,;x;p;/^<\/code>/d;s,.*,
,;bT}' \
		-e 'x;/<\/code>/{x;$$G;p;d};x' \
		-e '/^####/{s,^####,

,;s,$$,

,;H;s,.*,,;x;p;d}' \ -e '/^###/{s,^###,

,;s,$$,

,;H;s,.*,,;x;p;d}' \ -e '/^##/{s,^##,

,;s,$$,

,;H;s,.*,,;x;p;d}' \ -e '/^#/{s,^#,

,;s,$$,

,;H;s,.*,,;x;p;d}' \ -e 's,\*\*\(\([^*][^*]*\*\?\)*\)\*\*,\1,g' \ -e 's,\*\([^*][^*]*\)\*,\1,g' \ -e 's,!\[\([^]]*\)\](\([^)]*\)),\1,g' \ -e 's,\[\([^]]*\)\](\([^)]*\)),\1,g' \ -e 's,`\([^`]*\)`,\1,g' \ -e '/^$$/{x;/^$$/d;p;d}' \ -e 'x;/^$$/{s,.*,

,;bT};x' \ -e ':L;$$G;p;d' \ -e ':T;p;:t;s,<\([^/>][^>]*\)>\(\(<[^/>][^>]*>\)*\),\2,;/<[^\/>]/bt;x;/^$$/{$${x;p};d};bL' \ "$<" | envsubst >> $@; \ envsubst < templates/article_footer.html >> $@; \ envsubst < templates/footer.html >> $@; \