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

мНет описания правки
мНет описания правки
Строка 452: Строка 452:
         var $currentList = $toc; // Текущий список для вставки элементов
         var $currentList = $toc; // Текущий список для вставки элементов
         var levelStack = []; // Стек для отслеживания уровней заголовков
         var levelStack = []; // Стек для отслеживания уровней заголовков
        var maxLevel = 0; // Для хранения максимального уровня заголовков
        // Первый проход для нахождения максимального уровня заголовков
        $headings.each(function() {
            var $heading = $(this);
            var level;
            if ($heading.hasClass('custom-heading')) {
                level = 1; // Для кастомных заголовков
            } else {
                var tagName = $heading.prop('tagName').toLowerCase();
                level = parseInt(tagName.charAt(1), 10); // Определяем уровень h1-h6
            }
            if (level > maxLevel) {
                maxLevel = level; // Обновляем максимальный уровень
            }
        });


         function updateCounters(level) {
         function updateCounters(level) {
Строка 474: Строка 490:
         function closeNestedLists(targetLevel) {
         function closeNestedLists(targetLevel) {
             while (levelStack.length > 0 && levelStack[levelStack.length - 1] >= targetLevel) {
             while (levelStack.length > 0 && levelStack[levelStack.length - 1] >= targetLevel) {
                 $currentList = $currentList.parent(); // Закрываем последний уровень
                 $currentList = $currentList.parent().closest('ul');
                 levelStack.pop();
                 levelStack.pop();
             }
             }
Строка 498: Строка 514:
                 }
                 }
             } else {
             } else {
                 return;
                 return; // Пропускаем элементы без заголовков
             }
             }


Строка 509: Строка 525:
                 closeNestedLists(level);
                 closeNestedLists(level);


                // Если уровень больше последнего уровня в стеке, создаем вложенный список
                 var tocItem = $('<li>').addClass('toclevel-' + (level - maxLevel)).append(
                if (levelStack.length === 0 || level > levelStack[levelStack.length - 1]) {
                     $('<a>').attr('href', '#' + ($headlineSpan.attr('id') || customId)).append(
                    $currentList = createNestedList($currentList);
                    levelStack.push(level);
                }
 
                // Создаем элемент TOC
                var currentId = $headlineSpan.attr('id') || customId;
                 var tocItem = $('<li>').addClass('toclevel-' + (level - 1)).append(
                     $('<a>').attr('href', '#' + currentId).append(
                         $('<span>').addClass('tocnumber').text(getSectionNumber()),
                         $('<span>').addClass('tocnumber').text(getSectionNumber()),
                         $('<span>').addClass('toctext').text(headingText)
                         $('<span>').addClass('toctext').text(headingText)
Строка 524: Строка 532:
                 );
                 );


                 $currentList.append(tocItem);
                 // Если текущий уровень равен максимальному (высший уровень), добавляем его в основной список
                if (level === maxLevel) {
                    $toc.append(tocItem); // Главный список
                    $currentList = $toc; // Сбрасываем на основной список
                } else {
                    // Если уровень ниже максимального, создаем вложенный список
                    if (level > levelStack[levelStack.length - 1]) {
                        var $nestedList = createNestedList($currentList);
                        $currentList = $nestedList;
                    }
                    $currentList.append(tocItem);
                }
 
                // Добавляем уровень в стек для дальнейшего отслеживания
                levelStack.push(level);
             }
             }
         });
         });