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

мНет описания правки
мНет описания правки
Строка 339: Строка 339:
// Функция для подсветки ячеек в таблице при наведении
// Функция для подсветки ячеек в таблице при наведении
function applyHighlighting() {
function applyHighlighting() {
    // Игнорируем обработку для мобильных устройств
     if (/Mobi|Android/i.test(navigator.userAgent)) {
     if (/Mobi|Android/i.test(navigator.userAgent)) {
         return;
         return;
     }
     }


    // Находим все таблицы с классом .wikitable, кроме тех, у которых есть класс .no-highlight-table
     var tables = document.querySelectorAll('.wikitable:not(.no-highlight-table)');
     var tables = document.querySelectorAll('.wikitable:not(.no-highlight-table)');


Строка 353: Строка 351:


         if (tbody) {
         if (tbody) {
            // Получаем все строки <tr> внутри <tbody>, игнорируя вложенные таблицы
             var rows = Array.prototype.slice.call(tbody.querySelectorAll('tr')).filter(function(row) {
             var rows = Array.prototype.slice.call(tbody.querySelectorAll('tr')).filter(function(row) {
                 return !row.querySelector('table');
                 return !row.querySelector('table');
             });
             });


            // Если нет <thead> и таблица не содержит класса .no-header, пропускаем первую строку
             var topLevelRows = (!thead && !noHeader) ? rows.slice(1) : rows;
             var topLevelRows = (!thead && !noHeader) ? rows.slice(1) : rows;


             var hasInvalidRowspan = false; // Проверка наличия некорректного rowspan
             var originalStyles = {};
            var hasTooManyRowspan = false;  // Проверка наличия слишком большого количества rowspan


             // Проверяем на наличие некорректных rowspan в таблице
             // Обрабатываем каждую строку таблицы
             topLevelRows.forEach(function(row) {
             topLevelRows.forEach(function(row, rowIndex) {
                 var cells = Array.prototype.slice.call(row.querySelectorAll('td, th')).filter(function(cell) {
                 var cells = Array.prototype.slice.call(row.querySelectorAll('td, th'));
                    return !cell.classList.contains('mobile');  // Игнорируем ячейки с классом .mobile
                });
                var cellCount = cells.length;
                var rowspanCount = cells.filter(function(cell) {
                    return cell.hasAttribute('rowspan') && cell.getAttribute('rowspan') !== '1';
                }).length;


                 // Слишком много rowspan в одной строке
                 cells.forEach(function(cell, index) {
                if (rowspanCount > 2) {
                     var rowspan = parseInt(cell.getAttribute('rowspan'), 10) || 1;
                    hasTooManyRowspan = true;
                    return;
                }
 
                // Слишком много rowspan в строке с небольшим количеством ячеек
                if (cellCount <= 3 && rowspanCount > 1) {
                    hasTooManyRowspan = true;
                    return;
                }
 
                // Проверка на наличие rowspan на краях строки
                var hasValidRowspanEdge = cells.some(function(cell, index) {
                     return cell.hasAttribute('rowspan') && cell.getAttribute('rowspan') !== '1' && (index === 0 || index === cells.length - 1);
                });
 
                // Некорректное использование rowspan в середине строки
                if (!hasValidRowspanEdge && cells.some(function(cell, index) {
                    return cell.hasAttribute('rowspan') && cell.getAttribute('rowspan') !== '1' && index > 0 && index < cells.length - 1;
                })) {
                    hasInvalidRowspan = true;
                }
            });
 
            // Прерываем выполнение, если найдены некорректные rowspan
            if (hasTooManyRowspan || hasInvalidRowspan) return;


            // Обрабатываем каждую строку таблицы
                    // Сохраняем исходные стили каждой ячейки
            topLevelRows.forEach(function(row) {
                    if (!originalStyles[rowIndex]) originalStyles[rowIndex] = [];
                var cells = Array.prototype.slice.call(row.querySelectorAll('td, th'));
                    originalStyles[rowIndex][index] = {
                var originalStyles = cells.map(function(cell) {
                    return {
                         backgroundColor: getComputedStyle(cell).backgroundColor,
                         backgroundColor: getComputedStyle(cell).backgroundColor,
                         color: getComputedStyle(cell).color
                         color: getComputedStyle(cell).color
                     };
                     };
                });
                // Добавляем обработчики для каждой ячейки
                cells.forEach(function(cell, index) {
                    var rowspan = parseInt(cell.getAttribute('rowspan'), 10) || 1;


                     // Обработчик при наведении на ячейку
                     // Обработчик при наведении на ячейку
Строка 421: Строка 378:
                         if (rowspan > 1) {
                         if (rowspan > 1) {
                             for (var i = 0; i < rowspan; i++) {
                             for (var i = 0; i < rowspan; i++) {
                                 var targetRow = topLevelRows[topLevelRows.indexOf(row) + i];
                                 var targetRow = topLevelRows[rowIndex + i];
                                 if (targetRow) {
                                 if (targetRow) {
                                     var targetCells = targetRow.querySelectorAll('td, th');
                                     var targetCells = targetRow.querySelectorAll('td, th');
                                     Array.prototype.forEach.call(targetCells, function(innerCell) {
                                     Array.prototype.forEach.call(targetCells, function(innerCell, innerIndex) {
                                         innerCell.style.backgroundColor = brightenColor(getComputedStyle(innerCell).backgroundColor);
                                         innerCell.style.backgroundColor = brightenColor(getComputedStyle(innerCell).backgroundColor);
                                         innerCell.style.color = brightenColor(getComputedStyle(innerCell).color);
                                         innerCell.style.color = brightenColor(getComputedStyle(innerCell).color);
Строка 434: Строка 391:
                         // Подсвечиваем ячейки в текущем ряду
                         // Подсвечиваем ячейки в текущем ряду
                         cells.forEach(function(innerCell, innerIndex) {
                         cells.forEach(function(innerCell, innerIndex) {
                             innerCell.style.backgroundColor = brightenColor(originalStyles[innerIndex].backgroundColor);
                             innerCell.style.backgroundColor = brightenColor(originalStyles[rowIndex][innerIndex].backgroundColor);
                             innerCell.style.color = brightenColor(originalStyles[innerIndex].color);
                             innerCell.style.color = brightenColor(originalStyles[rowIndex][innerIndex].color);
                         });
                         });
                     });
                     });
Строка 444: Строка 401:
                         if (rowspan > 1) {
                         if (rowspan > 1) {
                             for (var i = 0; i < rowspan; i++) {
                             for (var i = 0; i < rowspan; i++) {
                                 var targetRow = topLevelRows[topLevelRows.indexOf(row) + i];
                                 var targetRow = topLevelRows[rowIndex + i];
                                 if (targetRow) {
                                 if (targetRow) {
                                     var targetCells = targetRow.querySelectorAll('td, th');
                                     var targetCells = targetRow.querySelectorAll('td, th');
                                     Array.prototype.forEach.call(targetCells, function(innerCell) {
                                     Array.prototype.forEach.call(targetCells, function(innerCell, innerIndex) {
                                         innerCell.style.backgroundColor = getComputedStyle(innerCell).backgroundColor;
                                         innerCell.style.backgroundColor = originalStyles[rowIndex + i][innerIndex].backgroundColor;
                                         innerCell.style.color = getComputedStyle(innerCell).color;
                                         innerCell.style.color = originalStyles[rowIndex + i][innerIndex].color;
                                     });
                                     });
                                 }
                                 }
Строка 457: Строка 414:
                         // Восстанавливаем стили в текущем ряду
                         // Восстанавливаем стили в текущем ряду
                         cells.forEach(function(innerCell, innerIndex) {
                         cells.forEach(function(innerCell, innerIndex) {
                             innerCell.style.backgroundColor = originalStyles[innerIndex].backgroundColor;
                             innerCell.style.backgroundColor = originalStyles[rowIndex][innerIndex].backgroundColor;
                             innerCell.style.color = originalStyles[innerIndex].color;
                             innerCell.style.color = originalStyles[rowIndex][innerIndex].color;
                         });
                         });
                     });
                     });