my-homelab-configs/scripts/render-docs

109 lines
2.6 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
CONFIG_FILE="${REPO_ROOT}/docs.yml"
README_TEMPLATE="${REPO_ROOT}/README.md.tmpl"
README_OUTPUT="${REPO_ROOT}/README.md"
usage() {
cat <<'USAGE'
Usage: scripts/render-docs [--check]
Render generated Markdown docs from repo-local templates.
Options:
--check fail if generated docs differ from committed output
USAGE
}
read_config_value() {
local key="$1"
awk -F ':' -v key="${key}" '
$1 == key {
value = $0
sub("^[^:]*:[[:space:]]*", "", value)
gsub(/^[[:space:]"'"'"']+|[[:space:]"'"'"']+$/, "", value)
print value
found = 1
exit
}
END {
if (!found) {
exit 1
}
}
' "${CONFIG_FILE}"
}
render_readme() {
local main_script="$1"
if grep -Eo '{{[[:space:]]*[A-Za-z_][A-Za-z0-9_]*[[:space:]]*}}' "${README_TEMPLATE}" |
grep -Evq '{{[[:space:]]*main_script[[:space:]]*}}'; then
printf 'Unsupported template variable in %s\n' "${README_TEMPLATE}" >&2
return 1
fi
sed "s/{{[[:space:]]*main_script[[:space:]]*}}/${main_script}/g" "${README_TEMPLATE}"
}
main() {
local mode="render"
local main_script
local rendered
case "${1:-}" in
"")
;;
--check)
mode="check"
;;
-h | --help)
usage
return 0
;;
*)
usage >&2
return 2
;;
esac
if [[ ! -s "${CONFIG_FILE}" ]]; then
printf 'Missing docs config: %s\n' "${CONFIG_FILE}" >&2
return 1
fi
if [[ ! -s "${README_TEMPLATE}" ]]; then
printf 'Missing README template: %s\n' "${README_TEMPLATE}" >&2
return 1
fi
main_script="$(read_config_value main_script)"
if [[ -z "${main_script}" ]]; then
printf 'docs.yml main_script must not be empty\n' >&2
return 1
fi
rendered="$(mktemp)"
render_readme "${main_script}" >"${rendered}"
if [[ "${mode}" == "check" ]]; then
if ! cmp -s "${rendered}" "${README_OUTPUT}"; then
printf 'Generated README.md is stale. Run scripts/render-docs.\n' >&2
diff -u "${README_OUTPUT}" "${rendered}" || true
rm -f "${rendered}"
return 1
fi
printf 'docs are current\n'
rm -f "${rendered}"
return 0
fi
mv "${rendered}" "${README_OUTPUT}"
printf 'Rendered %s from %s\n' "${README_OUTPUT}" "${README_TEMPLATE}"
}
main "$@"