blob: d079cf8b1b2bf0234f4954dd7e28eab3da381c83 (
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
117
118
119
120
121
122
123
124
125
126
127
128
|
### 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
### 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_DIR}/${BLOG_DIR}/index.md
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 ######################
.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
COPY = cp -p
PANDOC := pandoc \
--highlight-style=kate \
--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 ######################
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: install serve rsync clean
install:
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
|