${escapeHtml(article.title)}
${escapeHtml(article.excerpt)}
Открыть статьюfunction initMobileMenu() { if (!document.body.dataset.blogPage) return; const button = document.getElementById("mobile-menu-btn"); const menu = document.getElementById("mobile-menu"); if (!button || !menu) return; button.addEventListener("click", () => { menu.classList.toggle("hidden"); }); menu.querySelectorAll("a, button").forEach((item) => { item.addEventListener("click", () => menu.classList.add("hidden")); }); } function escapeHtml(value) { return String(value) .replaceAll("&", "&") .replaceAll("<", "<") .replaceAll(">", ">") .replaceAll('"', """); } function getArticleHref(article) { const pageType = document.body.dataset.blogPage; return pageType === "archive" || pageType === "article" ? `./${article.slug}.html` : `./blog/${article.slug}.html`; } function getBlogPlaceholderSrc() { const pageType = document.body.dataset.blogPage; return pageType === "archive" || pageType === "article" ? "../images/shared/article-placeholder.svg" : "./images/shared/article-placeholder.svg"; } function getArticleImageSrc(article) { if (!article.image) { return getBlogPlaceholderSrc(); } const pageType = document.body.dataset.blogPage; return pageType === "archive" || pageType === "article" ? `../${article.image}` : `./${article.image}`; } function getArticleImageFallbackAttr() { return `this.onerror=null;this.src='${getBlogPlaceholderSrc()}'`; } function buildFooterSocialLinksMarkup() { return `
`; } function normalizeFooterContacts() { const footer = document.querySelector("footer"); footer?.querySelectorAll(".grid > div:last-child li").forEach((item) => { item.textContent = item.textContent.replace(/^[^+\p{L}\p{N}]+/u, "").trim(); }); } function initFooterSocialLinks() { const footer = document.querySelector("footer"); const footerColumns = footer?.querySelectorAll(".grid > div"); const contactColumn = footerColumns?.[footerColumns.length - 1]; if (!contactColumn || contactColumn.querySelector("[data-footer-socials]")) return; contactColumn.insertAdjacentHTML("beforeend", buildFooterSocialLinksMarkup()); } function articleCardMarkup(article) { const pageType = document.body.dataset.blogPage; const href = getArticleHref(article); const imageSrc = getArticleImageSrc(article); const imageFallback = getArticleImageFallbackAttr(); if (!pageType) { return `${escapeHtml(article.excerpt)}
Открыть статьюСодержание появится после добавления подзаголовков.
"; return; } const itemsMarkup = headings .map((heading, index) => { if (!heading.id) { heading.id = buildHeadingId(index); } const itemClass = heading.tagName === "H3" ? "article-toc__item article-toc__item--nested" : "article-toc__item"; return `