MediaWiki:Common.js: различия между версиями
Pok (обсуждение | вклад) Отмена правки 51840, сделанной Pok (обсуждение) Метка: отмена |
Pok (обсуждение | вклад) мНет описания правки |
||
| Строка 300: | Строка 300: | ||
// Если цвет в формате rgba, преобразуем его в rgb | // Если цвет в формате rgba, преобразуем его в rgb | ||
if (color. | if (color.indexOf('rgba') === 0) { | ||
var rgbaValues = color.match(/\d+/g).slice(0, 3).map(Number); | |||
color = | var r = rgbaValues[0], g = rgbaValues[1], b = rgbaValues[2]; | ||
color = 'rgb(' + r + ',' + g + ',' + b + ')'; | |||
} else { | |||
// Если цвет в формате rgb | |||
var rgbValues = color.match(/\d+/g).map(Number); | |||
var r = rgbValues[0], g = rgbValues[1], b = rgbValues[2]; | |||
} | } | ||
var brightness = getBrightness(r, g, b); | |||
// Устанавливаем порог для определения тёмного цвета | // Устанавливаем порог для определения тёмного цвета | ||
var darkThreshold = 90; // Более универсальный порог для разделения тёмных и светлых цветов | |||
var brightnessFactor = brightness < darkThreshold ? factor + 0.04 : factor; // Увеличиваем фактор для тёмных цветов | |||
// Увеличиваем яркость | // Увеличиваем яркость | ||
| Строка 318: | Строка 321: | ||
b = Math.min(255, Math.floor(b * brightnessFactor)); | b = Math.min(255, Math.floor(b * brightnessFactor)); | ||
return | return 'rgb(' + r + ', ' + g + ', ' + b + ')'; | ||
} | } | ||
// Функция для подсветки ячеек в таблице при наведении | // Функция для подсветки ячеек в таблице при наведении | ||
function applyHighlighting() { | function applyHighlighting() { | ||
document.querySelectorAll('.wikitable:not(.no-highlight-table)').forEach(table | var tables = document.querySelectorAll('.wikitable:not(.no-highlight-table)'); | ||
Array.prototype.forEach.call(tables, function(table) { | |||
var tbody = table.querySelector('tbody'); | |||
var thead = table.querySelector('thead'); | |||
var rows = Array.prototype.slice.call(tbody.querySelectorAll('tr')).filter(function(row) { | |||
return !row.querySelector('table'); | |||
}); | |||
var topLevelRows = thead ? rows : rows.slice(1); | |||
var hasInvalidRowspan = false; | |||
var hasTooManyRowspan = false; | |||
topLevelRows.forEach(function(row) { | |||
var cells = Array.prototype.slice.call(row.querySelectorAll('td, th')); | |||
var rowspanCount = cells.filter(function(cell) { | |||
return cell.hasAttribute('rowspan') && cell.getAttribute('rowspan') !== '1'; | |||
}).length; | |||
if (rowspanCount > 2) { | if (rowspanCount > 2) { | ||
hasTooManyRowspan = true; | hasTooManyRowspan = true; | ||
| Строка 341: | Строка 350: | ||
} | } | ||
var hasValidRowspanEdge = cells.some(function(cell, index) { | |||
cell.hasAttribute('rowspan') && cell.getAttribute('rowspan') !== '1' && (index === 0 || index === cells.length - 1) | return cell.hasAttribute('rowspan') && cell.getAttribute('rowspan') !== '1' && (index === 0 || index === cells.length - 1); | ||
); | }); | ||
if (!hasValidRowspanEdge && cells.some((cell, index) | if (!hasValidRowspanEdge && cells.some(function(cell, index) { | ||
cell.hasAttribute('rowspan') && cell.getAttribute('rowspan') !== '1' && index > 0 && index < cells.length - 1 | return cell.hasAttribute('rowspan') && cell.getAttribute('rowspan') !== '1' && index > 0 && index < cells.length - 1; | ||
)) { | })) { | ||
hasInvalidRowspan = true; | hasInvalidRowspan = true; | ||
} | } | ||
| Строка 354: | Строка 363: | ||
if (hasTooManyRowspan || hasInvalidRowspan) return; | if (hasTooManyRowspan || hasInvalidRowspan) return; | ||
topLevelRows.forEach(row | topLevelRows.forEach(function(row) { | ||
var cells = Array.prototype.slice.call(row.querySelectorAll('td, th')); | |||
var originalStyles = cells.map(function(cell) { | |||
backgroundColor: getComputedStyle(cell).backgroundColor, | return { | ||
backgroundColor: getComputedStyle(cell).backgroundColor, | |||
} | color: getComputedStyle(cell).color | ||
}; | |||
}); | |||
cells.forEach((cell, index) | cells.forEach(function(cell, index) { | ||
if (cell.hasAttribute('rowspan') && cell.getAttribute('rowspan') !== '1') return; | if (cell.hasAttribute('rowspan') && cell.getAttribute('rowspan') !== '1') return; | ||
cell.addEventListener('mouseover', () | cell.addEventListener('mouseover', function() { | ||
cells.forEach((innerCell, innerIndex) | cells.forEach(function(innerCell, innerIndex) { | ||
if (!innerCell.hasAttribute('rowspan') || innerCell.getAttribute('rowspan') === '1') { | if (!innerCell.hasAttribute('rowspan') || innerCell.getAttribute('rowspan') === '1') { | ||
innerCell.style.backgroundColor = brightenColor(originalStyles[innerIndex].backgroundColor, 1.035); | innerCell.style.backgroundColor = brightenColor(originalStyles[innerIndex].backgroundColor, 1.035); | ||
| Строка 373: | Строка 384: | ||
}); | }); | ||
cell.addEventListener('mouseout', () | cell.addEventListener('mouseout', function() { | ||
cells.forEach((innerCell, innerIndex) | cells.forEach(function(innerCell, innerIndex) { | ||
if (!innerCell.hasAttribute('rowspan') || innerCell.getAttribute('rowspan') === '1') { | if (!innerCell.hasAttribute('rowspan') || innerCell.getAttribute('rowspan') === '1') { | ||
innerCell.style.backgroundColor = originalStyles[innerIndex].backgroundColor; | innerCell.style.backgroundColor = originalStyles[innerIndex].backgroundColor; | ||
| Строка 420: | Строка 431: | ||
} | } | ||
} | } | ||
applyHighlighting | applyHighlighting; | ||
}); | }); | ||
/*WikiEditor/Викификатор*/ | /*WikiEditor/Викификатор*/ | ||