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") FEED_SRC := $(shell grep -l "^feed: *true$$" $(CONTENT_SRC)) CONTENT_TEMPLATES_SRC := $(shell find templates -type f -name "*.html") FEED_TEMPLATES_SRC := $(shell find templates -type f -name "*.xml") 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)) FEED_FILES := $(patsubst content/%.md,out/%.xml,$(FEED_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 feed_files static_files font_files css_files content_meta: $(CONTENT_META) content_files: $(CONTENT_FILES) feed_files: $(FEED_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 scripts/metadata_tpl.json | .cache/meta $(info [META] $< -> $@) mkdir -p $(@D) $(eval PAGES_FILES = $(filter .cache/meta/%.json,$^)) $(eval NAMESPACE = $(call namespace,$@,.cache/meta)) $(if $(PAGES_FILES),jq -s --arg namespace "$(NAMESPACE)" -f scripts/subpages.jq $(PAGES_FILES) > "$@.pages",echo "{}" > "$@.pages") pandoc \ -f markdown-citations \ -t html5 \ --no-highlight \ --template scripts/metadata_tpl.json \ --metadata namespace="$(NAMESPACE)" \ --metadata file_out="$(patsubst .cache/meta/%.json,out/%.html,$@)" \ --metadata-file "$@.pages" \ -o "$@.meta" "$<" pandoc \ -f markdown-citations \ -t html5 \ -o "$@.content" "$<" jq '. + { content: $$content }' --rawfile content "$@.content" "$@.meta" > "$@" rm "$@.pages" rm "$@.meta" rm "$@.content" out/%.html: content/%.md .cache/meta/%.json $(CONTENT_TEMPLATES_SRC) metadata/*.yaml filters/*.lua scripts/metadata_filter.lua out/style.css | 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,$^)" \ --metadata file_out="$@" \ --metadata style_hash="$(shell sha256sum out/style.css | cut -d ' ' -f 1)" \ $(PANDOC_FILTERS) \ -o "$@" "$<" out/%.xml: content/%.md .cache/meta/%.json $(FEED_TEMPLATES_SRC) metadata/*.yaml filters/*.lua scripts/metadata_filter.lua | out $(info [FEED] $< -> $@) mkdir -p $(@D) pandoc \ -f markdown-citations \ -t html5 \ --no-highlight \ --template templates/feed.xml \ --lua-filter scripts/metadata_filter.lua \ $(GLOBAL_METADATA) \ --metadata-file "$(filter .cache/meta/%.json,$^)" \ --metadata file_out="$@" \ $(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+=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: mkdir -p .cache out: mkdir -p out # # UTILITIES # watch: all while true; do \ inotifywait -qr -e modify -e create -e delete -e move assets content filters metadata scripts templates; \ $(MAKE); \ done serve: all python -m http.server --bind 127.0.0.1 --directory out 8000 dev: watch serve 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\\)'` deploy: compress rsync --progress --stats -rvz --delete out/ "$(DEPLOY_TARGET)" clean: rm -rf out .PHONY: all watch serve dev deploy clean