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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user