fix(ctmath): срезать провенанс-префикс [ЦТ YYYY · XN] из текста заданий

48 заданий год-пачек (ЦТ 2017/2021) при оцифровке получили в начале text_html
тег вида «[ЦТ 2017 · A1]» — мусор для ученика в тренажёре. cleanup_ctmath_bank.js
теперь срезает ведущий тег [ЦТ|ЦЭ|РТ|ДРТ YYYY …] (узкий паттерн, не трогает
матскобки внутри $…$, не обнуляет пустой результат). Идемпотентно.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Maxim Dolgolyov
2026-06-19 08:37:29 +03:00
parent dbfcfa41ec
commit 143ae23216
+15
View File
@@ -55,6 +55,21 @@ if (t1419 && t1419.task_type === 'mc') {
console.log(`• id=1419: пропуск (тип ${t1419 ? t1419.task_type : 'нет строки'})`); 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) // 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 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; const curCnt = get(`SELECT variants_count vc FROM exam_tracks WHERE exam_key=?`, EXAM).vc;