summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xblog93
-rw-r--r--blog.137
2 files changed, 110 insertions, 20 deletions
diff --git a/blog b/blog
index bd7e71e..22d10e3 100755
--- a/blog
+++ b/blog
@@ -1,5 +1,6 @@
#!/usr/bin/make -f
+BLOG := $(MAKE) -f $(lastword $(MAKEFILE_LIST)) --no-print-directory
ifneq ($(filter-out help,$(MAKECMDGOALS)),)
include config
endif
@@ -12,56 +13,111 @@ BLOG_DATE_FORMAT ?= %x %X
.PHONY: help init build deploy clean
ARTICLES = $(shell git ls-tree HEAD --name-only -- articles/ 2>/dev/null)
+TAGFILES = $(patsubst articles/%,tags/%,$(ARTICLES))
help:
$(info blog init|build|deploy|clean)
init:
- git init
- git config user.name '$(shell printf "Git user name: ">/dev/tty; head -n1)'
- git config user.email '$(shell printf "Git user email: ">/dev/tty; head -n1)'
mkdir -p articles data templates
printf '<!DOCTYPE html><html><head><title>$$TITLE</title></head><body>' > templates/header.html
printf '</body></html>' > templates/footer.html
- printf '<ul>' > templates/index_header.html
- printf '<li><a href="$$URL">$$DATE $$TITLE</a></li>' > templates/index_entry.html
- printf '</ul>' > templates/index_footer.html
+ printf '' > templates/index_header.html
+ printf '<p>Tags:' > templates/tag_list_header.html
+ printf '<a href="$$URL">$$NAME</a>' > templates/tag_entry.html
+ printf ', ' > templates/tag_separator.html
+ printf '</p>' > templates/tag_list_footer.html
+ printf '<h2>Articles</h2><ul>' > templates/article_list_header.html
+ printf '<li><a href="$$URL">$$DATE $$TITLE</a></li>' > templates/article_entry.html
+ printf '' > templates/article_separator.html
+ printf '</ul>' > templates/article_list_footer.html
+ printf '' > templates/index_footer.html
+ printf '' > templates/tag_index_header.html
+ printf '' > templates/tag_index_footer.html
printf '<h1>$$TITLE</h1>' > templates/article_header.html
printf '' > templates/article_footer.html
printf 'blog\n' > .git/info/exclude
- git add .
- git commit -em "Initial commit"
-build: blog/index.html $(patsubst articles/%,blog/%.html,$(ARTICLES))
+build: blog/index.html tagpages $(patsubst articles/%,blog/%.html,$(ARTICLES))
deploy: build
rsync -rLtvz blog/ data/ $(BLOG_REMOTE)
clean:
- rm -rf blog
+ rm -rf blog tags
config:
printf 'BLOG_REMOTE:=%s\n' \
'$(shell printf "Blog remote (eg: host:/var/www/html): ">/dev/tty; head -n1)' \
> $@
-blog/index.html: $(ARTICLES) $(addprefix templates/,$(addsuffix .html,header index_header index_entry index_footer footer))
+tags/%: articles/%
+ 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="index"; \
export TITLE; \
- envsubst < templates/header.html > $@
- envsubst < templates/index_header.html >> $@
+ 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 ' -- "$$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,^articles/,,'`.html" \
+ DATE="$$DATE" \
+ TITLE="`head -n1 "\$$FILE"`" \
+ 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 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="Articles tagged $*"; \
+ export TITLE; \
+ 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/\([^:]*\):.*,articles/\1,'); 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,^articles/,,'`.html" \
DATE="$$DATE" \
TITLE="`head -n1 "\$$FILE"`" \
- envsubst < templates/index_entry.html; \
- done >> $@
- envsubst < templates/index_footer.html >> $@
- envsubst < templates/footer.html >> $@
+ 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: articles/% $(addprefix templates/,$(addsuffix .html,header article_header article_footer footer))
mkdir -p blog
@@ -99,3 +155,4 @@ blog/%.html: articles/% $(addprefix templates/,$(addsuffix .html,header article_
"$<" | envsubst >> $@; \
envsubst < templates/article_footer.html >> $@; \
envsubst < templates/footer.html >> $@; \
+
diff --git a/blog.1 b/blog.1
index 03c8c3a..308afae 100644
--- a/blog.1
+++ b/blog.1
@@ -71,6 +71,19 @@ Links are inserted using the following syntax: "[link text](url)".
Lines starting with a semi-colon are comments and are ignored.
It can be used to store metadata.
In particular, comments beginning with "tags:" indicate tags and are available in the templates in the TAGS variable.
+.TP
+.B Code blocks
+Code blocks start and end with ``` (this marker must be on its own line).
+The content is not formatted, and will appear as writter in the source file.
+.TP
+.B
+Unordered lists
+Each item starts with "- ".
+.TP
+.B
+Ordered lists
+Each item starts with "1. ", "2. " and so on.
+The numbers are not checked, so any number can actually be used.
.SH TEMPLATES
Templates are small HTML code chunks that are used to build the blog pages.
@@ -85,14 +98,34 @@ The index page is built using the following templates:
- index_header.html;
-- index_entry.html, for each article entry;
+- tag_list_header.html;
+
+- tag_entry.html, for each tag;
+
+- tag_separator.html, between each tag;
+
+- tag_list_footer.html;
+
+- article_list_header.html;
+
+- article_entry.html, for each article entry;
+
+- article_separator.html, between each article;
+
+- article_list_footer.html;
- index_footer.html;
- footer.html.
The TITLE variable will contain "index".
-In index_entry, the following additional variables are available:
+In tag_entry, the following additional variables are available:
+
+- URL, containing the (relative) URL of the tag index page;
+
+- NAME, the tag name.
+
+In article_entry, the following additional variables are available:
- URL, containing the (relative) URL of the article;