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
+74 -15
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{
@@ -624,16 +625,16 @@ const TOTAL_PARAS = 11;
const _TB_SLUG = 'physics-9-ch2';
const PARAS = [
{ id:"p15", num:"\\u00a7 15", name:"Взаимодействие тел. Сила. ИСО. 1-й закон Ньютона", sub:"1-й закон Ньютона" },
{ id:"p16", num:"\\u00a7 16", name:"Масса", sub:"$m_1/m_2 = a_2/a_1$" },
{ id:"p17", num:"\\u00a7 17", name:"Второй закон Ньютона", sub:"$\\\\vec F = m\\\\vec a$" },
{ id:"p18", num:"\\u00a7 18", name:"Третий закон Ньютона. Принцип относительности Галилея", sub:"$\\\\vec F_{12} = -\\\\vec F_{21}$" },
{ id:"p19", num:"\\u00a7 19", name:"Деформация тел. Сила упругости. Закон Гука", sub:"$F = -kx$" },
{ id:"p20", num:"\\u00a7 20", name:"Силы трения. Силы сопротивления среды", sub:"$F_{тр} = \\\\mu N$" },
{ id:"p21", num:"\\u00a7 21", name:"Движение тела под действием силы тяжести", sub:"$h = gt^2/2$" },
{ id:"p22", num:"\\u00a7 22", name:"Движение тела, брошенного под углом к горизонту", sub:"$L = v_0^2\\\\sin 2\\\\alpha/g$" },
{ id:"p23", num:"\\u00a7 23", name:"Закон всемирного тяготения", sub:"$F = Gm_1m_2/r^2$" },
{ id:"p24", num:"\\u00a7 24", name:"Вес. Невесомость и перегрузки", sub:"$P = m(g \\\\pm a)$" },
{ id:"p15", num:"§ 15", name:"Взаимодействие тел. Сила. ИСО. 1-й закон Ньютона", sub:"1-й закон Ньютона" },
{ id:"p16", num:"§ 16", name:"Масса", sub:"$m_1/m_2 = a_2/a_1$" },
{ id:"p17", num:"§ 17", name:"Второй закон Ньютона", sub:"$\\\\vec F = m\\\\vec a$" },
{ id:"p18", num:"§ 18", name:"Третий закон Ньютона. Принцип относительности Галилея", sub:"$\\\\vec F_{12} = -\\\\vec F_{21}$" },
{ id:"p19", num:"§ 19", name:"Деформация тел. Сила упругости. Закон Гука", sub:"$F = -kx$" },
{ id:"p20", num:"§ 20", name:"Силы трения. Силы сопротивления среды", sub:"$F_{тр} = \\\\mu N$" },
{ id:"p21", num:"§ 21", name:"Движение тела под действием силы тяжести", sub:"$h = gt^2/2$" },
{ id:"p22", num:"§ 22", name:"Движение тела, брошенного под углом к горизонту", sub:"$L = v_0^2\\\\sin 2\\\\alpha/g$" },
{ id:"p23", num:"§ 23", name:"Закон всемирного тяготения", sub:"$F = Gm_1m_2/r^2$" },
{ id:"p24", num:"§ 24", name:"Вес. Невесомость и перегрузки", sub:"$P = m(g \\\\pm a)$" },
{ id:"final2", num:'\u2605', name:'Финал главы', sub:"Итоги · боссы главы 2", final:true }
];
PARAS.forEach(p => { STATE.progress[p.id] = 0; });
@@ -1882,11 +1883,69 @@ function build_final2(){
const box = document.getElementById('final2-body');
let html = '';
html += makeCard('theory', "Финал главы 2", "★", `
<p><b>Финал главы 2</b> — этот параграф в разработке (Phase 2+).</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">$\\vec{F} = m\\vec{a}$</div>
<p>1-й: ИСО; 2-й: $\\vec{a} = \\vec{F}/m$; 3-й: $\\vec{F}_{12} = -\\vec{F}_{21}$</p>
</div>
<div class="fcard"><h3>Силы</h3>
<div class="main-f">$F_{\\text{упр}} = -kx$, $F_{\\text{тр}} = \\mu N$</div>
<p>Тяжести: $mg$ · Гравит.: $F = G m_1 m_2/r^2$</p>
</div>
<div class="fcard"><h3>Вес</h3>
<div class="main-f">$P = m(g \\pm a)$</div>
<p>Свободное падение → $P = 0$ (невесомость)</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">На тело массой $m = 2$ кг действует сила $F = 10$ Н в горизонтальном направлении. Сила трения $F_{\\text{тр}} = 4$ Н. Найдите модуль ускорения тела.</div>
<div class="task-hint">Равнодействующая $F_{\\text{рез}} = F - F_{\\text{тр}}$, ускорение $a = F_{\\text{рез}}/m$.</div>
<div class="ans-row"><input type="number" class="ans-inp" id="fin2-q1" step="any"><span class="unit-lbl">м/с²</span>
<button class="btn btn-pri" onclick="checkNum('fin2-q1', 3, 'м/с²', 0.05)">Проверить</button></div>
<div class="feedback" id="fb-fin2-q1"></div>
</div>
<div class="task-card">
<div class="task-num">Задача 2</div>
<div class="task-text">Под действием груза пружина с жёсткостью $k = 200$ Н/м растянулась на $x = 5$ см. Найдите массу груза. $g = 9{,}81$ м/с².</div>
<div class="task-hint">В равновесии $kx = mg$, отсюда $m = kx/g$.</div>
<div class="ans-row"><input type="number" class="ans-inp" id="fin2-q2" step="any"><span class="unit-lbl">кг</span>
<button class="btn btn-pri" onclick="checkNum('fin2-q2', 1.02, 'кг', 0.05)">Проверить</button></div>
<div class="feedback" id="fb-fin2-q2"></div>
</div>
<div class="task-card">
<div class="task-num">Задача 3</div>
<div class="task-text">Брусок массой $m = 5$ кг скользит по горизонтальной поверхности с коэффициентом трения $\\mu = 0{,}3$. Найдите силу трения скольжения. $g = 10$ м/с².</div>
<div class="task-hint">$F_{\\text{тр}} = \\mu mg$.</div>
<div class="ans-row"><input type="number" class="ans-inp" id="fin2-q3" step="any"><span class="unit-lbl">Н</span>
<button class="btn btn-pri" onclick="checkNum('fin2-q3', 15, 'Н', 0.1)">Проверить</button></div>
<div class="feedback" id="fb-fin2-q3"></div>
</div>
<div class="task-card">
<div class="task-num">Задача 4</div>
<div class="task-text">Тело свободно падает с высоты $h = 45$ м. Найдите время падения. $g = 10$ м/с².</div>
<div class="task-hint">$h = gt^2/2$, отсюда $t = \\sqrt{2h/g}$.</div>
<div class="ans-row"><input type="number" class="ans-inp" id="fin2-q4" step="any"><span class="unit-lbl">с</span>
<button class="btn btn-pri" onclick="checkNum('fin2-q4', 3, 'с', 0.05)">Проверить</button></div>
<div class="feedback" id="fb-fin2-q4"></div>
</div>
<div class="task-card">
<div class="task-num">Задача 5 (повышенный уровень)</div>
<div class="task-text">Космонавт массой $m = 80$ кг стоит на полу лифта. Лифт движется вверх с ускорением $a = 2{,}0$ м/с². Найдите вес космонавта. $g = 10$ м/с².</div>
<div class="task-hint">$P = m(g + a)$ при движении вверх с положительным ускорением (перегрузка).</div>
<div class="ans-row"><input type="number" class="ans-inp" id="fin2-q5" step="any"><span class="unit-lbl">Н</span>
<button class="btn btn-pri" onclick="checkNum('fin2-q5', 960, 'Н', 5)">Проверить</button></div>
<div class="feedback" id="fb-fin2-q5"></div>
</div>
`);
html += secNav('p24', null);
html += readButton('final2');