Files
Learn_System/backend/scripts/make_class7_stubs.js
T
Maxim Dolgolyov e8767ed30d feat(text7): Wave 0 — каркас Алгебры 7 и Геометрии 7 (hubs + миграции + стабы)
- docs/PLAN_ALGEBRA_7_GEOMETRY_7.md: полный план реализации (содержание, архитектура, волны)
- 018_algebra_7_hub.sql: hub algebra-7 (sort=6) + 4 ch (§1-§3, §4-§14, §15-§20, §21-§25)
- 019_geometry_7_hub.sql: hub geometry-7 (sort=7) + 5 ch (§1-§7, §8-§14, §15-§18, §19-§26, §27-§31)
- algebra_7_hub.html: 4-карточный hub в pink-теме (Арефьева/Пирютко 2022)
- geometry_7_hub.html: 5-карточный hub в blue-теме (Казаков 2022)
- 9 стаб-страниц глав со ссылкой назад в свой hub (заглушки до реализации волн 1-9)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-28 21:13:56 +03:00

97 lines
6.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
'use strict';
const fs = require('fs');
const path = require('path');
const root = path.join(__dirname, '..', '..', 'frontend', 'textbooks');
const STUBS = [
{ f:'algebra_7_ch1.html', hub:'/textbook/algebra-7', hubName:'Алгебра 7', ch:'Глава 1 · Степень', range:'§1–§3', color:'#d97706', colorD:'#b45309', wm:'a&#8319;' },
{ f:'algebra_7_ch2.html', hub:'/textbook/algebra-7', hubName:'Алгебра 7', ch:'Глава 2 · Выражения и их преобразования', range:'§4–§14', color:'#059669', colorD:'#047857', wm:'P(x)' },
{ f:'algebra_7_ch3.html', hub:'/textbook/algebra-7', hubName:'Алгебра 7', ch:'Глава 3 · Линейные уравнения. Неравенства. Функция', range:'§15–§20', color:'#7c3aed', colorD:'#6d28d9', wm:'y=kx' },
{ f:'algebra_7_ch4.html', hub:'/textbook/algebra-7', hubName:'Алгебра 7', ch:'Глава 4 · Системы линейных уравнений', range:'§21–§25', color:'#0891b2', colorD:'#0e7490', wm:'{' },
{ f:'geometry_7_ch1.html', hub:'/textbook/geometry-7', hubName:'Геометрия 7', ch:'Глава 1 · Начальные понятия', range:'§1–§7', color:'#d97706', colorD:'#b45309', wm:'&#9679;' },
{ f:'geometry_7_ch2.html', hub:'/textbook/geometry-7', hubName:'Геометрия 7', ch:'Глава 2 · Признаки равенства треугольников', range:'§8–§14', color:'#059669', colorD:'#047857', wm:'&#9651;' },
{ f:'geometry_7_ch3.html', hub:'/textbook/geometry-7', hubName:'Геометрия 7', ch:'Глава 3 · Параллельность прямых', range:'§15–§18', color:'#7c3aed', colorD:'#6d28d9', wm:'&#8741;' },
{ f:'geometry_7_ch4.html', hub:'/textbook/geometry-7', hubName:'Геометрия 7', ch:'Глава 4 · Сумма углов треугольника', range:'§19–§26', color:'#0891b2', colorD:'#0e7490', wm:'&#8736;' },
{ f:'geometry_7_ch5.html', hub:'/textbook/geometry-7', hubName:'Геометрия 7', ch:'Глава 5 · Задачи на построение', range:'§27–§31', color:'#db2777', colorD:'#9d174d', wm:'&#9711;' },
];
const tpl = ({ hub, hubName, ch, range, color, colorD, wm }) => `<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>${ch}</title>
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@600;800;900&family=Inter:wght@400;600;700&display=swap" rel="stylesheet">
<script src="/js/api.js" defer></script>
<style>
:root{--bg:#fafafa;--card:#fff;--text:#0f172a;--muted:#64748b;--border:#e2e8f0;--pri:${color};--pri-d:${colorD};--pri-soft:${color}1a}
html.dark{--bg:#0a0a0e;--card:#13120a;--text:#fef9e7;--muted:#a39070;--border:#2a2512}
*{margin:0;padding:0;box-sizing:border-box}
html,body{min-height:100vh}
body{font-family:'Inter',system-ui,sans-serif;background:var(--bg);color:var(--text);line-height:1.55}
.hdr{position:relative;background:linear-gradient(110deg,${colorD},${color} 60%,${color}cc);color:#fff;padding:46px 22px 30px;overflow:hidden;border-bottom:2px solid ${color}33}
.hdr::before{content:'${wm}';position:absolute;right:-12px;top:50%;transform:translateY(-50%);font-family:'Outfit',sans-serif;font-size:clamp(5rem,15vw,11rem);font-weight:900;color:transparent;-webkit-text-stroke:1.5px rgba(255,255,255,.12);line-height:1;pointer-events:none}
.hdr-inner{position:relative;z-index:1;max-width:1100px;margin:0 auto;display:flex;align-items:center;gap:18px;flex-wrap:wrap}
.hdr-back{display:inline-flex;align-items:center;gap:8px;padding:8px 14px;background:rgba(255,255,255,.14);border-radius:9px;color:#fff;text-decoration:none;font-size:.85rem;font-weight:600}
.hdr-back:hover{background:rgba(255,255,255,.24)}
.hdr h1{font-family:'Outfit',sans-serif;font-size:1.6rem;font-weight:900}
.hdr-sub{font-size:.92rem;opacity:.85;margin-top:4px}
.ic{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;display:inline-block;vertical-align:middle}
main{max-width:740px;margin:0 auto;padding:48px 22px 80px}
.coming{background:var(--card);border:1.5px solid var(--border);border-radius:18px;padding:32px 28px;text-align:center;box-shadow:0 4px 18px rgba(0,0,0,.05)}
.coming-icon{width:72px;height:72px;border-radius:20px;background:var(--pri-soft);display:flex;align-items:center;justify-content:center;margin:0 auto 18px;color:var(--pri-d)}
.coming-icon svg{width:36px;height:36px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.coming h2{font-family:'Outfit',sans-serif;font-size:1.5rem;color:var(--pri-d);margin-bottom:12px}
.coming p{font-size:1rem;color:var(--muted);margin-bottom:8px}
.coming p b{color:var(--text)}
.coming-cta{margin-top:24px;display:inline-flex;align-items:center;gap:8px;padding:12px 22px;background:linear-gradient(135deg,var(--pri),var(--pri-d));color:#fff;border-radius:12px;font-weight:700;text-decoration:none;box-shadow:0 6px 22px ${color}33}
.coming-cta:hover{filter:brightness(1.08)}
.range-pill{display:inline-block;padding:5px 13px;background:var(--pri-soft);color:var(--pri-d);border-radius:99px;font-size:.84rem;font-weight:700;margin-top:6px}
</style>
</head>
<body>
<header class="hdr">
<div class="hdr-inner">
<div>
<a href="${hub}" class="hdr-back">
<svg class="ic" viewBox="0 0 24 24"><polyline points="15 18 9 12 15 6"/></svg>
К ${hubName}
</a>
</div>
<div>
<h1>${ch}</h1>
<div class="hdr-sub">${range}</div>
</div>
</div>
</header>
<main>
<div class="coming">
<div class="coming-icon">
<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg>
</div>
<h2>Глава в разработке</h2>
<p>Эта глава — часть нового курса <b>${hubName}</b>.</p>
<p>Содержание (${range}) уже спланировано — теория, интерактивы и финальный босс появятся в одной из ближайших волн реализации.</p>
<div class="range-pill">${range}</div>
<div style="margin-top:8px">
<a href="${hub}" class="coming-cta">
Вернуться к учебнику
<svg class="ic" viewBox="0 0 24 24"><polyline points="9 18 15 12 9 6"/></svg>
</a>
</div>
</div>
</main>
</body>
</html>
`;
for (const s of STUBS) {
fs.writeFileSync(path.join(root, s.f), tpl(s), 'utf8');
console.log('wrote ' + s.f);
}