Generate a tag info page
July 19, 2022 – extract tags and build tags.org during export
Side note: I failed my first attempt to offload 100 times in a year… I will probably take this challenge on a second time, but not right now.
But to the matter at hand: I started tagging the posts here a while bag. This is a static web-site generated during publishing by emacs org-mode. I don’t want to switch to another generator, but I do want to use the tags to generate an overview with a section for every tag listing links to the posts tagged with it.
To that effect, I added a code block to the index page, that does not get
exported and so does not alter the index page in any way, but as a side effect
generates a new file tags.org
, that will be exported by org-publish, functioning
as a poor-mans tag overview/post list.
It’s a zsh script that relies on rg
in addition to grep
, sed
and sort
. The first
step uses rg
to extract the TAGS
line from the post files, and use the other
tools to build a sorted list of tags.
exec {of} > tags.org exec >&${of} echo -e "#+TITLE: Tags\n<<up>>\n* List of tags and articles\n" declare -a usedtags usedtags=($(rg -NI -e ":TAGS:" ./ | grep -v 'rg -N' | sed 's/:TAGS://' | sed "s/ /\n/g" | sort -u )) for i in ${usedtags[@]}; do echo -n "[[*${i}]] " done
In a second step we iterate over this list and use rg
again to find all
post-files containing the tag and generating org header lines and lists with
links, in the same way the link lists on the index page are build, although
these are done with page modifying code-blocks.
echo -e "\n" for i in ${usedtags[@]}; do echo "*** ${i}" for j in $(rg -Nl --sort path -e ":TAGS:.* ${i}.*" ./); do echo "- [[$(sed 's/\.org/.html/' <<< ${j})][$(grep -Po "(?<=^\* )(.+)" ${j})]]" done echo "[[up][/↑/]]" done exec {of}>&-