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

мНет описания правки
мНет описания правки
Строка 445: Строка 445:
// Функции для добавления кастомных заголовков в TOC
// Функции для добавления кастомных заголовков в TOC
function addHeadingsWithTOC() {
function addHeadingsWithTOC() {
mw.hook('wikipage.content').add(function($content) {
    mw.hook('wikipage.content').add(function($content) {
var $toc = $('#toc ul'); // Находим TOC
        var $toc = $('#toc ul'); // Находим TOC
$toc.empty();
        $toc.empty();
var $headings = $content.find('h1, h2, h3, h4, h5, h6, .custom-heading');
        var $headings = $content.find('h1, h2, h3, h4, h5, h6, .custom-heading');
var tocCounters = [];  
        var tocCounters = [];
var $currentList = $toc;  
        var $currentList = $toc; // Текущий список для вставки элементов
var lastLevel = 1; // Уровень последнего заголовка
        var levelStack = []; // Стек для отслеживания уровней заголовков


function updateCounters(level) {
        function updateCounters(level) {
if (level > tocCounters.length) {
            if (level > tocCounters.length) {
tocCounters.push(0);  
                tocCounters.push(0);
} else if (level < tocCounters.length) {
            } else if (level < tocCounters.length) {
tocCounters = tocCounters.slice(0, level);  
                tocCounters = tocCounters.slice(0, level);
}
            }
tocCounters[level - 1]++;
            tocCounters[level - 1]++;
}
        }


function getSectionNumber() {
        function getSectionNumber() {
return tocCounters.join('.');
            return tocCounters.join('.');
}
        }


$headings.each(function() {
        function createNestedList($parent) {
var $heading = $(this);
            var $nestedList = $('<ul>');
var level;
            $parent.append($nestedList);
var $headlineSpan = $heading.find('span.mw-headline');
            return $nestedList;
        }


if ($heading.hasClass('custom-heading')) {
        function closeNestedLists(targetLevel) {
level = 1;
            while (levelStack.length > 0 && levelStack[levelStack.length - 1] >= targetLevel) {
var customId = $heading.attr('id') || 'custom-heading-' + getSectionNumber();
                $currentList = $currentList.parent(); // Закрываем последний уровень
$heading.attr('id', customId);
                levelStack.pop();
} else if ($headlineSpan.length > 0) {
            }
var tagName = $heading.prop('tagName').toLowerCase();
        }
level = parseInt(tagName.charAt(1), 10);
var existingId = $headlineSpan.attr('id');


if (!existingId) {
        $headings.each(function() {
var sectionId = 'heading-' + getSectionNumber();
            var $heading = $(this);
$headlineSpan.attr('id', sectionId);
            var level;
}
            var $headlineSpan = $heading.find('span.mw-headline');
} else {
return;
}


updateCounters(level);  
            if ($heading.hasClass('custom-heading')) {
                level = 1;
                var customId = $heading.attr('id') || 'custom-heading-' + getSectionNumber();
                $heading.attr('id', customId);
            } else if ($headlineSpan.length > 0) {
                var tagName = $heading.prop('tagName').toLowerCase();
                level = parseInt(tagName.charAt(1), 10);
                var existingId = $headlineSpan.attr('id');


var headingText = $headlineSpan.text().trim() || $heading.text().trim();
                if (!existingId) {
                    var sectionId = 'heading-' + getSectionNumber();
                    $headlineSpan.attr('id', sectionId);
                }
            } else {
                return;
            }


if (headingText.length > 0) {
            updateCounters(level);
// Обработка уровня заголовка
if (level > lastLevel) {
// Если уровень увеличивается, создаем новый вложенный список
var $nestedList = $('<ul>').appendTo($currentList);
$currentList = $nestedList; // Переход в новый вложенный список
} else {
// Если уровень уменьшается, возвращаемся к родительскому списку
while (tocCounters.length > level) {
$currentList = $currentList.parent();
}
}


var currentId = $headlineSpan.attr('id') || customId; // Получаем ID для ссылки
            var headingText = $headlineSpan.text().trim() || $heading.text().trim();
var tocItem = $('<li>').addClass('toclevel-' + (level - 1)).append(
$('<a>').attr('href', '#' + currentId).append(
$('<span>').addClass('tocnumber').text(getSectionNumber()),
$('<span>').addClass('toctext').text(headingText)
)
);


// Добавляем элемент в текущий список, только если его уровень больше
            if (headingText.length > 0) {
if (level > lastLevel) {
                // Закрываем вложенные списки, если текущий уровень меньше
$currentList.append(tocItem);
                closeNestedLists(level);
} else if (level === lastLevel) {
$currentList.append(tocItem); // Добавляем в тот же уровень
}


lastLevel = level; // Обновляем уровень последнего заголовка
                // Если уровень больше последнего уровня в стеке, создаем вложенный список
}
                if (levelStack.length === 0 || level > levelStack[levelStack.length - 1]) {
});
                    $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('toctext').text(headingText)
                    )
                );
 
                $currentList.append(tocItem);
            }
        });
    });
}
}
// Функция для логики меню создаваемым модулем CategoryMenu
// Функция для логики меню создаваемым модулем CategoryMenu