#!/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_header.html
printf '- $$DATE $$TITLE
' > templates/index_entry.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/>/\>/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,!\[\([^]]*\)\](\([^)]*\)),
,g' \
-e 's,\[\([^]]*\)\](\([^)]*\)),\1,g' \
-e 's,`\([^`]*\)`,\1
,g' \
-e '/^- /{s,^- ,,;s,$$,,;x;/^<\/ul>/{x;bL};p;s,.*,,;bT}' \
-e '/^$$/{x;/^$$/d;p;d}' \
-e 'x;/^$$/{s,.*,,;bT};x' \
-e ':L;$$G;p;d' \
-e ':T;p;:t;s,<\([^/>][^>]*\)>\(\(<[^/>][^>]*>\)*\),\2\1>,;/<[^\/>]/bt;x;/^$$/{$${x;p};d};bL' \
"$<" | envsubst >> $@; \
envsubst < templates/article_footer.html >> $@; \
envsubst < templates/footer.html >> $@; \