summaryrefslogtreecommitdiff
path: root/blog
blob: bd7e71e531f28360f7e7c330f105bf1caca05921 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#!/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 '<!DOCTYPE html><html><head><title>$$TITLE</title></head><body>' > templates/header.html
	printf '</body></html>' > templates/footer.html
	printf '<ul>' > templates/index_header.html
	printf '<li><a href="$$URL">$$DATE $$TITLE</a></li>' > templates/index_entry.html
	printf '</ul>' > templates/index_footer.html
	printf '<h1>$$TITLE</h1>' > 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/</\&lt;/g' \
		-e 's/>/\&gt;/g' \
		-e '/^```$$/{s,.*,,;x;p;/^<\/code>/d;s,.*,<pre><code>,;bT}' \
		-e 'x;/<\/code>/{x;$$G;p;d};x' \
		-e '/^####/{s,^####,<h4>,;s,$$,</h4>,;H;s,.*,,;x;p;d}' \
		-e '/^###/{s,^###,<h3>,;s,$$,</h3>,;H;s,.*,,;x;p;d}' \
		-e '/^##/{s,^##,<h2>,;s,$$,</h2>,;H;s,.*,,;x;p;d}' \
		-e '/^#/{s,^#,<h1>,;s,$$,</h1>,;H;s,.*,,;x;p;d}' \
		-e 's,\*\*\(\([^*][^*]*\*\?\)*\)\*\*,<b>\1</b>,g' \
		-e 's,\*\([^*][^*]*\)\*,<i>\1</i>,g' \
		-e 's,!\[\([^]]*\)\](\([^)]*\)),<img src="\2" alt="\1"/>,g' \
		-e 's,\[\([^]]*\)\](\([^)]*\)),<a href="\2">\1</a>,g' \
		-e 's,`\([^`]*\)`,<q>\1</q>,g' \
		-e '/^- /{s,^- ,<li>,;s,$$,</li>,;x;/^<\/ul>/{x;bL};p;s,.*,<ul>,;bT}' \
		-e '/^[1-9][0-9]*\. /{s,^[0-9]*\. ,<li>,;s,$$,</li>,;x;/^<\/ol>/{x;bL};p;s,.*,<ol>,;bT}' \
		-e '/^$$/{x;/^$$/d;p;d}' \
		-e 'x;/^$$/{s,.*,<p>,;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 >> $@; \