#!/usr/bin/env bash # Vérifie les fiches du glossaire (docs/glossaire/, ADR 0008) : # en-tête avec term et english, titre identique au terme, ligne « En bref », # traductions anglaises uniques, chaque fiche présente dans l'index, # liens « Voir aussi » vers des fiches existantes. set -euo pipefail cd "$(dirname "$0")/../docs/glossaire" errors=0 report() { echo "$1" errors=$((errors + 1)) } for f in *.md; do [ "$f" = README.md ] && continue [ "$(sed -n 1p "$f")" = "---" ] || report "$f : l'en-tête doit commencer par ---" term="$(sed -n 's/^term: //p' "$f")" english="$(sed -n 's/^english: //p' "$f")" [ -n "$term" ] || report "$f : champ term absent" [ -n "$english" ] || report "$f : champ english absent" grep -qx "# $term" "$f" || report "$f : le titre doit être « # $term »" grep -qE '^\*\*En bref\*\* : .+' "$f" || report "$f : ligne « **En bref** : » absente" grep -qF "]($f)" README.md || report "$f : absent de l'index README.md" while IFS= read -r link; do [ -f "$link" ] || report "$f : lien vers une fiche inexistante ($link)" done < <(grep -oE '\]\([^)]+\.md\)' "$f" | sed -E 's/^\]\((.*)\)$/\1/' || true) done duplicates="$(find . -name '*.md' ! -name README.md -exec sed -n 's/^english: //p' {} + | sort | uniq -d)" [ -z "$duplicates" ] || report "traductions anglaises en double : $duplicates" # Lien glossaire <-> code (ADR 0008), dans les deux sens. Dans le code, un # commentaire « Glossaire : docs/glossaire/.md » désigne le premier # type exporté qui le suit ; la fiche doit exister et nommer ce type dans son # champ code. Réciproquement, chaque champ code d'une fiche doit désigner un # type ainsi relié à elle. pairs="$(find ../../app/src -name '*.ts' -exec awk ' function flush() { if (ref != "") print ref, "?"; ref = "" } FNR == 1 { flush() } match($0, /Glossaire : docs\/glossaire\/[a-z0-9-]+\.md/) { flush() ref = substr($0, RSTART + 27, RLENGTH - 27) next } ref != "" && match($0, /^export (interface|type|class|enum) [A-Za-z0-9_]+/) { n = split(substr($0, RSTART, RLENGTH), words, " ") print ref, words[n] ref = "" } END { flush() } ' {} +)" while read -r fiche type; do [ -n "$fiche" ] || continue if [ "$type" = "?" ]; then report "code : référence à $fiche sans type exporté juste après" elif [ ! -f "$fiche" ]; then report "code : le type $type renvoie à une fiche inexistante ($fiche)" elif [ "$(sed -n 's/^code: //p' "$fiche")" != "$type" ]; then report "$fiche : le type $type y renvoie, mais la fiche n'a pas « code: $type »" fi done <<<"$pairs" for f in *.md; do [ "$f" = README.md ] && continue code="$(sed -n 's/^code: //p' "$f")" [ -n "$code" ] || continue grep -qx "$f $code" <<<"$pairs" \ || report "$f : « code: $code » ne désigne aucun type du code qui renvoie à cette fiche" done [ "$errors" -eq 0 ]