MediaWiki:Common.js: различия между версиями
Pok (обсуждение | вклад) мНет описания правки |
Pok (обсуждение | вклад) Нет описания правки |
||
| Строка 294: | Строка 294: | ||
// Функция для увеличения яркости цвета | // Функция для увеличения яркости цвета | ||
function brightenColor(color, factor) { | function brightenColor(color, factor) { | ||
function | // Функция для преобразования RGB в HSL | ||
function rgbToHsl(r, g, b) { | |||
r /= 255; | |||
g /= 255; | |||
b /= 255; | |||
let max = Math.max(r, g, b); | |||
let min = Math.min(r, g, b); | |||
let h, s, l = (max + min) / 2; | |||
if (max === min) { | |||
h = s = 0; | |||
} else { | |||
let d = max - min; | |||
s = l > 0.5 ? d / (2 - max - min) : d / (max + min); | |||
switch (max) { | |||
case r: h = (g - b) / d + (g < b ? 6 : 0); break; | |||
case g: h = (b - r) / d + 2; break; | |||
case b: h = (r - g) / d + 4; break; | |||
} | |||
h /= 6; | |||
} | |||
return [h * 360, s, l]; | |||
} | |||
// Функция для преобразования HSL в RGB | |||
function hslToRgb(h, s, l) { | |||
let r, g, b; | |||
if (s === 0) { | |||
r = g = b = l; | |||
} else { | |||
function hueToRgb(p, q, t) { | |||
if (t < 0) t += 1; | |||
if (t > 1) t -= 1; | |||
if (t < 1 / 6) return p + (q - p) * 6 * t; | |||
if (t < 1 / 2) return q; | |||
if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6; | |||
return p; | |||
} | |||
let q = l < 0.5 ? l * (1 + s) : l + s - l * s; | |||
let p = 2 * l - q; | |||
r = hueToRgb(p, q, h / 360 + 1 / 3); | |||
g = hueToRgb(p, q, h / 360); | |||
b = hueToRgb(p, q, h / 360 - 1 / 3); | |||
} | |||
return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)]; | |||
} | } | ||
// Извлечение значений RGB и альфа-канала из строки цвета | |||
var rgbValues = color.match(/\d+(\.\d+)?/g); | var rgbValues = color.match(/\d+(\.\d+)?/g); | ||
var r = parseInt(rgbValues[0], 10); | var r = parseInt(rgbValues[0], 10); | ||
| Строка 304: | Строка 353: | ||
var a = rgbValues.length === 4 ? parseFloat(rgbValues[3]) : 1; // Обработка альфа-канала | var a = rgbValues.length === 4 ? parseFloat(rgbValues[3]) : 1; // Обработка альфа-канала | ||
var | // Преобразование RGB в HSL | ||
var [h, s, l] = rgbToHsl(r, g, b); | |||
// Определение коэффициента увеличения яркости, если не задан | |||
if (factor === undefined) { | if (factor === undefined) { | ||
factor = l < 0.5 ? 1.2 : 1.05; // Увеличение яркости в зависимости от исходной яркости | |||
} | } | ||
// Изменение яркости в HSL и преобразование обратно в RGB | |||
l = Math.min(1, l * factor); | |||
var [newR, newG, newB] = hslToRgb(h, s, l); | |||
return a < 1 ? | // Возвращаем новый цвет в формате RGB или RGBA | ||
return a < 1 ? `rgba(${newR}, ${newG}, ${newB}, ${a})` : `rgb(${newR}, ${newG}, ${newB})`; | |||
} | } | ||