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

мНет описания правки
Нет описания правки
Строка 349: Строка 349:
         var noHeader = table.classList.contains('no-header-table');
         var noHeader = table.classList.contains('no-header-table');


         // Проходим по каждому <tbody>
         // Проходим по каждому <tbody> в основной таблице
         Array.prototype.forEach.call(tbodies, function(tbody) {
         Array.prototype.forEach.call(tbodies, function(tbody) {
             // Получаем все строки <tr>, исключая первый <tr> внутри каждого <tbody>
             // Получаем все строки <tr> внутри текущего <tbody>, исключая первый <tr>
             var rows = Array.prototype.slice.call(tbody.querySelectorAll('tr')).filter(function(row, index) {
             var rows = Array.prototype.slice.call(tbody.querySelectorAll('tr')).filter(function(row, index) {
                 // Исключаем строки с вложенными таблицами и первую строку <tr>
                 // Пропускаем первый <tr> и исключаем строки с вложенными таблицами
                 return index > 0 && !row.querySelector('table');
                 return index > 0 || !thead && !noHeader;
             });
             });


             // Пропускаем первую строку, если нет <thead> и нет класса 'no-header'
             // Проходим по каждой строке первого уровня
            var topLevelRows = (!thead && !noHeader) ? rows.slice(1) : rows;
            rows.forEach(function(row) {
                // Проверяем, содержит ли строка вложенную таблицу
                var nestedTables = row.querySelectorAll('table');


            var hasInvalidRowspan = false;
                // Если вложенные таблицы есть, проходим по каждой
            var hasTooManyRowspan = false;
                Array.prototype.forEach.call(nestedTables, function(nestedTable) {
                    var nestedTbodies = nestedTable.querySelectorAll('tbody');


            // Проходим по строкам первого уровня
                    // Пропускаем первый <tr> в каждом <tbody> вложенной таблицы
            topLevelRows.forEach(function(row) {
                    Array.prototype.forEach.call(nestedTbodies, function(nestedTbody) {
                // Получаем все ячейки строки, исключая те, что имеют класс 'mobile'
                        var nestedRows = Array.prototype.slice.call(nestedTbody.querySelectorAll('tr')).filter(function(row, index) {
                var cells = Array.prototype.slice.call(row.querySelectorAll('td, th')).filter(function(cell) {
                            // Пропускаем только первый <tr> в каждом вложенном <tbody>
                    return !cell.classList.contains('mobile');
                            return index > 0;
                        });
 
                        // Применяем логику к строкам вложенных таблиц
                        applyHighlightingToRows(nestedRows);
                    });
                 });
                 });
                var cellCount = cells.length;


                 // Проверяем, есть ли больше двух ячеек с атрибутом rowspan
                 // Применяем логику подсветки к текущему ряду
                 var rowspanCount = cells.filter(function(cell) {
                 applyHighlightingToRows([row]);
                    return cell.hasAttribute('rowspan') && cell.getAttribute('rowspan') !== '1';
            });
                }).length;
        });
    });


                // Если в строке больше двух ячеек с rowspan, функция не применяется
    function applyHighlightingToRows(rows) {
                if (rowspanCount > 2) {
        rows.forEach(function(row) {
                    hasTooManyRowspan = true;
            // Получаем все ячейки строки, исключая те, что имеют класс 'mobile'
                    return;
            var cells = Array.prototype.slice.call(row.querySelectorAll('td, th')).filter(function(cell) {
                }
                return !cell.classList.contains('mobile');
 
            });
                // Если строка имеет 3 или меньше ячеек и больше одного 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 находятся не на краю, устанавливаем флаг ошибки
            var originalStyles = cells.map(function(cell) {
                if (!hasValidRowspanEdge && cells.some(function(cell, index) {
                return {
                     return cell.hasAttribute('rowspan') && cell.getAttribute('rowspan') !== '1' && index > 0 && index < cells.length - 1;
                     backgroundColor: getComputedStyle(cell).backgroundColor,
                 })) {
                    color: getComputedStyle(cell).color
                    hasInvalidRowspan = true;
                 };
                }
             });
             });


             // Если есть некорректные строки с rowspan или слишком много rowspan, выходим
             // Добавляем события 'mouseover' и 'mouseout' для подсветки
            if (hasTooManyRowspan || hasInvalidRowspan) return;
             cells.forEach(function(cell, index) {
 
                 if (cell.hasAttribute('rowspan') && cell.getAttribute('rowspan') !== '1') return;
            // Проходим по каждой строке для добавления событий подсветки
                 cell.addEventListener('mouseover', function() {
             topLevelRows.forEach(function(row) {
                     cells.forEach(function(innerCell, innerIndex) {
                 var cells = Array.prototype.slice.call(row.querySelectorAll('td, th'));
                         if (!innerCell.hasAttribute('rowspan') || innerCell.getAttribute('rowspan') === '1') {
                 var originalStyles = cells.map(function(cell) {
                            innerCell.style.setProperty('background-color', brightenColor(originalStyles[innerIndex].backgroundColor), 'important');
                     // Сохраняем оригинальные стили каждой ячейки
                            innerCell.style.setProperty('color', brightenColor(originalStyles[innerIndex].color), 'important');
                    return {
                        }
                         backgroundColor: getComputedStyle(cell).backgroundColor,
                     });
                        color: getComputedStyle(cell).color
                     };
                 });
                 });


                 // Добавляем события 'mouseover' и 'mouseout' для подсветки
                 cell.addEventListener('mouseout', function() {
                cells.forEach(function(cell, index) {
                    cells.forEach(function(innerCell, innerIndex) {
                    if (cell.hasAttribute('rowspan') && cell.getAttribute('rowspan') !== '1') return;
                        if (!innerCell.hasAttribute('rowspan') || innerCell.getAttribute('rowspan') === '1') {
                    // Добавляем обработчик события при наведении мыши
                            innerCell.style.setProperty('background-color', originalStyles[innerIndex].backgroundColor, 'important');
                    cell.addEventListener('mouseover', function() {
                             innerCell.style.setProperty('color', originalStyles[innerIndex].color, 'important');
                        cells.forEach(function(innerCell, innerIndex) {
                         }
                            if (!innerCell.hasAttribute('rowspan') || innerCell.getAttribute('rowspan') === '1') {
                                // Увеличиваем яркость фона и текста ячейки при наведении
                                innerCell.style.setProperty('background-color', brightenColor(originalStyles[innerIndex].backgroundColor), 'important');
                                innerCell.style.setProperty('color', brightenColor(originalStyles[innerIndex].color), 'important');
                             }
                        });
                    });
                    // Добавляем обработчик события, когда мышь уходит с ячейки
                    cell.addEventListener('mouseout', function() {
                        cells.forEach(function(innerCell, innerIndex) {
                            if (!innerCell.hasAttribute('rowspan') || innerCell.getAttribute('rowspan') === '1') {
                                // Восстанавливаем оригинальные стили после наведения
                                innerCell.style.setProperty('background-color', originalStyles[innerIndex].backgroundColor, 'important');
                                innerCell.style.setProperty('color', originalStyles[innerIndex].color, 'important');
                            }
                         });
                     });
                     });
                 });
                 });
             });
             });
         });
         });
     });
     }
}
}