aboutsummaryrefslogtreecommitdiff
path: root/Makefile
blob: 9a4ee0f6ee8773ec00a9324aee4244117e610bb5 (plain) (blame)
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
### CHANGE ME ######################
DOMAIN             = www.sacredheartsc.com
URL                = https://${DOMAIN}
RSYNC_TARGET       = ${DOMAIN}:/var/www/${DOMAIN}
FEED_TITLE         = Cullum Smith's Blog
FEED_DESCRIPTION   = Dad, southerner, unix wrangler, banjo enjoyer
STATIC_REGEX       = .*\.(html|css|jpg|jpeg|png|ico|xml|txt|asc|webmanifest)
RECENT_POSTS_LIMIT = 5
HIGHLIGHT_STYLE    = kate


### VARIABLES ######################
SOURCE_DIR         = src
OUTPUT_DIR         = public
SCRIPT_DIR         = scripts
BLOG_DIR           = blog

TEMPLATE           = templates/default.html
CV_TEMPLATE        = templates/cv.html
DEFAULTS           = defaults.yaml

BLOG_LIST_SCRIPT   = ${SCRIPT_DIR}/bloglist.py
BLOG_LIST_REPLACE  = __BLOG_LIST__
BLOG_LIST_FILE     = .bloglist.md

BLOG_RSS_SCRIPT    = ${SCRIPT_DIR}/rss.py
BLOG_RSS_FILE      = ${BLOG_DIR}/feed.xml

SOURCE_DIRS       != find ${SOURCE_DIR} -mindepth 1 -type d
SOURCE_HOMEPAGE   := ${SOURCE_DIR}/index.md
SOURCE_BLOGLIST   := ${SOURCE_DIR}/${BLOG_DIR}/index.md
SOURCE_CV         := ${SOURCE_DIR}/cv/index.md
SOURCE_SPECIAL    := ${SOURCE_HOMEPAGE} ${SOURCE_BLOGLIST} ${SOURCE_CV}
SOURCE_MARKDOWN   != find ${SOURCE_DIR} -type f -name '*.md' ! -name ${BLOG_LIST_FILE} ${SOURCE_SPECIAL:C/^/! -path /}
SOURCE_STATIC     != find -E ${SOURCE_DIR} -type f -iregex ${STATIC_REGEX:Q}

BLOG_POSTS        != find ${SOURCE_DIR}/${BLOG_DIR} -type f -name '*.md' ! -name ${BLOG_LIST_FILE} ! -path ${SOURCE_BLOGLIST}
RECENT_POST_LIST   = ${SOURCE_DIR}/${BLOG_LIST_FILE}
FULL_POST_LIST     = ${SOURCE_DIR}/${BLOG_DIR}/${BLOG_LIST_FILE}

SOURCE2OUTPUT      = S/^${SOURCE_DIR}\//${OUTPUT_DIR}\//
SOURCE2HTML        = ${SOURCE2OUTPUT}:S/.md$$/.html/
OUTPUT2SOURCE      = S/^${OUTPUT_DIR}\//${SOURCE_DIR}\//
HTML2SOURCE        = ${OUTPUT2SOURCE}:S/.html$$/.md/

OUTPUT_DIRS       := ${SOURCE_DIRS:${SOURCE2OUTPUT}}
OUTPUT_HOMEPAGE   := ${SOURCE_HOMEPAGE:${SOURCE2HTML}}
OUTPUT_BLOGLIST   := ${SOURCE_BLOGLIST:${SOURCE2HTML}}
OUTPUT_CV         := ${SOURCE_CV:${SOURCE2HTML}}
OUTPUT_SPECIAL    := ${SOURCE_SPECIAL:${SOURCE2HTML}}
OUTPUT_MARKDOWN   := ${SOURCE_MARKDOWN:${SOURCE2HTML}}
OUTPUT_STATIC     := ${SOURCE_STATIC:${SOURCE2OUTPUT}}
OUTPUT_RSS        := ${OUTPUT_DIR}/${BLOG_RSS_FILE}


