// Generator for Geometry 11 chapter files (Phase 0 skeleton). // Produces frontend/textbooks/geometry_11_ch{1..4}.html with all helpers + STUB builders. 'use strict'; const fs = require('fs'); const path = require('path'); const OUT_DIR = path.join(__dirname, '..', '..', 'frontend', 'textbooks'); const CHAPTERS = [ { n: 1, title: 'Призма и цилиндр', hdr_sub: 'Призма (правильная, прямая, наклонная, параллелепипед, куб) · цилиндр и его сечения', hero_h2: 'Призма и цилиндр — главные стереометрические тела', hero_p: 'Изучаем призму и цилиндр — главные стереометрические тела. Сечения, развёртки, формулы площадей и объёмов в 3D.', final_id: 'final1', color: { hdr_grad: 'linear-gradient(110deg,#92400e 0%,#d97706 55%,#fbbf24 100%)', hdr_label: 'РАЗДЕЛ 1', hdr_border: 'rgba(251,191,36,.2)', pri: '#d97706', pri2: '#b45309', pri_soft: '#fef3c7', acc: '#f59e0b', acc2: '#d97706', acc_soft: '#fef9c3', dark_bg: '#0a0a0e', dark_card: '#13120a', dark_card_soft: '#18160a', dark_text: '#fef9e7', dark_muted: '#a39070', dark_border: '#2a2512', }, paras: [ { id: 'p1', num: '§ 1', name: 'Призма', sub: '$S_{бок}=Pl$, $V=S_{осн}h$', watermark: '\\triangle' }, { id: 'p2', num: '§ 2', name: 'Цилиндр', sub: '$S_{бок}=2\\pi Rh$, $V=\\pi R^2h$', watermark: '\\bigcirc' }, ], }, { n: 2, title: 'Пирамида и конус', hdr_sub: 'Пирамида (правильная, усечённая) · конус (правильный, усечённый) · объёмы через 1/3', hero_h2: 'Пирамида и конус — фигуры с вершиной', hero_p: 'Пирамида и конус — фигуры с вершиной. Правильные и усечённые. Объём через одну треть основания на высоту.', final_id: 'final2', color: { hdr_grad: 'linear-gradient(110deg,#064e3b 0%,#059669 55%,#34d399 100%)', hdr_label: 'РАЗДЕЛ 2', hdr_border: 'rgba(52,211,153,.2)', pri: '#059669', pri2: '#047857', pri_soft: '#d1fae5', acc: '#10b981', acc2: '#059669', acc_soft: '#a7f3d0', dark_bg: '#04140e', dark_card: '#082017', dark_card_soft: '#0a2a1d', dark_text: '#d1fae5', dark_muted: '#6ee7b7', dark_border: '#0f3a28', }, paras: [ { id: 'p3', num: '§ 3', name: 'Пирамида', sub: '$V=\\frac{1}{3}S_{осн}h$', watermark: '\\triangledown' }, { id: 'p4', num: '§ 4', name: 'Конус', sub: '$S_{бок}=\\pi Rl$', watermark: '\\nabla' }, ], }, { n: 3, title: 'Сфера и шар', hdr_sub: 'Сфера и её уравнение · шар, сегменты · 5 платоновых тел', hero_h2: 'Сфера, шар, правильные многогранники', hero_p: 'Сфера, шар, пять платоновых тел. Уравнение сферы в координатах, шаровые сегменты, вписанные и описанные многогранники.', final_id: 'final3', color: { hdr_grad: 'linear-gradient(110deg,#3b0764 0%,#7c3aed 55%,#a78bfa 100%)', hdr_label: 'РАЗДЕЛ 3', hdr_border: 'rgba(167,139,250,.2)', pri: '#7c3aed', pri2: '#6d28d9', pri_soft: '#ede9fe', acc: '#a78bfa', acc2: '#7c3aed', acc_soft: '#f3e8ff', dark_bg: '#0e0521', dark_card: '#1a0a30', dark_card_soft: '#220c3d', dark_text: '#ede9fe', dark_muted: '#c4b5fd', dark_border: '#3a1d5e', }, paras: [ { id: 'p5', num: '§ 5', name: 'Сфера', sub: '$(x-a)^2+(y-b)^2+(z-c)^2=R^2$', watermark: 'S^2' }, { id: 'p6', num: '§ 6', name: 'Шар', sub: '$S=4\\pi R^2$, $V=\\frac{4}{3}\\pi R^3$', watermark: 'V' }, { id: 'p7', num: '§ 7', name: 'Правильные многогранники', sub: '5 платоновых тел', watermark: '\\star' }, ], }, { n: 4, title: 'Повторение', hdr_sub: 'Планиметрия · величины · координаты и векторы в 3D · построения', hero_h2: 'Повторение всей геометрии', hero_p: 'Повторение всей геометрии: планиметрия, площади и объёмы, координаты и векторы в 3D, классические построения.', final_id: 'final4', color: { hdr_grad: 'linear-gradient(110deg,#881337 0%,#e11d48 55%,#fb7185 100%)', hdr_label: 'РАЗДЕЛ 4', hdr_border: 'rgba(251,113,133,.2)', pri: '#e11d48', pri2: '#be123c', pri_soft: '#ffe4e6', acc: '#f43f5e', acc2: '#e11d48', acc_soft: '#fecdd3', dark_bg: '#1a0510', dark_card: '#2a081a', dark_card_soft: '#36102a', dark_text: '#ffe4e6', dark_muted: '#fda4af', dark_border: '#4a1029', }, paras: [ { id: 'p8', num: '§ 8', name: 'Геометрические фигуры и их свойства', sub: 'планиметрия', watermark: '\\square' }, { id: 'p9', num: '§ 9', name: 'Геометрические величины', sub: 'площади, объёмы', watermark: 'S=' }, { id: 'p10', num: '§ 10', name: 'Координаты и векторы', sub: '3D: $\\vec{a}=(x;y;z)$', watermark: '\\vec{v}' }, { id: 'p11', num: '§ 11', name: 'Геометрические построения', sub: 'циркуль и линейка', watermark: '\\circlearrowleft' }, ], }, ]; function chapterTpl(ch) { const allParas = ch.paras.concat([{ id: ch.final_id, num: '★', name: 'Финал раздела', sub: 'Итоги · боссы раздела ' + ch.n, final: true, watermark: '\\star' }]); const PARAS_JS = allParas.map(p => { const sub = p.sub ? `, sub:'${p.sub.replace(/\\/g, '\\\\').replace(/'/g, "\\'")}'` : ''; const fin = p.final ? `, final:true` : ''; return ` { id:'${p.id}', num:'${p.num}', name:${JSON.stringify(p.name)}${sub}${fin} }`; }).join(',\n'); // SIDEBARS (basic placeholder per para) const SIDEBARS_JS = allParas.map(p => { const t = p.final ? `Финал раздела ${ch.n}` : `Шпаргалка ${p.num}`; const rows = p.final ? `[["${ch.paras[0].num}–${ch.paras[ch.paras.length-1].num}","теория раздела ${ch.n}"],["Награда","+50 XP"]]` : `[["Тема", ${JSON.stringify(p.name)}],["Формула","${(p.sub || '').replace(/\\/g, '\\\\\\\\').replace(/"/g, '\\"')}"]]`; return ` ${p.id}:{title:${JSON.stringify(t)}, rows:${rows}}`; }).join(',\n'); const TIPS_JS = allParas.map(p => { const html = p.final ? `Финал раздела ${ch.n} — интегрированные задачи по разделу.` : `${p.num} «${p.name}» — содержание в разработке. ${(p.sub || '').replace(/\\/g, '\\\\\\\\')}`; return ` {sec:'${p.id}',html:${JSON.stringify(html)}}`; }).join(',\n'); const ACH_LABELS_JS = ch.paras.map(p => ` ${p.id}_done:"${p.name} освоено!"`).concat([ ` start:"Начало раздела ${ch.n}!"`, ` ch${ch.n}_done:"Раздел ${ch.n} пройден!"` ]).join(',\n'); // sec[id="sec-pX"] rules for accent colors const SEC_COLOR_RULES = allParas.map(p => { return `.sec[id="sec-${p.id}"]{ --sec-acc:${ch.color.pri}; --sec-acc-d:${ch.color.pri2}; --sec-acc-soft:${ch.color.pri_soft}; }`; }).join('\n'); // sec elements in body const SEC_HTML = allParas.map(p => { const w = p.final ? '★' : p.watermark; return `
${p.final ? '★' : p.num}

