c1a6150d14c6bad611b1b733c36c08b23050c79a — Tom Regner 11 months ago c56b109
Recreated tag-overview generation view
1 files changed, 52 insertions(+), 0 deletions(-)

A blog/post_0017_generate_tags_overview.org
A blog/post_0017_generate_tags_overview.org => blog/post_0017_generate_tags_overview.org +52 -0
@@ 0,0 1,52 @@
#+title: Generate a tag info page
* Generate a tag info page
:TAGS: emacs orgmode tags

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}]] "

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})]]"
      echo "[[up][/↑/]]"
  exec {of}>&-