Files
soleprint/docs/graphs/render.sh
2026-08-10 09:19:19 -03:00

70 lines
2.3 KiB
Bash
Executable File

#!/usr/bin/env bash
# Render every .dot through every theme.
#
# ./render.sh # all graphs, all themes
# ./render.sh lucid # one theme
# ./render.sh dark system_overview
#
# The sources carry structure and meaning; themes/*.gvpr carry palette. gvpr
# rewrites the parsed graph, so it wins over anything a .dot sets inline — which
# is what lets one source render in several looks without being edited.
#
# Output naming: the default theme writes <name>.svg, because that is what
# docs/data/en/*.md already links to and those links should keep working. Every
# other theme writes <name>.<theme>.svg.
#
# Why baked rather than CSS: both docs sites embed graphs with <img src=...>,
# which makes the SVG a separate document that the page's stylesheet cannot
# reach. Colour has to be in the file.
set -euo pipefail
cd "$(dirname "$0")"
DEFAULT_THEME=dark
if ! command -v dot >/dev/null 2>&1 || ! command -v gvpr >/dev/null 2>&1; then
echo "graphviz not found — install with: sudo apt install graphviz" >&2
echo "(the committed .svg files already work; this is only needed to re-render)" >&2
exit 1
fi
theme_arg="${1:-}"
graph_arg="${2:-}"
themes=()
if [ -n "$theme_arg" ]; then
if [ ! -f "themes/${theme_arg}.gvpr" ]; then
echo "no such theme: themes/${theme_arg}.gvpr" >&2
echo "available: $(ls themes/*.gvpr 2>/dev/null | xargs -n1 basename | sed 's/\.gvpr$//' | tr '\n' ' ')" >&2
exit 1
fi
themes=("$theme_arg")
else
for t in themes/*.gvpr; do themes+=("$(basename "$t" .gvpr)"); done
fi
shopt -s nullglob
sources=(*.dot)
if [ -n "$graph_arg" ]; then
sources=("${graph_arg%.dot}.dot")
[ -f "${sources[0]}" ] || { echo "no such graph: ${sources[0]}" >&2; exit 1; }
fi
[ ${#sources[@]} -gt 0 ] || { echo "no .dot files here"; exit 0; }
for theme in "${themes[@]}"; do
for src in "${sources[@]}"; do
base="${src%.dot}"
if [ "$theme" = "$DEFAULT_THEME" ]; then
out="${base}.svg"
else
out="${base}.${theme}.svg"
fi
# One pipeline, so a gvpr failure fails the whole render rather than
# silently writing a half-themed file.
gvpr -c -f "themes/${theme}.gvpr" "$src" | dot -Tsvg -o "$out"
printf " %-14s %s\n" "$theme" "$out"
done
done
echo
echo "done — ${#sources[@]} graph(s) x ${#themes[@]} theme(s)"