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

мНет описания правки
Нет описания правки
Строка 294: Строка 294:
// Функция для увеличения яркости цвета
// Функция для увеличения яркости цвета
function brightenColor(color, factor) {
function brightenColor(color, factor) {
     function getBrightness(r, g, b) {
    // Функция для преобразования RGB в HSL
         return 0.2126 * r + 0.7152 * g + 0.0722 * b;
     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 brightness = getBrightness(r, g, b);
    // Преобразование RGB в HSL
     var [h, s, l] = rgbToHsl(r, g, b);


    // Определение коэффициента увеличения яркости, если не задан
     if (factor === undefined) {
     if (factor === undefined) {
         if (brightness < 35) {
         factor = l < 0.5 ? 1.2 : 1.05;  // Увеличение яркости в зависимости от исходной яркости
            if (r > g && r > b) {
                factor = 1.1;  // Красный доминирует
            } else if (g > r && g > b) {
                factor = 1.15;  // Зеленый доминирует
            } else {
                factor = 1.2;  // Темный цвет с доминированием синего
            }
        } else if (brightness <= 55) {
            factor = 1.085;
        } else if (brightness < 140) {
            if (r > g && r > b) {
                factor = 1.035;  // Фиксированный фактор для красного
            } else {
                factor = 1.045;
            }
        } else if (brightness < 180) {
            factor = 1.02;
        } else {
            factor = 1.0;
        }
     }
     }


     r = Math.min(255, Math.floor(r * factor));
     // Изменение яркости в HSL и преобразование обратно в RGB
     g = Math.min(255, Math.floor(g * factor));
     l = Math.min(1, l * factor);
     b = Math.min(255, Math.floor(b * factor));
     var [newR, newG, newB] = hslToRgb(h, s, l);


     return a < 1 ? 'rgba(' + r + ', ' + g + ', ' + b + ', ' + a + ')' : 'rgb(' + r + ', ' + g + ', ' + b + ')';
    // Возвращаем новый цвет в формате RGB или RGBA
     return a < 1 ? `rgba(${newR}, ${newG}, ${newB}, ${a})` : `rgb(${newR}, ${newG}, ${newB})`;
}
}