#!/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 "$@"