MediaWiki:Common.js: различия между версиями

мНет описания правки
мНет описания правки
Строка 569: Строка 569:
     var menuItems = document.querySelectorAll('.menu div');
     var menuItems = document.querySelectorAll('.menu div');
     var currentCategoryIndex = 0; // Индекс текущей активной категории
     var currentCategoryIndex = 0; // Индекс текущей активной категории
    // Функция для генерации ID из текста
    function generateIdFromText(text) {
        return text.trim().toLowerCase().replace(/\s+/g, '-').replace(/[^a-zа-яё0-9\-]/g, '');
    }
    // Присваиваем ID категориям и пунктам меню
    function assignIds() {
        categories.forEach(function(category, index) {
            var categoryText = category.textContent || category.innerText;
            var categoryId = generateIdFromText(categoryText);
            category.setAttribute('id', categoryId);
            var menu = menus[index];
            var menuItems = menu.querySelectorAll('div');
            menuItems.forEach(function(menuItem) {
                var menuItemText = menuItem.textContent || menuItem.innerText;
                var menuItemId = generateIdFromText(menuItemText);
                menuItem.setAttribute('id', menuItemId);
            });
        });
    }
    assignIds(); // Вызываем функцию для присвоения ID


     function clearActiveContent() {
     function clearActiveContent() {
Строка 592: Строка 616:
         clearActiveContent();
         clearActiveContent();


        // Удаляем класс active у всех категорий
         categories.forEach(function(category) {
         categories.forEach(function(category) {
             category.classList.remove('active');
             category.classList.remove('active');
         });
         });


        // Устанавливаем новую активную категорию
         var selectedCategory = categories[index];
         var selectedCategory = categories[index];
         if (selectedCategory) {
         if (selectedCategory) {
             selectedCategory.classList.add('active'); // Добавляем класс active
             selectedCategory.classList.add('active');
             var categoryClass = selectedCategory.classList[0]; // Получаем класс категории
             var categoryClass = selectedCategory.classList[0];
             var selectedMenu = document.querySelector('.' + categoryClass + '-menu');
             var selectedMenu = document.querySelector('.' + categoryClass + '-menu');
             if (selectedMenu) {
             if (selectedMenu) {
                 selectedMenu.classList.add('active'); // Активируем меню соответствующей категории
                 selectedMenu.classList.add('active');
                 var firstParagraph = selectedMenu.querySelector('div');
                 var firstParagraph = selectedMenu.querySelector('div');
                 if (firstParagraph) {
                 if (firstParagraph) {
                     switchContent(firstParagraph); // Открываем первый пункт меню
                     switchContent(firstParagraph);
                 }
                 }
             }
             }
Строка 632: Строка 654:
         const nextArrow = document.getElementById('next-category');
         const nextArrow = document.getElementById('next-category');


        // Если это первая категория, отключаем стрелку назад
         if (currentCategoryIndex === 0) {
         if (currentCategoryIndex === 0) {
             prevArrow.classList.add('disabled');
             prevArrow.classList.add('disabled');
Строка 641: Строка 662:
         }
         }


        // Если это последняя категория, отключаем стрелку вперёд
         if (currentCategoryIndex === categories.length - 1) {
         if (currentCategoryIndex === categories.length - 1) {
             nextArrow.classList.add('disabled');
             nextArrow.classList.add('disabled');
Строка 655: Строка 675:
         if (currentCategoryIndex > 0) {
         if (currentCategoryIndex > 0) {
             currentCategoryIndex = currentCategoryIndex - 1;
             currentCategoryIndex = currentCategoryIndex - 1;
             switchCategory(currentCategoryIndex); // Переключаем на новую категорию
             switchCategory(currentCategoryIndex);
         }
         }
     });
     });
Строка 662: Строка 682:
         if (currentCategoryIndex < categories.length - 1) {
         if (currentCategoryIndex < categories.length - 1) {
             currentCategoryIndex = currentCategoryIndex + 1;
             currentCategoryIndex = currentCategoryIndex + 1;
             switchCategory(currentCategoryIndex); // Переключаем на новую категорию
             switchCategory(currentCategoryIndex);
         }
         }
     });
     });
    // Логика для обработки якоря
    function openCategoryFromAnchor() {
        var hash = window.location.hash.substring(1); // Получаем якорь без #
        if (!hash) return;
        // Попробуем найти пункт меню или категорию с соответствующим ID
        var targetMenuItem = document.getElementById(hash);
        if (targetMenuItem) {
            // Если это пункт меню, нужно сначала открыть его категорию
            var menu = targetMenuItem.closest('.menu');
            var categoryIndex = Array.from(menus).indexOf(menu);
            if (categoryIndex !== -1) {
                switchCategory(categoryIndex);
                switchContent(targetMenuItem);
                targetMenuItem.scrollIntoView(); // Прокручиваем к пункту
            }
        } else {
            // Ищем категорию по ID
            var targetCategory = document.getElementById(hash);
            if (targetCategory) {
                var categoryIndex = Array.from(categories).indexOf(targetCategory);
                if (categoryIndex !== -1) {
                    switchCategory(categoryIndex);
                    targetCategory.scrollIntoView();
                }
            }
        }
    }


     // Инициализация: открываем первую категорию и первый пункт
     // Инициализация: открываем первую категорию и первый пункт
     if (categories.length > 0) {
     if (categories.length > 0) {
         switchCategory(currentCategoryIndex); // Отображаем первую категорию
         switchCategory(currentCategoryIndex);
         updateArrowStates(); // Обновляем состояние стрелок
         updateArrowStates();
     }
     }
    // Обрабатываем якорь при загрузке
    openCategoryFromAnchor();
    // Обрабатываем якорь при изменении URL
    window.addEventListener('hashchange', openCategoryFromAnchor);


     // Удаляем обработчики кликов на категории
     // Удаляем обработчики кликов на категории
     categories.forEach(function(category) {
     categories.forEach(function(category) {
         category.addEventListener('click', function(event) {
         category.addEventListener('click', function(event) {
             event.preventDefault(); // Предотвращаем любое действие при клике
             event.preventDefault();
         });
         });
     });
     });
Строка 688: Строка 743:
     document.querySelector('.menu-toggle').addEventListener('click', function() {
     document.querySelector('.menu-toggle').addEventListener('click', function() {
         var menu = document.querySelector('.menu-container');
         var menu = document.querySelector('.menu-container');
         menu.classList.toggle('active'); // Переключаем класс для показа/скрытия меню
         menu.classList.toggle('active');
         var toggleButton = document.querySelector('.menu-toggle');
         var toggleButton = document.querySelector('.menu-toggle');
         toggleButton.classList.toggle('active'); // Добавляем переключение для перемещения кнопки
         toggleButton.classList.toggle('active');
     });
     });
}
}