### BUILD COMMANDS ######################
COPY                  = cp -p
PANDOC               := pandoc --highlight-style=${HIGHLIGHT_STYLE} --metadata=feed:/${BLOG_RSS_FILE} --defaults=${DEFAULTS}
GENERATE_RSS         := ${BLOG_RSS_SCRIPT} ${SOURCE_DIR}/${BLOG_DIR} --title=${FEED_TITLE:Q} --description=${FEED_DESCRIPTION:Q} --url=${URL:Q} --blog-path=/${BLOG_DIR} --feed-path=/${BLOG_RSS_FILE}
GENERATE_BLOGLIST    := ${BLOG_LIST_SCRIPT} ${SOURCE_DIR}/${BLOG_DIR}
INTERPOLATE_BLOGLIST  = sed -e '/${BLOG_LIST_REPLACE}/{r ${BLOGLIST_HTML}' -e 'd;}'


### TARGETS ######################
.SHELL: name=sh quiet="set -" echo="set -v" filter="set -" hasErrCtl=yes check="set -eo pipefail" ignore="set +e" echoFlag=v errFlag=e path=/bin/sh

public: ${OUTPUT_DIRS} ${OUTPUT_SPECIAL} ${OUTPUT_MARKDOWN} ${OUTPUT_STATIC} ${OUTPUT_RSS}

${OUTPUT_DIRS}:
	mkdir -p $@

# Homepage
${OUTPUT_HOMEPAGE}: ${SOURCE_HOMEPAGE} ${RECENT_POST_LIST} ${TEMPLATE} BLOGLIST_HTML=${RECENT_POST_LIST}
	${INTERPOLATE_BLOGLIST} ${SOURCE_HOMEPAGE} | ${PANDOC} --template=${TEMPLATE} --output=$@

# HTML for partial blog listing
${RECENT_POST_LIST}: ${BLOG_POSTS} ${BLOG_LIST_SCRIPT}
	${GENERATE_BLOGLIST} ${RECENT_POSTS_LIMIT} > $@

# CV
${OUTPUT_CV}: ${SOURCE_CV} ${CV_TEMPLATE}
	${PANDOC} --template=${CV_TEMPLATE} --output=$@ ${SOURCE_CV}

# Main blog page
${OUTPUT_BLOGLIST}: ${SOURCE_BLOGLIST} ${FULL_POST_LIST} ${TEMPLATE} BLOGLIST_HTML=${FULL_POST_LIST}
	${INTERPOLATE_BLOGLIST} ${SOURCE_BLOGLIST} | ${PANDOC} --template=${TEMPLATE} --output=$@

# HTML for full blog listing
${FULL_POST_LIST}: ${BLOG_POSTS} ${BLOG_LIST_SCRIPT}
	${GENERATE_BLOGLIST} > $@

# RSS feed
${OUTPUT_RSS}: ${BLOG_POSTS} ${BLOG_RSS_SCRIPT}
	${GENERATE_RSS} > $@

# Blog posts
${OUTPUT_MARKDOWN}: ${@:${HTML2SOURCE}} ${TEMPLATE}
	${PANDOC} --template=${TEMPLATE} --output=$@ ${@:${HTML2SOURCE}}

# Static assets
${OUTPUT_STATIC}: ${@:${OUTPUT2SOURCE}}
	${COPY} ${@:${OUTPUT2SOURCE}} $@

.PHONY: deps serve rsync clean
deps:
	pip install -r requirements.txt

serve: public
	cd ${OUTPUT_DIR} && python3 -m http.server

rsync: public
	rsync -rlphv --delete ${OUTPUT_DIR}/ ${RSYNC_TARGET}

clean:
	rm -rf ${OUTPUT_DIR}
	find ${SOURCE_DIR} -type f -name ${BLOG_LIST_FILE} -delete