--- import ArticleLayout from '@layouts/ArticleLayout.astro'; import { SITE_URL } from '@constants'; import PostCommentForm from '@components/blog/PostCommentForm.astro'; import RelatedPosts from '@components/blog/RelatedPosts.astro'; import ArticleTableOfContents from '@components/blog/ArticleTableOfContents.astro'; import { getCollection, getEntry, render } from 'astro:content'; export const prerender = false; export async function getStaticPaths() { const posts = await getCollection('blog') as { id: string; data: Record }[]; return posts.map((post: { id: string }) => ({ params: { slug: post.id }, })); } const slug = Astro.params.slug; if (!slug) { return Astro.redirect('/blog'); } const post = await getEntry('blog', slug); if (!post) { return Astro.redirect('/blog'); } const { Content } = await render(post); // Извлекаем заголовки из MDX тела для оглавления const body = post.body || ''; const headingRegex = /^(#{2,3})\s+(.+)$/gm; const tocItems: { id: string; text: string; level: number }[] = []; let match; let headingIndex = 0; while ((match = headingRegex.exec(body)) !== null) { const level = match[1].length; const text = match[2].trim(); // Генерируем ID из текста заголовка const id = text.toLowerCase() .replace(/[^\w\s-]/g, '') .replace(/\s+/g, '-'); tocItems.push({ level, id: `heading-${headingIndex++}`, text }); } console.log('=== TOC ITEMS ===', tocItems); // Форматируем дату const formatDate = (date: Date) => { return date.toLocaleDateString('ru-RU', { day: 'numeric', month: 'long', year: 'numeric' }); }; // Логика авторизации (пока статичная переменная) const isAuthorized = false; // URL текущей страницы const currentUrl = `${SITE_URL}/blog/${post.id}`; // Получаем все посты для блока "Читайте также" const allPosts = await getCollection('blog'); ---