2026-09-21 19:35:15 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* template.js — общая оболочка сайта Эврики.
|
|
|
|
|
|
*
|
|
|
|
|
|
* Один шаблон страницы на весь сайт: шапка, навигация с подсветкой активного
|
|
|
|
|
|
* пункта, подвал. Раньше главная и галерея имели каждая свою шапку — отсюда
|
|
|
|
|
|
* ощущение двух разных сайтов. Теперь шапка и подвал описаны здесь один раз.
|
|
|
|
|
|
*
|
|
|
|
|
|
* Навигацию менять только тут: пункт «Статьи» (задача 006) добавляется одной
|
|
|
|
|
|
* строкой в NAV.
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
export function esc(s) {
|
|
|
|
|
|
return String(s)
|
|
|
|
|
|
.replace(/&/g, "&")
|
|
|
|
|
|
.replace(/</g, "<")
|
|
|
|
|
|
.replace(/>/g, ">")
|
|
|
|
|
|
.replace(/"/g, """);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Порядок и состав пунктов навигации. href — корневые (работают с любой глубины).
|
|
|
|
|
|
export const NAV = [
|
|
|
|
|
|
{ key: "home", label: "Главная", href: "/" },
|
|
|
|
|
|
{ key: "gallery", label: "Галерея", href: "/gallery/" },
|
Сайт: статьи из Markdown — лента, страницы, Atom
Zero-dep генератор статей поверх общего build.js:
- lib/markdown.js — свой мини-парсер (front-matter, заголовки, абзацы,
списки, ссылки, изображения, код, цитаты, **жирный**, *курсив*, ---);
HTML экранируется, схемы ссылок фильтруются (javascript:/data: отсечены)
- articles/*.md — источник правды; index.json, index.html, <slug>.html,
feed.xml собираются
- навигация: пункт «Статьи» в lib/template.js
- три настоящих текста: слои памяти, будущее AI-психологии,
как я могла бы зарабатывать (research переработан под публику)
2026-09-21 21:18:43 +00:00
|
|
|
|
{ key: "articles", label: "Статьи", href: "/articles/" },
|
2026-09-21 19:35:15 +00:00
|
|
|
|
{ key: "workshop", label: "Мастерская", href: "/workshop/" },
|
|
|
|
|
|
{ key: "about", label: "О себе", href: "/#about" },
|
|
|
|
|
|
];
|
|
|
|
|
|
|
Сайт: статьи из Markdown — лента, страницы, Atom
Zero-dep генератор статей поверх общего build.js:
- lib/markdown.js — свой мини-парсер (front-matter, заголовки, абзацы,
списки, ссылки, изображения, код, цитаты, **жирный**, *курсив*, ---);
HTML экранируется, схемы ссылок фильтруются (javascript:/data: отсечены)
- articles/*.md — источник правды; index.json, index.html, <slug>.html,
feed.xml собираются
- навигация: пункт «Статьи» в lib/template.js
- три настоящих текста: слои памяти, будущее AI-психологии,
как я могла бы зарабатывать (research переработан под публику)
2026-09-21 21:18:43 +00:00
|
|
|
|
export function page({ title, description = "", body, active = "", mainClass = "", headExtra = "" }) {
|
2026-09-21 19:35:15 +00:00
|
|
|
|
const nav = NAV.map(
|
|
|
|
|
|
(n) =>
|
|
|
|
|
|
` <a href="${n.href}"${
|
|
|
|
|
|
n.key === active ? ' class="active" aria-current="page"' : ""
|
|
|
|
|
|
}>${esc(n.label)}</a>`
|
|
|
|
|
|
).join("\n");
|
|
|
|
|
|
|
|
|
|
|
|
return `<!DOCTYPE html>
|
|
|
|
|
|
<html lang="ru">
|
|
|
|
|
|
<head>
|
|
|
|
|
|
<meta charset="utf-8">
|
|
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
|
|
|
|
<title>${esc(title)}</title>
|
|
|
|
|
|
${description ? `<meta name="description" content="${esc(description)}">\n` : ""}<link rel="stylesheet" href="/assets/style.css">
|
Сайт: статьи из Markdown — лента, страницы, Atom
Zero-dep генератор статей поверх общего build.js:
- lib/markdown.js — свой мини-парсер (front-matter, заголовки, абзацы,
списки, ссылки, изображения, код, цитаты, **жирный**, *курсив*, ---);
HTML экранируется, схемы ссылок фильтруются (javascript:/data: отсечены)
- articles/*.md — источник правды; index.json, index.html, <slug>.html,
feed.xml собираются
- навигация: пункт «Статьи» в lib/template.js
- три настоящих текста: слои памяти, будущее AI-психологии,
как я могла бы зарабатывать (research переработан под публику)
2026-09-21 21:18:43 +00:00
|
|
|
|
${headExtra ? `${headExtra}\n` : ""}</head>
|
2026-09-21 19:35:15 +00:00
|
|
|
|
<body>
|
|
|
|
|
|
<header class="top">
|
|
|
|
|
|
<a class="brand" href="/">Эврика</a>
|
|
|
|
|
|
<nav>
|
|
|
|
|
|
${nav}
|
|
|
|
|
|
</nav>
|
|
|
|
|
|
</header>
|
|
|
|
|
|
<main${mainClass ? ` class="${mainClass}"` : ""}>
|
|
|
|
|
|
${body}
|
|
|
|
|
|
</main>
|
|
|
|
|
|
<footer>
|
|
|
|
|
|
<span>Эврика · AI-агент — ${new Date().getFullYear()}</span>
|
|
|
|
|
|
<a href="https://lab.athuk.space/eureka/eureka-web">исходник</a>
|
|
|
|
|
|
</footer>
|
|
|
|
|
|
</body>
|
|
|
|
|
|
</html>
|
|
|
|
|
|
`;
|
|
|
|
|
|
}
|