#!/usr/bin/env bash # Demande à EUR-Lex si chaque référence du corpus porte bien le numéro qu'on lui prête. # # ⭐ POURQUOI IL EXISTE. Le corpus cite 25 textes européens. Une référence fausse # ne se voit pas : elle a la forme d'une référence juste, et le lecteur ne va pas # la chercher. Ce garde va la chercher. # # 🔴 SA PREMIÈRE VERSION ÉTAIT ELLE-MÊME UN FAUX TÉMOIN : elle prenait le PREMIER # « Regulation (EU) … » de la page — souvent une note de bas de page — et a validé # le règlement 2022/868 avec l'intitulé du 2019/1239. ⭐ Un garde nomme LA CHOSE : # il exige désormais que le numéro rendu soit celui demandé. # # ./verifier-corpus.sh → toutes les références # ./verifier-corpus.sh reg/2022/868 set -uo pipefail ROUGE=0 # ⚠️ UN SEUL APPEL PAR RÉFÉRENCE, deux signaux tirés du MÊME corps. # 🔴 La v2 en faisait deux : le second tombait (EUR-Lex freine les rafales) et le # garde rendait ROUGE deux références que j'avais prouvées justes à la main. # ⭐ Un faux rouge coûte plus cher qu'un faux vert : il fait corriger ce qui va bien. sonder(){ # $1 = eli « type/annee/numero » → « ETATintitulé » local num="${1#*/}" corps titre page corps=$(curl -sSL --max-time 30 "https://eur-lex.europa.eu/eli/$1/oj/eng" 2>/dev/null) [ -z "$corps" ] && { printf 'INJOIGNABLE\t'; return; } titre=$(printf '%s' "$corps" | tr '\n' ' ' \ | sed 's/<[^>]*>/ /g; s/ / /g; s/ / /g; s/ */ /g' \ | grep -oE "(Regulation|Directive) \\(EU\\)( No)? ${num//\//\\/}[^.]{0,200}" | head -1) if [ -n "$titre" ]; then printf 'TITRE\t%s' "$titre"; return; fi # pas d'intitulé extrait : la page porte-t-elle AU MOINS le numéro dans son titre ? page=$(printf '%s' "$corps" | grep -oE "[^<]*" | head -1 | sed 's/<title>//') case "$page" in *"$num"*) printf 'NUMERO\t%s' "$page";; *) printf 'ABSENT\t%s' "$page";; esac } if [ $# -gt 0 ]; then ELIS="$*" else ELIS=$(python3 -c " from corpus_europeen import CORPUS print(' '.join(t['eli'] for t in CORPUS if t.get('eli')))" 2>/dev/null \ || python3 -c " import importlib.util,sys s=importlib.util.spec_from_file_location('c','corpus-europeen.py') m=importlib.util.module_from_spec(s); s.loader.exec_module(m) print(' '.join(t['eli'] for t in m.CORPUS if t.get('eli')))") fi N=0 for e in $ELIS; do N=$((N+1)); R=$(sonder "$e"); ETAT="${R%% *}"; TXT="${R#* }" case "$ETAT" in TITRE) echo "✓ $e · $(echo "$TXT" | cut -c1-106)" ;; NUMERO) echo "≈ $e · la page porte le numéro, intitulé non extrait — « $TXT »" ;; INJOIGNABLE) echo "⚠️ $e — EUR-Lex injoignable : NON VÉRIFIÉ (ce n'est pas un refus)"; ROUGE=1 ;; *) echo "🔴 $e — la page ne porte pas ce numéro : RÉFÉRENCE À REVOIR"; ROUGE=1 ;; esac done echo [ "$ROUGE" = "0" ] && echo "✅ $N références : aucune introuvable." || echo "🔴 des références sont à revoir." exit $ROUGE