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
|
export DEPLOY_TARGET = vulpes@94.130.78.123:/srv/http/volpeon.ink/
-include Env.mk
#
# FILE GROUPS
#
PANDOC_FILTERS := $(patsubst %,--lua-filter %,$(wildcard filters/*.lua))
GLOBAL_METADATA := $(patsubst %,--metadata-file %,$(wildcard metadata/*.yaml))
CONTENT_SRC := $(shell find content -type f -name "*.md")
TEMPLATES_SRC := $(shell find templates -type f -name "*.html")
CSS_SRC := $(shell find assets/css -type f -name "*.scss")
CONTENT_META := $(patsubst content/%.md,.cache/meta/%.json,$(CONTENT_SRC))
CONTENT_FILES := $(patsubst content/%.md,out/%.html,$(CONTENT_SRC))
FONT_FILES := $(patsubst assets/fonts/%.ttf,out/%.woff2,$(wildcard assets/fonts/*.ttf))
CSS_FILES := $(patsubst assets/css/%.scss,out/%.css,$(wildcard assets/css/style.scss))
STATIC_FILES := $(patsubst content/%,out/%,$(shell find content -type f ! -name "*.md"))
#
# TARGETS
#
all: content_meta content_files static_files font_files css_files
content_meta: $(CONTENT_META)
content_files: $(CONTENT_FILES)
static_files: $(STATIC_FILES)
font_files: $(FONT_FILES)
css_files: $(CSS_FILES)
#
# RULES
#
.SECONDEXPANSION:
namespace = $(patsubst %/index,%,$(patsubst %.json,%,$(patsubst $(2)%,%,$(1))))
subpages = $(patsubst content/%.md,.cache/meta/%.json, \
$(shell test -d $(patsubst .cache/meta%,content%,$(1)) && find $(patsubst .cache/meta%,content%,$(1)) -maxdepth 1 -type f -name "*.md" ! -name "index.md") \
$(shell test -d $(patsubst .cache/meta%,content%,$(1)) && find $(patsubst .cache/meta%,content%,$(1)) -mindepth 2 -maxdepth 2 -type f -name "index.md"))
.cache/meta/%.json: content/%.md $$(call subpages,$$(call namespace,$$@,)) scripts/subpages.jq | .cache/meta
$(info [META] $< -> $@)
mkdir -p $(@D)
$(eval PAGES_FILES = $(filter .cache/meta/%.json,$^))
$(eval PAGES = $(shell mktemp))
$(eval NAMESPACE = $(call namespace,$@,.cache/meta))
$(file >$(PAGES),$(if $(PAGES_FILES),$(shell jq -s --arg namespace "$(NAMESPACE)" -f scripts/subpages.jq $(PAGES_FILES)),))
pandoc \
-f markdown-citations \
-t plain \
--no-highlight \
--template scripts/metadata_tpl.json \
--metadata namespace="$(NAMESPACE)" \
--metadata file_out="$(patsubst .cache/meta/%.json,out/%.html,$@)" \
--metadata-file "$(PAGES)" \
-o "$@" "$<"
rm "$(PAGES)"
out/%.html: content/%.md .cache/meta/%.json $(TEMPLATES_SRC) metadata/*.yaml filters/*.lua scripts/metadata_filter.lua | out
$(info [MARK] $< -> $@)
mkdir -p $(@D)
pandoc \
-f markdown-citations \
-t html5 \
--no-highlight \
--template templates/base.html \
--lua-filter scripts/metadata_filter.lua \
$(GLOBAL_METADATA) \
--metadata-file "$(filter .cache/meta/%.json,$^)" \
$(PANDOC_FILTERS) \
-o "$@" "$<"
out/%: content/% | out
$(info [COPY] $< -> $@)
mkdir -p $(@D)
cp "$<" "$@"
out/%.woff2: assets/fonts/%.ttf assets/fonts/glyphs.txt | out
$(info [FONT] $< -> $@)
pyftsubset "$<" \
--text-file="assets/fonts/glyphs.txt" \
--layout-features+=ss02,ss09,dlig \
--flavor="woff2" \
--output-file="$@"
out/%.css: assets/css/%.scss $(CSS_SRC) | out
$(info [SCSS] $< -> $@)
sassc -t compressed "$<" | ./node_modules/.bin/postcss --use autoprefixer --no-map > "$@"
.cache/meta: .cache
mkdir -p .cache/meta
.cache/pages: .cache
mkdir -p .cache/pages
.cache:
mkdir -p .cache
out:
mkdir -p out
#
# UTILITIES
#
compress: all
pigz -R -k -9 -- `find out -type f -iregex '.*\\.\\(css\\|js\\|json\\|html\\|xml\\|txt\\|svg\\|ico\\)'`
brotli -k -- `find out -type f -iregex '.*\\.\\(css\\|js\\|json\\|html\\|xml\\|txt\\|svg\\|ico\\|woff\\)'`
serve: all
python -m http.server --directory out 8000
deploy: compress
rsync --progress --stats -rvz --delete out "$(DEPLOY_TARGET)"
clean:
rm -rf out
|