Bloque les fichiers ne correspondant pas à l'exercice choisi

Chaque exercice dispose désormais d'une signature propre, basée sur
l'en-tête du PDF qu'il exporte. La fonction detectExercise identifie
l'exercice réellement contenu dans le fichier déposé (signature d'abord,
sentinelle en secours).

Si le PDF correspond à un autre exercice que celui sélectionné, un
message d'incompatibilité nommant les deux exercices s'affiche et la
correction n'est pas générée.
This commit is contained in:
2026-07-20 20:51:23 +02:00
parent b5f2eac842
commit 88b075fb88

View File

@@ -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;