From c33b4ab4f6c1faebc66cf1763db66cbba91f830a Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Sat, 30 May 2026 18:13:37 +0300 Subject: [PATCH] =?UTF-8?q?feat(chemistry7):=20Phase=200=20=E2=80=94=20?= =?UTF-8?q?=D1=84=D1=83=D0=BD=D0=B4=D0=B0=D0=BC=D0=B5=D0=BD=D1=82=20=D1=83?= =?UTF-8?q?=D1=87=D0=B5=D0=B1=D0=BD=D0=B8=D0=BA=D0=B0=20=C2=AB=D0=A5=D0=B8?= =?UTF-8?q?=D0=BC=D0=B8=D1=8F=207=C2=BB=20(hub=20+=204=20=D0=B3=D0=BB?= =?UTF-8?q?=D0=B0=D0=B2=D1=8B)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - миграция 046_chemistry7_hub.sql: родитель chemistry-7 (26§) + 4 ребёнка - chemistry_7_hub.html: emerald-палитра, 4 главы, финал курса (8 боссов, ачивка «Химик 7 класса») - chemistry_7_ch1..ch4.html: каркасы глав на общем движке chem8_engine.js + chem8-textbook.css; PARAS по реальной программе, заглушки-builder'ы - chem7_svg.js: неймспейс Chem7 (надстройка над Chem8), стабы виджетов - chemistry7-page.test.js: jsdom-каркас (6 тестов, все проходят) Содержание § наполняется в фазах 1–4. См. plans/textbooks-7/PLAN_CHEMISTRY_7.md Co-Authored-By: Claude Opus 4.8 (1M context) --- .../src/db/migrations/046_chemistry7_hub.sql | 41 ++ backend/tests/chemistry7-page.test.js | 106 ++++ frontend/js/chem7_svg.js | 53 ++ frontend/textbooks/chemistry_7_ch1.html | 132 +++++ frontend/textbooks/chemistry_7_ch2.html | 118 ++++ frontend/textbooks/chemistry_7_ch3.html | 120 ++++ frontend/textbooks/chemistry_7_ch4.html | 116 ++++ frontend/textbooks/chemistry_7_hub.html | 540 ++++++++++++++++++ 8 files changed, 1226 insertions(+) create mode 100644 backend/src/db/migrations/046_chemistry7_hub.sql create mode 100644 backend/tests/chemistry7-page.test.js create mode 100644 frontend/js/chem7_svg.js create mode 100644 frontend/textbooks/chemistry_7_ch1.html create mode 100644 frontend/textbooks/chemistry_7_ch2.html create mode 100644 frontend/textbooks/chemistry_7_ch3.html create mode 100644 frontend/textbooks/chemistry_7_ch4.html create mode 100644 frontend/textbooks/chemistry_7_hub.html diff --git a/backend/src/db/migrations/046_chemistry7_hub.sql b/backend/src/db/migrations/046_chemistry7_hub.sql new file mode 100644 index 0000000..e921436 --- /dev/null +++ b/backend/src/db/migrations/046_chemistry7_hub.sql @@ -0,0 +1,41 @@ +-- Chemistry 7 hub migration. +-- Creates chemistry-7 as a full hub textbook (4 chapters) in the style of chemistry-8: +-- chemistry-7 (hub, html_path = chemistry_7_hub.html) +-- chemistry-7-ch1 (Первоначальные химические понятия, §§1–12) → chemistry_7_ch1.html +-- chemistry-7-ch2 (Кислород, §§13–17) → chemistry_7_ch2.html +-- chemistry-7-ch3 (Водород, §§18–22) → chemistry_7_ch3.html +-- chemistry-7-ch4 (Вода, §§23–26) → chemistry_7_ch4.html +-- +-- Source: Шиманович И. Е., Красицкий В. А., Сечко О. И., Хвалюк В. Н., +-- «Химия 7», Народная асвета, 2023 (2-е изд.). Контент авторский (наш). +-- Author left empty per project policy. + +-- 1. Insert the parent chemistry-7 hub row (does not exist yet in the catalog). +INSERT OR IGNORE INTO textbooks + (slug, subject, grade, title, author, description, html_path, para_count, color, sort_order, is_active, parent_slug) +VALUES + ('chemistry-7', 'chemistry', 7, 'Химия — 7 класс', + '', + 'Первый курс химии: первоначальные химические понятия (вещество, атом, элемент, молекула, формула, валентность, химическая реакция и уравнение), кислород и оксиды, водород, кислоты и соли, вода и основания, реакция нейтрализации. 4 главы, 26 параграфов, 5 лабораторных опытов, 4 практические работы.', + 'chemistry_7_hub.html', 26, 'emerald', 7, 1, NULL); + +-- 2. Insert the 4 children (chapters). +INSERT OR IGNORE INTO textbooks + (slug, subject, grade, title, author, description, html_path, para_count, color, sort_order, is_active, parent_slug) +VALUES + ('chemistry-7-ch1', 'chemistry', 7, 'Химия 7 · Первоначальные химические понятия', + '', + '§§1–12: химия как наука о веществах, чистые вещества и смеси, атомы и химические элементы, относительная атомная масса, молекулы, простые и сложные вещества, химическая формула и относительная молекулярная масса, валентность, физические и химические явления, закон сохранения массы и химические уравнения. Лабораторный опыт 1, практическая работа 1.', + 'chemistry_7_ch1.html', 12, 'emerald', 1, 1, 'chemistry-7'), + ('chemistry-7-ch2', 'chemistry', 7, 'Химия 7 · Кислород', + '', + '§§13–17: воздух как смесь газов, кислород как химический элемент и простое вещество, химические свойства кислорода и горение, оксиды, получение кислорода и катализаторы. Лабораторный опыт 2, практическая работа 2.', + 'chemistry_7_ch2.html', 5, 'cyan', 2, 1, 'chemistry-7'), + ('chemistry-7-ch3', 'chemistry', 7, 'Химия 7 · Водород', + '', + '§§18–22: водород как химический элемент и простое вещество, химические свойства водорода, понятие о кислотах и индикаторах, взаимодействие кислот с металлами и ряд активности, соли как продукты замещения. Лабораторные опыты 3 и 4, практическая работа 3.', + 'chemistry_7_ch3.html', 5, 'violet', 3, 1, 'chemistry-7'), + ('chemistry-7-ch4', 'chemistry', 7, 'Химия 7 · Вода', + '', + '§§23–26: состав, физические и химические свойства воды, основания как сложные вещества и индикаторы, реакция нейтрализации, охрана окружающей среды. Лабораторный опыт 5, практическая работа 4.', + 'chemistry_7_ch4.html', 4, 'blue', 4, 1, 'chemistry-7'); diff --git a/backend/tests/chemistry7-page.test.js b/backend/tests/chemistry7-page.test.js new file mode 100644 index 0000000..5a1e23d --- /dev/null +++ b/backend/tests/chemistry7-page.test.js @@ -0,0 +1,106 @@ +'use strict'; +/* + * Phase 0 jsdom-каркас «Химия 7»: проверяем, что хаб и 4 главы реально + * выполняются на движке chem8_engine.js без ошибок скриптов, строится + * para-selector с нужным числом карточек, активен первый §, заглушки-builder'ы + * рисуют para-hero и кнопку прочтения, а финал-боссы хаба решаются. + * Содержание § наполняется в фазах 1–4 — здесь проверяется только каркас. + */ +const test = require('node:test'); +const assert = require('node:assert'); +const fs = require('node:fs'); +const path = require('node:path'); +const { JSDOM, VirtualConsole } = require('jsdom'); + +const ROOT = path.join(__dirname, '..', '..'); +const readF = p => fs.readFileSync(path.join(ROOT, p), 'utf8'); +const wait = ms => new Promise(r => setTimeout(r, ms)); + +/* Инлайним внешние скрипты главы (CDN убираем, api/xp заменяем заглушками). */ +function buildPage(file) { + let html = readF('frontend/textbooks/' + file); + const inl = { + '/js/biochem-core.js': readF('frontend/js/biochem-core.js'), + '/js/chem8_svg.js': readF('frontend/js/chem8_svg.js'), + '/js/chem7_svg.js': readF('frontend/js/chem7_svg.js'), + '/js/chem8_engine.js': readF('frontend/js/chem8_engine.js') + }; + html = html + .replace(/') + .replace(/'); + }); + return html; +} + +async function loadDom(file) { + const errors = []; + const vc = new VirtualConsole(); + vc.on('jsdomError', e => errors.push(e.message)); + const dom = new JSDOM(buildPage(file), { + runScripts: 'dangerously', pretendToBeVisual: true, virtualConsole: vc, url: 'http://localhost/', + beforeParse(w) { w.scrollTo = function () {}; } + }); + await wait(160); + return { dom, errors, doc: dom.window.document }; +} + +const CHAPTERS = [ + { file: 'chemistry_7_ch1.html', cards: 15, first: 'sec-p1' }, + { file: 'chemistry_7_ch2.html', cards: 8, first: 'sec-p13' }, + { file: 'chemistry_7_ch3.html', cards: 9, first: 'sec-p18' }, + { file: 'chemistry_7_ch4.html', cards: 7, first: 'sec-p23' } +]; + +for (const ch of CHAPTERS) { + test(`${ch.file}: SPA без ошибок, ${ch.cards} карточек, активен ${ch.first}`, async () => { + const { doc, errors } = await loadDom(ch.file); + assert.deepEqual(errors, [], 'нет ошибок: ' + errors.join(' | ')); + assert.equal(doc.querySelectorAll('#psel-grid .psel-card').length, ch.cards, ch.cards + ' карточек'); + const active = doc.querySelector('.sec.active'); + assert.ok(active && active.id === ch.first, 'активен ' + ch.first); + const firstId = ch.first.replace('sec-', ''); + assert.ok(doc.querySelector('#' + firstId + '-body .para-hero'), 'para-hero первого §'); + assert.ok(doc.querySelector('#' + firstId + '-body .read-wrap'), 'кнопка прочтения первого §'); + }); +} + +test('ch1: переход к §9 и финалу строит заглушку без ошибок', async () => { + const { doc, errors } = await loadDom('chemistry_7_ch1.html'); + doc.defaultView.goTo('p9'); await wait(80); + assert.ok(doc.querySelector('#p9-body .para-hero'), 'para-hero §9'); + doc.defaultView.goTo('final1'); await wait(80); + assert.ok(doc.querySelector('#final1-body .para-hero'), 'para-hero финала'); + assert.equal(doc.querySelector('#final1-body .read-wrap'), null, 'у финала нет кнопки прочтения'); + assert.deepEqual(errors, [], 'нет ошибок: ' + errors.join(' | ')); +}); + +/* ── Хаб: каталог глав + финал курса ── */ +function buildHub() { + let html = readF('frontend/textbooks/chemistry_7_hub.html'); + return html + .replace(/') + .replace(/ + + + + + + + + + + +
+
+
+

Химия 7 · Глава 1

+
Первоначальные химические понятия: вещество, атом, элемент, молекула, формула, валентность, реакция и уравнение
+
+
+ К главам + +
+
+
+ +
+
+ +
+

С чего начинается химия

+

Химия изучает вещества, их свойства и превращения. В этой главе вы научитесь главному «языку» химии: узнаете об атомах и химических элементах, научитесь записывать состав веществ формулами, определять валентность и составлять уравнения химических реакций.

+
+ +
+ Прогресс главы +
+ 0% +
+
+
+
+ +
+
Параграфы главы
+
+
+ +
§ 1

Химия — наука о веществах

+
§ 2

Чистые вещества и смеси

+
ПР 1

Практическая работа: знакомство с лабораторией. Разделение смесей

+
§ 3

Атомы. Химические элементы

+
§ 4

Относительная атомная масса химических элементов

+
§ 5

Молекулы. Простые вещества

+
§ 6

Сложные вещества

+
§ 7

Химическая формула

+
§ 8

Относительная молекулярная масса

+
§ 9

Валентность

+
§ 10

Явления физические и химические. Признаки химических реакций

+
Лаб. 1

Лабораторный опыт: признаки протекания химических реакций

+
§ 11

Закон сохранения массы веществ. Химические уравнения

+
§ 12

Составление уравнений химических реакций

+

Финал главы

+ +
+ +
+ +
Интерактивный учебник «Химия — 7 класс» · Глава 1 · «Первоначальные химические понятия» · LearnSpace
+
Достижение!
+ + + + + diff --git a/frontend/textbooks/chemistry_7_ch2.html b/frontend/textbooks/chemistry_7_ch2.html new file mode 100644 index 0000000..e58c89f --- /dev/null +++ b/frontend/textbooks/chemistry_7_ch2.html @@ -0,0 +1,118 @@ + + + + + + + + +Химия 7 · Глава 2 · «Кислород» + + + + + + + + + + + + + + +
+
+
+

Химия 7 · Глава 2

+
Кислород: воздух, горение, оксиды, получение кислорода
+
+
+ К главам + +
+
+
+ +
+
+ +
+

Кислород — газ, который даёт жизнь и огонь

+

Кислород — самый распространённый элемент на Земле. Без него невозможны дыхание и горение. В этой главе вы узнаете состав воздуха, познакомитесь с кислородом как простым веществом, изучите горение и оксиды, научитесь получать кислород в лаборатории.

+
+ +
+ Прогресс главы +
+ 0% +
+
+
+
+ +
+
Параграфы главы
+
+
+ +
§ 13

Воздух как смесь газов

+
Лаб. 2

Лабораторный опыт: сборка приборов для получения и собирания газов

+
§ 14

Кислород как химический элемент и простое вещество

+
§ 15

Химические свойства кислорода

+
§ 16

Оксиды

+
§ 17

Получение кислорода

+
ПР 2

Практическая работа: получение кислорода и изучение его свойств

+

Финал главы

+ +
+ +
+ +
Интерактивный учебник «Химия — 7 класс» · Глава 2 · «Кислород» · LearnSpace
+
Достижение!
+ + + + + diff --git a/frontend/textbooks/chemistry_7_ch3.html b/frontend/textbooks/chemistry_7_ch3.html new file mode 100644 index 0000000..da9ee68 --- /dev/null +++ b/frontend/textbooks/chemistry_7_ch3.html @@ -0,0 +1,120 @@ + + + + + + + + +Химия 7 · Глава 3 · «Водород» + + + + + + + + + + + + + + +
+
+
+

Химия 7 · Глава 3

+
Водород: свойства, кислоты и индикаторы, ряд активности, соли
+
+
+ К главам + +
+
+
+ +
+
+ +
+

Водород — самый лёгкий элемент Вселенной

+

Водород — первый элемент периодической системы и самый распространённый во Вселенной. В этой главе вы изучите его свойства, познакомитесь с кислотами и индикаторами, узнаете, как металлы вытесняют водород из кислот, и что такое соли.

+
+ +
+ Прогресс главы +
+ 0% +
+
+
+
+ +
+
Параграфы главы
+
+
+ +
§ 18

Водород — химический элемент и простое вещество

+
§ 19

Химические свойства водорода

+
§ 20

Понятие о кислотах

+
Лаб. 3

Лабораторный опыт: действие кислот на индикаторы

+
§ 21

Взаимодействие кислот с металлами

+
Лаб. 4

Лабораторный опыт: взаимодействие серной и соляной кислот с металлами

+
§ 22

Соли — продукты замещения атомов водорода в кислотах на металлы

+
ПР 3

Практическая работа: получение водорода и изучение его свойств

+

Финал главы

+ +
+ +
+ +
Интерактивный учебник «Химия — 7 класс» · Глава 3 · «Водород» · LearnSpace
+
Достижение!
+ + + + + diff --git a/frontend/textbooks/chemistry_7_ch4.html b/frontend/textbooks/chemistry_7_ch4.html new file mode 100644 index 0000000..8dc7ba9 --- /dev/null +++ b/frontend/textbooks/chemistry_7_ch4.html @@ -0,0 +1,116 @@ + + + + + + + + +Химия 7 · Глава 4 · «Вода» + + + + + + + + + + + + + + +
+
+
+

Химия 7 · Глава 4

+
Вода: состав и свойства, основания и индикаторы, нейтрализация, охрана природы
+
+
+ К главам + +
+
+
+ +
+
+ +
+

Вода — самое важное вещество на Земле

+

Вода знакома каждому, но в химии она удивительна. В этой главе вы изучите состав и свойства воды, познакомитесь с основаниями и индикаторами, узнаете о реакции нейтрализации и о том, как беречь воду и окружающую среду.

+
+ +
+ Прогресс главы +
+ 0% +
+
+
+
+ +
+
Параграфы главы
+
+
+ +
§ 23

Состав, физические и химические свойства воды

+
§ 24

Основания как сложные вещества

+
Лаб. 5

Лабораторный опыт: действие щелочей на индикаторы

+
§ 25

Реакция нейтрализации

+
ПР 4

Практическая работа: реакция нейтрализации

+
§ 26

Охрана окружающей среды

+

Финал главы

+ +
+ +
+ +
Интерактивный учебник «Химия — 7 класс» · Глава 4 · «Вода» · LearnSpace
+
Достижение!
+ + + + + diff --git a/frontend/textbooks/chemistry_7_hub.html b/frontend/textbooks/chemistry_7_hub.html new file mode 100644 index 0000000..60d4dd3 --- /dev/null +++ b/frontend/textbooks/chemistry_7_hub.html @@ -0,0 +1,540 @@ + + + + + + + + +Химия 7 класс — учебник + + + + + + + + + + +
+
+
+ + + К каталогу + +
+
+

Химия — 7 класс

+
Первый курс химии: вещества и реакции, кислород, водород, вода. 4 главы, 26 параграфов, 5 лабораторных опытов, 4 практические работы.
+
+
+ +
+
+
+ +
+ +
+
Х
+
+
Общий прогресс по курсу
+
Загрузка...
+
+
+ +
+ +
+ + +
+
Aₕ
+
Глава 1
+
Первоначальные химические понятия
+
§1–§12 · ЛО 1 · ПР 1
+
+
+
Вещества и смеси, атомы и химические элементы, относительная атомная масса, молекулы, простые и сложные вещества, химическая формула и $M_r$, валентность, признаки реакций, закон сохранения массы и химические уравнения.
+
+
Прогресс0%
+
+
+
Открыть главу
+
+
+ + +
+
O₂
+
Глава 2
+
Кислород
+
§13–§17 · ЛО 2 · ПР 2
+
+
+
Воздух как смесь газов, кислород — элемент и простое вещество, химические свойства кислорода и горение, оксиды, получение кислорода и катализаторы.
+
+
Прогресс0%
+
+
+
Открыть главу
+
+
+ + +
+
H₂
+
Глава 3
+
Водород
+
§18–§22 · ЛО 3,4 · ПР 3
+
+
+
Водород — элемент и простое вещество, химические свойства водорода, понятие о кислотах и индикаторах, взаимодействие кислот с металлами и ряд активности, соли как продукты замещения.
+
+
Прогресс0%
+
+
+
Открыть главу
+
+
+ + +
+
H₂O
+
Глава 4
+
Вода
+
§23–§26 · ЛО 5 · ПР 4
+
+
+
Состав, физические и химические свойства воды, основания как сложные вещества и индикаторы, реакция нейтрализации, охрана окружающей среды.
+
+
Прогресс0%
+
+
+
Открыть главу
+
+
+ +
+ +
+ +
+ +
Шпаргалка курса
+
+
Гл. 1Первоначальные понятия
  • $M_r=\sum A_r$ всех атомов
  • Валентность по водороду: H — I, O — II
  • Простое — один элемент, сложное — разные
  • В реакции масса сохраняется → коэффициенты
+
Гл. 2Кислород
  • Воздух: $N_2$ 78 %, $O_2$ 21 %
  • Горение: вещество $+ O_2 \to$ оксид
  • Оксид — соединение элемента с O
  • $O_2$ из разложения (катализатор $MnO_2$)
+
Гл. 3Водород
  • $H_2$ — самый лёгкий газ
  • Кислота = H + кислотный остаток
  • Ряд активности: до $H_2$ — вытесняют газ
  • Соль = металл + кислотный остаток
+
Гл. 4Вода
  • Разложение воды: $H_2 : O_2 = 2 : 1$
  • Основание = металл + OH
  • Индикаторы: лакмус, метилоранж, фенолфталеин
  • Нейтрализация: кислота + основание → соль + вода
+
+ +
8 интегрированных боссов
+
Боссов побеждено: 0 / 8
+
+ +
+
+
Курс «Химия 7» пройден!
Вы прошли итоговую проверку по всем 4 главам. +150 XP, ачивка «Химик 7 класса» получена.
+ К каталогу +
+ +
+
+ +
+
+ +
+
+
Химик 7 класса
+
Изучите все 26 параграфов курса, чтобы получить достижение.
+
+
+ +
+ +
+ Интерактивный учебник «Химия — 7 класс» · LearnSpace +
+ + + + +