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