qusal/scripts/toc-gen.sh
Ben Grande bdd4c789c1
fix: avoid echo usage
Echo can interpret operand as an option and checking every variable to
be echoed is troublesome while with printf, if the format specifier is
present before the operand, printing as string can be enforced.
2024-08-06 18:15:24 +02:00

46 lines
1.2 KiB
Bash
Executable File

#!/bin/sh
## SPDX-FileCopyrightText: 2023 - 2024 Benjamin Grande M. S. <ben.grande.b@gmail.com>
##
## SPDX-License-Identifier: AGPL-3.0-or-later
## Requires: https://github.com/mzlogin/vim-markdown-toc
set -eu
usage(){
printf '%s\n' "Usage: ${0##*/} <file> [file ...]"
exit 1
}
case "${1-}" in
""|-h|--help) usage;;
*) ;;
esac
## vim-markdown-toc deletes lines if they are folded, can't rely on its native
## update on save.
if ! vim -e -c 'setf markdown' -c 'if !exists(":GenTocGFM") | cq | endif' -c q
then
err_msg="Error: Vim Plugin mzlogin/vim-markdown-toc isn't installed."
printf '%s\n' "${err_msg}" >&2
exit 1
fi
for f in "${@}"; do
if ! test -f "${f}"; then
printf '%s\n' "Error: Not a regular file: ${f}" >&2
exit 1
fi
if ! grep -q -e "^## Table of Contents$" -- "${f}"; then
printf '%s\n' "Could not find TOC in file: ${f}, skipping" >&2
continue
fi
## This is fragile, the table of contents should have at least one block
## separated by an empty line before the nest heading, else it will delete
## the rest of the file.
vim -c 'norm zRgg' -c '/^## Table of Contents$' -c 'norm jd}k' \
-c ':GenTocGFM' -c 'norm ddgg' -c wq -- "${f}"
printf '%s\n' "Updated TOC in file: ${f}"
done