${p.name}

`; }).join('\n'); // builders map const BUILDERS_JS = allParas.map(p => `${p.id}:()=>buildStub('${p.id}')`).join(', '); // search NAMES const NAMES_JS = allParas.map(p => `${p.id}:'${p.final ? 'Финал' : p.num.replace('§', '\\xA7').replace(' ', '')}'`).join(','); const TOTAL_PARAS = allParas.length; const SLUG = `geometry-11-ch${ch.n}`; const TITLE = `Геометрия 11 · Раздел ${ch.n} · «${ch.title}»`; const HDR_H1 = `Геометрия 11 · Раздел ${ch.n}`; const HDR_LABEL = ch.color.hdr_label; const HDR_GRAD = ch.color.hdr_grad; const HDR_BORDER = ch.color.hdr_border; return ` ${TITLE}

${HDR_H1}

${ch.hdr_sub}
К геометрии 11

${ch.hero_h2}

${ch.hero_p}

Прогресс по разделу
0%
Параграфы раздела
${SEC_HTML}
Достижение!
`; } // === Main === for (const ch of CHAPTERS) { const out = path.join(OUT_DIR, `geometry_11_ch${ch.n}.html`); const content = chapterTpl(ch); fs.writeFileSync(out, content, 'utf8'); console.log(`Wrote ${out} (${content.length} bytes)`); } console.log('Done.');