From 5fe2440107941ba9a62539cb9503ad40a5a5a23d Mon Sep 17 00:00:00 2001 From: wi11-holdsworth <83637728+wi11-holdsworth@users.noreply.github.com> Date: Mon, 27 Jan 2025 22:16:57 +1100 Subject: [PATCH] site source --- Makefile | 204 +++++++++++++++++++++++++++++ articles/welcome.md | 18 +++ config | 7 + flake.lock | 57 ++++++++ flake.nix | 16 +++ shell.nix | 8 ++ tags/test | 2 + tags/welcome | 1 + templates/article_entry.html | 1 + templates/article_footer.html | 1 + templates/article_header.html | 1 + templates/article_list_footer.html | 1 + templates/article_list_header.html | 1 + templates/article_separator.html | 0 templates/footer.html | 1 + templates/header.html | 1 + templates/index_footer.html | 1 + templates/index_header.html | 1 + templates/tag_entry.html | 1 + templates/tag_index_footer.html | 1 + templates/tag_index_header.html | 1 + templates/tag_list_footer.html | 1 + templates/tag_list_header.html | 1 + templates/tag_separator.html | 1 + 24 files changed, 328 insertions(+) create mode 100644 Makefile create mode 100644 articles/welcome.md create mode 100644 config create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 shell.nix create mode 100644 tags/test create mode 100644 tags/welcome create mode 100644 templates/article_entry.html create mode 100644 templates/article_footer.html create mode 100644 templates/article_header.html create mode 100644 templates/article_list_footer.html create mode 100644 templates/article_list_header.html create mode 100644 templates/article_separator.html create mode 100644 templates/footer.html create mode 100644 templates/header.html create mode 100644 templates/index_footer.html create mode 100644 templates/index_header.html create mode 100644 templates/tag_entry.html create mode 100644 templates/tag_index_footer.html create mode 100644 templates/tag_index_header.html create mode 100644 templates/tag_list_footer.html create mode 100644 templates/tag_list_header.html create mode 100644 templates/tag_separator.html diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..9e316cc --- /dev/null +++ b/Makefile @@ -0,0 +1,204 @@ +#!/usr/bin/make -f + +BLOG := $(MAKE) -f $(lastword $(MAKEFILE_LIST)) --no-print-directory +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 +BLOG_TITLE ?= blog +BLOG_DESCRIPTION ?= blog +BLOG_URL_ROOT ?= http://localhost/blog +BLOG_FEED_MAX ?= 20 +BLOG_FEEDS ?= rss atom +BLOG_SRC ?= articles + + +.PHONY: help init build deploy clean + +ARTICLES = $(shell git ls-tree HEAD --name-only -- $(BLOG_SRC)/ 2>/dev/null) +TAGFILES = $(patsubst $(BLOG_SRC)/%.md,tags/%,$(ARTICLES)) + +help: + $(info blogit init|build|deploy|clean) + +init: + mkdir -p $(BLOG_SRC) data templates + printf '$$TITLE' > templates/header.html + printf '' > templates/footer.html + printf '

will holdsworth'\''s blog

' > templates/index_header.html + printf '

tags: ' > templates/tag_list_header.html + printf '#$$NAME' > templates/tag_entry.html + printf ', ' > templates/tag_separator.html + printf '

' > templates/tag_list_footer.html + printf '

posts

' > templates/article_list_footer.html + printf '


' > templates/index_footer.html + printf '

#$$TAGS

' > templates/tag_index_header.html + printf '' > templates/tag_index_footer.html + printf '

will holdsworth'\''s blog

$$TITLE

posted: $$DATE_POSTED
edited: $$DATE_EDITED

' > templates/article_header.html + printf '


