Jekyll Category and Year Pages Without Plugins Mar. 20, 2019 in Jekyll, Text, Tutorial
Jekyll is fantastic, easy to use, and extensible. However, some Jekyll hosts such as GitHub Pages do not allow people to use custom plugins - and I want category and year pages. But rightly so. Allowing custom plugins would require hosts to allow users to run arbitrary Ruby code on their build servers and possibly create a mess. This problem is solvable, but it’s ultimately simpler to just ban them entirely.
This constrained environment forces you to get creative. On this blog I use the fantastic jekyll-compress-html template which minifies the very post you are reading. I have written by own template to automatically replace standard markdown or HTML images with lazily loaded ones. And finally, I have written a small (it’s only a hundred or so lines ;) ) Makefile to automatically, among other-things, generate year and category pages:
# Find categories and years
CATTARGETS = $(shell grep -h '^categories:' -r _posts/ | awk -F ':' \
'{print $$2}' | tr ' ' '\n' | sed '/^$$/d' | sort | uniq | \
awk '{print "categories/"$$1".html"}')
YEARTARGETS = $(shell find _posts/ -regextype egrep -regex '.*/[0-9]{4}.[^/]*' \
-printf '%P\n' | cut -c-4 | sort | uniq | \
awk '{print "years/"$$1".html"}')
# Generate category pages
cat: cat-clean $(CATTARGETS)
categories/%.html: _templates/category.html
cp $< $@
sed -i 's/#####CATEGORY#####/$*/' $@
# Generate year pages
year: year-clean $(YEARTARGETS)
years/%.html: _templates/year.html
cp $< $@
sed -i 's/#####YEAR#####/$*/' $@
To use, simply create _templates/category.html
and a _templates/year.html
templates and run make cat year
. The code assumes your posts start with the date and they are stored in the default _posts/
. When run #####CATEGORY#####
and #####YEAR#####
will be replaced with the templated value.
I̵n̵t̵e̵r̵a̵i̵l̵i̵n̵g̵, No Flying into MalagaHello Lisbon