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

мНет описания правки
мНет описания правки
Строка 448: Строка 448:
var $toc = $('#toc ul'); // Находим TOC
var $toc = $('#toc ul'); // Находим TOC
$toc.empty();
$toc.empty();
// Ищем заголовки h1 - h6 и элементы с классом .custom-heading
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 = [0]; // Счётчики для уровней заголовков
var tocCounters = [0];
var lastLevel = 1; // Уровень предыдущего заголовка
var lastLevel = 1;
var $currentList = $toc; // Текущий список для вложенности
var $currentList = $toc;


// Функция для обновления счётчиков для текущего уровня
function updateCounters(level) {
function updateCounters(level) {
if (level > lastLevel) {
if (level > lastLevel) {
tocCounters.push(0); // Добавляем новый уровень
tocCounters.push(0);
} else if (level < lastLevel) {
} else if (level < lastLevel) {
tocCounters = tocCounters.slice(0, level); // Убираем лишние уровни
tocCounters = tocCounters.slice(0, level);
}
}
tocCounters[level - 1]++;
tocCounters[level - 1]++;
Строка 465: Строка 463:
}
}


// Функция для получения номера секции в стиле "1", "1.1", "1.1.1"
function getSectionNumber() {
function getSectionNumber() {
return tocCounters.join('.');
return tocCounters.join('.');
}
}


// Функция для создания нового <ul> для вложенного уровня
function createNestedList($parent) {
function createNestedList($parent) {
var $nestedList = $('<ul>');
var $nestedList = $('<ul>');
Строка 477: Строка 473:
}
}


// Перебираем все заголовки и элементы с классом .custom-heading
$headings.each(function() {
$headings.each(function() {
var $heading = $(this);
var $heading = $(this);
var level;
var level;


// Определяем уровень для .custom-heading
if ($heading.hasClass('custom-heading')) {
if ($heading.hasClass('custom-heading')) {
level = 1; // Можно настроить уровень, если нужно
level = 1; // Настройка уровня
var customId = $heading.attr('id') || 'custom-heading-' + getSectionNumber();
var customId = $heading.attr('id') || 'custom-heading-' + getSectionNumber();
$heading.attr('id', customId); // Присваиваем уникальный id
$heading.attr('id', customId);
} else {
} else {
// Проверяем наличие <span class="mw-headline"> внутри заголовка
var $headlineSpan = $heading.find('span.mw-headline');
var $headlineSpan = $heading.find('span.mw-headline');
if ($headlineSpan.length === 0) {
if ($headlineSpan.length === 0) {
return; // Пропускаем заголовок, если нет нужного <span>
console.warn('No mw-headline found in:', $heading); // Отладочная информация
return; // Пропускаем заголовок
}
}
// Определяем уровень заголовка по тегу
var tagName = $heading.prop('tagName').toLowerCase();
var tagName = $heading.prop('tagName').toLowerCase();
level = parseInt(tagName.charAt(1), 10);
level = parseInt(tagName.charAt(1), 10);
// Генерируем новый ID для заголовка
var sectionId = 'heading-' + getSectionNumber();
var sectionId = 'heading-' + getSectionNumber();
$headlineSpan.attr('id', sectionId); // Присваиваем новый уникальный id заголовку
$headlineSpan.attr('id', sectionId);
}
}


updateCounters(level); // Обновляем счётчики для текущего уровня
updateCounters(level);


// Извлекаем текст заголовка
var headingText = $headlineSpan.text().trim() || $heading.text().trim();
var headingText = $headlineSpan.text().trim() || $heading.text().trim();
// Проверяем, что текст заголовка не пустой
if (headingText.length > 0) {
if (headingText.length > 0) {
// Создание вложенных списков, если уровень больше 1
if (level > 1) {
if (level > 1) {
while (tocCounters.length > level) {
while (tocCounters.length > level) {
$currentList = $currentList.parent(); // Переходим к родительскому <ul>
$currentList = $currentList.parent();
}
}
if ($currentList.children('ul').length === 0) {
if ($currentList.children('ul').length === 0) {
$currentList = createNestedList($currentList); // Создаём новый вложенный список
$currentList = createNestedList($currentList);
}
}
} else {
} else {
// Если уровень 1, сбрасываем вложенные списки
$currentList = $toc;
$currentList = $toc;
}
}


// Создаём элемент списка в оглавлении (TOC)
var tocItem = $('<li>').addClass('toclevel-' + (level - 1)).append(
var tocItem = $('<li>').addClass('toclevel-' + (level - 1)).append(
$('<a>').attr('href', '#' + ($headlineSpan.attr('id'))).append(
$('<a>').attr('href', '#' + ($headlineSpan.attr('id'))).append(
Строка 528: Строка 514:
)
)
);
);
// Добавляем элемент в текущий список
$currentList.append(tocItem);
$currentList.append(tocItem);
} else {
console.warn('Heading text is empty:', $heading); // Отладочная информация
}
}
});
});
Строка 644: Строка 631:
var customHeadings = document.querySelectorAll('.custom-heading');
var customHeadings = document.querySelectorAll('.custom-heading');
if (customHeadings.length > 0) {
if (customHeadings.length > 0) {
//addHeadingsWithTOC();
addHeadingsWithTOC();
}
}
if (currentPageTitle.includes("Kerisar")) {
if (currentPageTitle.includes("Kerisar")) {