' > templates/article_footer.html + printf 'blog\n' > .git/info/exclude + +build: blog/index.html tagpages $(patsubst $(BLOG_SRC)/%.md,blog/%.html,$(ARTICLES)) $(patsubst %,blog/%.xml,$(BLOG_FEEDS)) + +deploy: build + rsync -rLtvz $(BLOG_RSYNC_OPTS) blog/ data/ $(BLOG_REMOTE) + +clean: + rm -rf blog tags + +config: + printf 'BLOG_REMOTE:=%s\n' \ + '$(shell printf "Blog remote (eg: host:/var/www/html): ">/dev/tty; head -n1)' \ + > $@ + +tags/%: $(BLOG_SRC)/%.md + mkdir -p tags + grep -i '^; *tags:' "$<" | cut -d: -f2- | sed 's/ */\n/g' | sed '/^$$/d' | sort -u > $@ + +blog/index.html: $(ARTICLES) $(TAGFILES) $(addprefix templates/,$(addsuffix .html,header index_header tag_list_header tag_entry tag_separator tag_list_footer article_list_header article_entry article_separator article_list_footer index_footer footer)) + mkdir -p blog + TITLE="$(BLOG_TITLE)"; \ + export TITLE; \ + envsubst < templates/header.html > $@; \ + envsubst < templates/index_header.html >> $@; \ + envsubst < templates/tag_list_header.html >> $@; \ + first=true; \ + for t in $(shell cat $(TAGFILES) | sort -u); do \ + "$$first" || envsubst < templates/tag_separator.html; \ + NAME="$$t" \ + URL="@$$t.html" \ + envsubst < templates/tag_entry.html; \ + first=false; \ + done >> $@; \ + envsubst < templates/tag_list_footer.html >> $@; \ + envsubst < templates/article_list_header.html >> $@; \ + first=true; \ + for f in $(ARTICLES); do \ + printf '%s ' "$$f"; \ + git log --diff-filter=A --date="format:%s $(BLOG_DATE_FORMAT_INDEX)" --pretty=format:'%ad%n' -- "$$f"; \ + done | sort -k2nr | cut -d" " -f1,3- | while IFS=" " read -r FILE DATE; do \ + "$$first" || envsubst < templates/article_separator.html; \ + URL="`printf '%s' "\$$FILE" | sed 's,^$(BLOG_SRC)/\(.*\).md,\1,'`.html" \ + DATE="$$DATE" \ + TITLE="`head -n1 "\$$FILE" | sed -e 's/^# //g'`" \ + envsubst < templates/article_entry.html; \ + first=false; \ + done >> $@; \ + envsubst < templates/article_list_footer.html >> $@; \ + envsubst < templates/index_footer.html >> $@; \ + envsubst < templates/footer.html >> $@; \ + + +blog/tag/%.html: $(ARTICLES) $(addprefix templates/,$(addsuffix .html,header tag_header index_entry tag_footer footer)) + +.PHONY: tagpages +tagpages: $(TAGFILES) + +$(BLOG) $(patsubst %,blog/@%.html,$(shell cat $(TAGFILES) | sort -u)) + +blog/@%.html: $(TAGFILES) $(addprefix templates/,$(addsuffix .html,header tag_index_header tag_list_header tag_entry tag_separator tag_list_footer article_list_header article_entry article_separator article_list_footer tag_index_footer footer)) + mkdir -p blog + TITLE="Articles tagged $*"; \ + TAGS="$*"; \ + export TITLE; \ + export TAGS; \ + envsubst < templates/header.html > $@; \ + envsubst < templates/tag_index_header.html >> $@; \ + envsubst < templates/article_list_header.html >> $@; \ + first=true; \ + for f in $(shell grep -FH '$*' $(TAGFILES) | sed 's,^tags/\([^:]*\):.*,$(BLOG_SRC)/\1.md,'); do \ + printf '%s ' "$$f"; \ + git log --diff-filter=A --date="format:%s $(BLOG_DATE_FORMAT_INDEX)" --pretty=format:'%ad%n' -- "$$f"; \ + done | sort -k2nr | cut -d" " -f1,3- | while IFS=" " read -r FILE DATE; do \ + "$$first" || envsubst < templates/article_separator.html; \ + URL="`printf '%s' "\$$FILE" | sed 's,^$(BLOG_SRC)/\(.*\).md,\1,'`.html" \ + DATE="$$DATE" \ + TITLE="`head -n1 "\$$FILE" | sed -e 's/^# //g'`" \ + envsubst < templates/article_entry.html; \ + first=false; \ + done >> $@; \ + envsubst < templates/article_list_footer.html >> $@; \ + envsubst < templates/tag_index_footer.html >> $@; \ + envsubst < templates/footer.html >> $@; \ + + +blog/%.html: $(BLOG_SRC)/%.md $(addprefix templates/,$(addsuffix .html,header article_header article_footer footer)) + mkdir -p blog + TITLE="$(shell head -n1 $<)"; \ + export TITLE; \ + AUTHOR="$(shell git log -n 1 --reverse --format="%cn" -- "$<")"; \ + export AUTHOR; \ + 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/&/\&/g' \ + -e 's//\>/g' \ + -e '/^```$$/{s,.*,,;x;p;/^<\/code>/d;s,.*,
,;bT}' \
+		-e 'x;/<\/code>/{x;s,\$$,\$,g;$$G;p;d};x' \
+		-e 's,\\\$$,\$,g' \
+		-e '/^####/{s,^####,

,;s,$$,

,;H;s,.*,,;x;p;d}' \ + -e '/^###/{s,^###,

,;s,$$,

,;H;s,.*,,;x;p;d}' \ + -e '/^##/{s,^##,

,;s,$$,

,;H;s,.*,,;x;p;d}' \ + -e '/^#/{s,^#,

,;s,$$,

,;H;s,.*,,;x;p;d}' \ + -e 's,`\([^`]*\)`,\1,g' \ + -e 's,\*\*\(\([^*<>][^*<>]*\*\?\)*\)\*\*,\1,g' \ + -e 's,\*\([^*<>][^*<>]*\)\*,\1,g' \ + -e 's,!\[\([^]]*\)\](\([^)]*\)),\1,g' \ + -e 's,\[\([^]]*\)\](\([^)]*\)),\1,g' \ + -e '/^- /{s,^- ,
  • ,;s,$$,
  • ,;x;/^<\/ul>/{x;bL};p;s,.*, \ No newline at end of file diff --git a/templates/article_list_header.html b/templates/article_list_header.html new file mode 100644 index 0000000..2966721 --- /dev/null +++ b/templates/article_list_header.html @@ -0,0 +1 @@ +

    posts