diff --git a/exercices/corriger-exercice.html b/exercices/corriger-exercice.html
index 2cff3ad..e919a2a 100644
--- a/exercices/corriger-exercice.html
+++ b/exercices/corriger-exercice.html
@@ -792,11 +792,38 @@ function parseTp(raw) {
/* ======================= REGISTRE DES EXERCICES ======================= */
const EXERCISES = {
- biocid: { parse: parseBiocid, sentinel: /Réponses aux exercices|Ex1\s*[—-]/i, name: "BioCID" },
- fds: { parse: parseFds, sentinel: /\[P1-Q1\]|Partie 1\s*[—-]\s*FDS/i, name: "FDS, FT & Étiquettes" },
- tp: { parse: parseTp, sentinel: /Réponses TP1|TP Nuisibles/i, name: "TP Nuisibles" },
+ biocid: {
+ parse: parseBiocid,
+ // Signature : en-tête propre au PDF exporté par Exo_BioCID.html
+ signature: /Exercices\s+Pratiques\s+BioCID/i,
+ sentinel: /Réponses aux exercices|Ex1\s*[—–-]/i,
+ name: "Plate-forme BioCID",
+ },
+ fds: {
+ parse: parseFds,
+ signature: /TD\s*[—–-]\s*FDS,\s*FT/i,
+ sentinel: /\[P1-Q1\]|Partie 1\s*[—–-]\s*FDS/i,
+ name: "FDS, FT & Étiquettes",
+ },
+ tp: {
+ parse: parseTp,
+ signature: /TP\s+Nuisibles\s*[—–-]\s*Certibiocide/i,
+ sentinel: /Réponses TP1|TP3\s*[—–-]\s*Analyse de risques/i,
+ name: "TP Nuisibles",
+ },
};
+// Identifie l'exercice réellement contenu dans le PDF (signature d'abord, sentinelle en secours).
+function detectExercise(text) {
+ for (const [key, cfg] of Object.entries(EXERCISES)) {
+ if (cfg.signature.test(text)) return key;
+ }
+ for (const [key, cfg] of Object.entries(EXERCISES)) {
+ if (cfg.sentinel.test(text)) return key;
+ }
+ return null;
+}
+
/* ======================= RENDU ======================= */
let currentData = null;
@@ -949,7 +976,15 @@ async function handleFile(file) {
const text = await readPdfText(file);
const config = EXERCISES[exo];
- if (!config.sentinel.test(text)) {
+ const detected = detectExercise(text);
+
+ if (detected && detected !== exo) {
+ statusEl.className = "error";
+ statusEl.textContent = `Fichier incompatible : ce PDF est un rendu « ${EXERCISES[detected].name} », or vous avez sélectionné « ${config.name} ». Changez d'exercice ou déposez le bon fichier.`;
+ return;
+ }
+
+ if (!detected) {
statusEl.className = "error";
statusEl.textContent = `Ce PDF ne ressemble pas à un rendu « ${config.name} ». Vérifiez l'exercice sélectionné.`;
return;