fix(textbooks): Физика 9 — escape § в num + phys9_legacy.js + финалы 5 глав

Багфиксы:
- gen_phys9_ch.js: убран двойной escape \u00a7 → литерал §
  (раньше карточка показывала '\u00a7 1' вместо '§ 1')
- phys9_legacy.js (262 КБ): извлечён весь JS монолита для глобальных onclick-
  обработчиков (startAnim1, lab11add/all/reset, checkNum, togglePend36 и пр.).
  Setup-код в конце обёрнут в try/catch — он рассчитан на DOM монолита.
- migrate_phys9_ch4.js + migrate_phys9_content.js: подключают phys9_legacy.js
  во все 5 ch-файлов перед закрытием <head>.

Финалы глав (write_phys9_finals.js):
- ch1: 5 задач (кинематика — поезд, разгон, окружность, лодка/река)
- ch2: 5 задач (динамика — трение, Гук, свободное падение, перегрузка)
- ch3: 5 задач (статика — рычаг, Архимед, блок, КПД накл. плоск., льдина)
- ch4: 5 задач (импульс — неупр. удар, ЗСЭ, мощность крана, пуля, бросок)
- ch5: 5 контрольных по практикуму (среднее, ЛР2, ЛР4, ЛР6, ЛР10)

Все задачи с автопроверкой через checkNum() (теперь работает из legacy.js).
This commit is contained in:
Maxim Dolgolyov
2026-05-30 08:55:00 +03:00
parent 0c6618fb38
commit dcdcde5b4e
10 changed files with 6625 additions and 62 deletions
+70 -11
View File
@@ -15,6 +15,7 @@
<script src="/js/api.js" defer></script>
<script src="/js/xp.js" defer></script>
<script src="/js/phys.js" defer></script>
<script src="/js/phys9_legacy.js" defer></script>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Manrope:wght@600;700;800;900&family=Unbounded:wght@700;800;900&family=JetBrains+Mono:wght@500;700&display=swap" rel="stylesheet">
<style>
:root{
@@ -616,12 +617,12 @@ const TOTAL_PARAS = 7;
const _TB_SLUG = 'physics-9-ch3';
const PARAS = [
{ id:"p25", num:"\\u00a7 25", name:"Условия равновесия тел. Момент силы", sub:"$M = Fl$" },
{ id:"p26", num:"\\u00a7 26", name:"Простые механизмы. Рычаги. Блоки", sub:"$F_1 l_1 = F_2 l_2$" },
{ id:"p27", num:"\\u00a7 27", name:"Наклонная плоскость. «Золотое правило» механики. КПД", sub:"$\\\\eta = A_{пол}/A_{сов}$" },
{ id:"p28", num:"\\u00a7 28", name:"Центр тяжести. Виды равновесия", sub:"ЦТ · равновесие" },
{ id:"p29", num:"\\u00a7 29", name:"Закон Архимеда. Выталкивающая сила", sub:"$F_A = \\\\rho g V$" },
{ id:"p30", num:"\\u00a7 30", name:"Плавание судов. Воздухоплавание", sub:"$\\\\rho_т \\\\le \\\\rho_ж$" },
{ id:"p25", num:"§ 25", name:"Условия равновесия тел. Момент силы", sub:"$M = Fl$" },
{ id:"p26", num:"§ 26", name:"Простые механизмы. Рычаги. Блоки", sub:"$F_1 l_1 = F_2 l_2$" },
{ id:"p27", num:"§ 27", name:"Наклонная плоскость. «Золотое правило» механики. КПД", sub:"$\\\\eta = A_{пол}/A_{сов}$" },
{ id:"p28", num:"§ 28", name:"Центр тяжести. Виды равновесия", sub:"ЦТ · равновесие" },
{ id:"p29", num:"§ 29", name:"Закон Архимеда. Выталкивающая сила", sub:"$F_A = \\\\rho g V$" },
{ id:"p30", num:"§ 30", name:"Плавание судов. Воздухоплавание", sub:"$\\\\rho_т \\\\le \\\\rho_ж$" },
{ id:"final3", num:'\u2605', name:'Финал главы', sub:"Итоги · боссы главы 3", final:true }
];
PARAS.forEach(p => { STATE.progress[p.id] = 0; });
@@ -1468,11 +1469,69 @@ function build_final3(){
const box = document.getElementById('final3-body');
let html = '';
html += makeCard('theory', "Финал главы 3", "★", `
<p><b>Финал главы 3</b> — этот параграф в разработке (Phase 3+).</p>
<p>Здесь появятся: теория, формулы, разобранные примеры и 3–4 интерактива в стиле «физики 10» — векторные диаграммы, графики движения, ползунки и автопроверяемые тренажёры.</p>
<p style="margin-top:10px;padding:10px 14px;background:var(--sec-acc-soft);border-radius:9px;font-size:.92rem">
<b>Phase 0:</b> создан скелет. <b>Phase 5:</b> наполнение по учебнику «Физика 9» (Исаченкова, Сокольский, Захаревич, 2019).
</p>
<div class="formula-grid" style="margin-bottom:20px">
<div class="fcard highlight"><h3>Равновесие</h3>
<div class="main-f">$\\sum\\vec{F} = 0$ и $\\sum M = 0$</div>
<p>Момент: $M = F \\cdot \\ell$ (плечо)</p>
</div>
<div class="fcard"><h3>Простые механизмы</h3>
<div class="main-f">$F_1 \\ell_1 = F_2 \\ell_2$</div>
<p>Рычаг · подв. блок (выигрыш в 2 раза) · накл. плоскость</p>
</div>
<div class="fcard"><h3>Архимед</h3>
<div class="main-f">$F_A = \\rho_ж g V_{\\text{погр}}$</div>
<p>КПД: $\\eta = A_{\\text{пол}}/A_{\\text{сов}} \\cdot 100\\%$</p>
</div>
</div>
<div class="section-title"><i class="fas fa-star"></i> Интегрированные задачи</div>
<div class="task-card">
<div class="task-num">Задача 1</div>
<div class="task-text">Рычаг в равновесии. На левое плечо длиной $\\ell_1 = 0{,}3$ м действует сила $F_1 = 60$ Н. Правое плечо длиной $\\ell_2 = 0{,}9$ м. Найдите силу $F_2$ на правом плече.</div>
<div class="task-hint">$F_1 \\ell_1 = F_2 \\ell_2$, отсюда $F_2 = F_1 \\ell_1 / \\ell_2$.</div>
<div class="ans-row"><input type="number" class="ans-inp" id="fin3-q1" step="any"><span class="unit-lbl">Н</span>
<button class="btn btn-pri" onclick="checkNum('fin3-q1', 20, 'Н', 0.2)">Проверить</button></div>
<div class="feedback" id="fb-fin3-q1"></div>
</div>
<div class="task-card">
<div class="task-num">Задача 2</div>
<div class="task-text">Куб со стороной $a = 10$ см полностью погружён в воду. Плотность воды $\\rho = 1000$ кг/м³, $g = 10$ м/с². Найдите выталкивающую силу.</div>
<div class="task-hint">$V = a^3$, $F_A = \\rho g V$.</div>
<div class="ans-row"><input type="number" class="ans-inp" id="fin3-q2" step="any"><span class="unit-lbl">Н</span>
<button class="btn btn-pri" onclick="checkNum('fin3-q2', 10, 'Н', 0.1)">Проверить</button></div>
<div class="feedback" id="fb-fin3-q2"></div>
</div>
<div class="task-card">
<div class="task-num">Задача 3</div>
<div class="task-text">Подвижный блок поднимает груз весом $P = 200$ Н на высоту $h_1 = 1$ м. Найдите силу тяги $F$, прикладываемую к нити (без учёта трения и веса блока).</div>
<div class="task-hint">Подвижный блок даёт выигрыш в силе в 2 раза: $F = P/2$.</div>
<div class="ans-row"><input type="number" class="ans-inp" id="fin3-q3" step="any"><span class="unit-lbl">Н</span>
<button class="btn btn-pri" onclick="checkNum('fin3-q3', 100, 'Н', 1)">Проверить</button></div>
<div class="feedback" id="fb-fin3-q3"></div>
</div>
<div class="task-card">
<div class="task-num">Задача 4</div>
<div class="task-text">Тело весом $P = 50$ Н поднимают по наклонной плоскости длиной $\\ell = 3$ м на высоту $h = 1$ м. Сила тяги $F = 20$ Н. Найдите КПД наклонной плоскости.</div>
<div class="task-hint">$A_{\\text{пол}} = Ph$, $A_{\\text{сов}} = F\\ell$, $\\eta = A_{\\text{пол}}/A_{\\text{сов}} \\cdot 100\\%$.</div>
<div class="ans-row"><input type="number" class="ans-inp" id="fin3-q4" step="any"><span class="unit-lbl">%</span>
<button class="btn btn-pri" onclick="checkNum('fin3-q4', 83.3, '%', 1)">Проверить</button></div>
<div class="feedback" id="fb-fin3-q4"></div>
</div>
<div class="task-card">
<div class="task-num">Задача 5 (повышенный уровень)</div>
<div class="task-text">Льдина имеет объём $V = 2{,}0$ м³ и плавает в пресной воде. Плотность льда $\\rho_л = 900$ кг/м³, воды $\\rho_в = 1000$ кг/м³. Какой объём льдины находится над водой?</div>
<div class="task-hint">Условие плавания: $mg = F_A$, откуда $\\rho_л V g = \\rho_в V_{\\text{погр}} g$. Объём над водой: $V - V_{\\text{погр}}$.</div>
<div class="ans-row"><input type="number" class="ans-inp" id="fin3-q5" step="any"><span class="unit-lbl">м³</span>
<button class="btn btn-pri" onclick="checkNum('fin3-q5', 0.2, 'м³', 0.01)">Проверить</button></div>
<div class="feedback" id="fb-fin3-q5"></div>
</div>
`);
html += secNav('p30', null);
html += readButton('final3');