MediaWiki:Common.js: различия между версиями
Pok (обсуждение | вклад) мНет описания правки |
Pok (обсуждение | вклад) мНет описания правки |
||
| Строка 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( | |||
$('<a>').attr('href', '#' + ($headlineSpan.attr('id') || customId)).append( | |||
var tocItem = $('<li>').addClass('toclevel-' + (level - | |||
$('<a>').attr('href', '#' + | |||
$('<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); | |||
} | } | ||
}); | }); | ||