(function () { function initMobileMenu() { if (!document.body.dataset.newsPage) 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 parseRuDate(value) { const [day, month, year] = String(value || "").split("."); return new Date(Number(year), Number(month) - 1, Number(day)).getTime() || 0; } function getSortedNewsArticles() { if (!Array.isArray(window.NEWS_ARTICLES)) return []; return [...window.NEWS_ARTICLES].sort((a, b) => { const aFeatured = a.featured ? 1 : 0; const bFeatured = b.featured ? 1 : 0; if (aFeatured !== bFeatured) { return bFeatured - aFeatured; } if (a.featured && b.featured) { return (a.featuredOrder || 9999) - (b.featuredOrder || 9999); } return parseRuDate(b.publishedAt) - parseRuDate(a.publishedAt); }); } function getNewsHref(article) { const pageType = document.body.dataset.newsPage; return pageType === "archive" || pageType === "article" ? `./${article.slug}.html` : `./news/${article.slug}.html`; } function getNewsPlaceholderSrc() { const pageType = document.body.dataset.newsPage; return pageType === "archive" || pageType === "article" ? "../images/shared/article-placeholder.svg" : "./images/shared/article-placeholder.svg"; } function getNewsImageSrc(article) { if (!article.image) { return getNewsPlaceholderSrc(); } const pageType = document.body.dataset.newsPage; return pageType === "archive" || pageType === "article" ? `../${article.image}` : `./${article.image}`; } function getNewsImageFallbackAttr() { return `this.onerror=null;this.src='${getNewsPlaceholderSrc()}'`; } 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 featuredBadgeMarkup(article) { return article.featured ? `Избранное` : ""; } function homeNewsTeaserMarkup(article) { const href = getNewsHref(article); return `

${article.publishedAt}

${featuredBadgeMarkup(article)}

${escapeHtml(article.title)}

${escapeHtml(article.excerpt)}

Открыть новость
`; } function newsCardMarkup(article) { const pageType = document.body.dataset.newsPage; const href = getNewsHref(article); const imageSrc = getNewsImageSrc(article); const imageFallback = getNewsImageFallbackAttr(); if (!pageType) { return `
${escapeHtml(article.title)}
${article.publishedAt} Новость ${featuredBadgeMarkup(article)}

${escapeHtml(article.title)}

${escapeHtml(article.excerpt)}

Открыть новость
`; } return `
${escapeHtml(article.title)}
${article.publishedAt} Новость ${featuredBadgeMarkup(article)}

${escapeHtml(article.title)}

${escapeHtml(article.excerpt)}

Читать новость →
`; } function renderHomeNewsTeasers(containerId, limit) { const container = document.getElementById(containerId); if (!container) return; const items = getSortedNewsArticles().slice(0, limit); container.innerHTML = items.map(homeNewsTeaserMarkup).join(""); } function renderNewsGrid(containerId, limit) { const container = document.getElementById(containerId); if (!container) return; const items = getSortedNewsArticles().slice(0, limit || undefined); container.innerHTML = items.map(newsCardMarkup).join(""); } function buildHeadingId(index) { return `section-${index + 1}`; } function insertTocAfterIntro(tocCard, content) { const introParagraphs = Array.from(content.children).filter((node) => node.tagName === "P"); const insertionTarget = introParagraphs[1] || introParagraphs[0]; if (insertionTarget?.parentNode === content) { insertionTarget.insertAdjacentElement("afterend", tocCard); } else { content.prepend(tocCard); } } function initArticleToc() { const toc = document.getElementById("article-toc"); const tocCard = toc?.closest(".article-toc-card"); const content = document.querySelector("[data-article-content]"); if (!toc || !tocCard || !content) return; const headings = Array.from(content.querySelectorAll("h2, h3")); if (!headings.length) { toc.innerHTML = "

Содержание появится после добавления подзаголовков.

"; 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 `
  • ${escapeHtml(heading.textContent.trim())}
  • `; }) .join(""); toc.innerHTML = ``; tocCard.classList.add("article-toc-card--inline"); insertTocAfterIntro(tocCard, content); const tocItems = Array.from(toc.querySelectorAll(".article-toc__item")); const collapsibleItems = tocItems.slice(6); if (!collapsibleItems.length) return; collapsibleItems.forEach((item) => { item.hidden = true; }); const toggleButton = document.createElement("button"); toggleButton.type = "button"; toggleButton.className = "article-toc-toggle"; toggleButton.textContent = "Показать полностью"; toggleButton.setAttribute("aria-expanded", "false"); toggleButton.addEventListener("click", () => { const expanded = toggleButton.getAttribute("aria-expanded") === "true"; collapsibleItems.forEach((item) => { item.hidden = expanded; }); toggleButton.setAttribute("aria-expanded", expanded ? "false" : "true"); toggleButton.textContent = expanded ? "Показать полностью" : "Свернуть содержание"; }); tocCard.append(toggleButton); } function initArticleViews() { const slug = document.body.dataset.articleSlug; if (!slug) return; const key = `ozimaya:news:views:${slug}`; const currentViews = parseInt(localStorage.getItem(key) || "0", 10) + 1; localStorage.setItem(key, String(currentViews)); document.querySelectorAll("[data-news-views]").forEach((node) => { node.textContent = new Intl.NumberFormat("ru-RU").format(currentViews); }); } function getRelatedArticles(currentSlug, count = 4) { const all = getSortedNewsArticles(); const filtered = all.filter((article) => article.slug !== currentSlug); return filtered.slice(0, count); } function initRelatedArticles() { const track = document.getElementById("related-articles-track"); const currentSlug = document.body.dataset.articleSlug; if (!track || !currentSlug) return; const imageFallback = getNewsImageFallbackAttr(); const related = getRelatedArticles(currentSlug, 4); track.innerHTML = related .map((article) => { const href = getNewsHref(article); const imageSrc = getNewsImageSrc(article); return ` `; }) .join(""); } document.addEventListener("DOMContentLoaded", () => { initMobileMenu(); normalizeFooterContacts(); initFooterSocialLinks(); renderHomeNewsTeasers("home-news-grid", 4); renderNewsGrid("news-container", 6); renderNewsGrid("news-index-grid"); initArticleToc(); initArticleViews(); initRelatedArticles(); }); })();