diff --git a/backend/scripts/cleanup_ctmath_bank.js b/backend/scripts/cleanup_ctmath_bank.js index 79d26c2..d2ce0f9 100644 --- a/backend/scripts/cleanup_ctmath_bank.js +++ b/backend/scripts/cleanup_ctmath_bank.js @@ -55,6 +55,21 @@ if (t1419 && t1419.task_type === 'mc') { console.log(`• id=1419: пропуск (тип ${t1419 ? t1419.task_type : 'нет строки'})`); } +// 2b. Срезать провенанс-префикс [ЦТ YYYY · XN] из начала текста задания +// (в чистых вариантах 101+ его нет; для консистентности убираем из год-пачек). +// Паттерн узкий: [ + ЦТ|ЦЭ|РТ|ДРТ + год + … + ]; математические скобки внутри $…$ не задеваются. +const reTag = /^\s*\[(?:ЦТ|ЦЭ|РТ|ДРТ)\s+\d{4}[^\]]*\]\s*/; +const prefixed = db.prepare(`SELECT id, text_html FROM exam_tasks WHERE exam_key=? AND TRIM(text_html) LIKE '[%'`).all(EXAM) + .filter(r => reTag.test(r.text_html)) + .map(r => ({ id: r.id, clean: r.text_html.replace(reTag, '') })) + .filter(p => p.clean.trim().length > 0); // не обнуляем задачу +if (prefixed.length) { + actions.push({ desc: `срезать провенанс-префикс [ЦТ … ] у ${prefixed.length} заданий`, + run: () => { const upd = db.prepare(`UPDATE exam_tasks SET text_html=? WHERE id=?`); for (const p of prefixed) upd.run(p.clean, p.id); } }); +} else { + console.log('• провенанс-префиксы: пропуск (не найдено)'); +} + // 3. variants_count = число чистых вариантов (≥101) const cleanCnt = get(`SELECT COUNT(DISTINCT variant) c FROM exam_tasks WHERE exam_key=? AND variant BETWEEN ? AND ?`, EXAM, MOCK_LO, MOCK_HI).c; const curCnt = get(`SELECT variants_count vc FROM exam_tracks WHERE exam_key=?`, EXAM).vc;