Общее предложение для генератора градиентного текста vcnw.ru - 2

29 просмотра

Elivian
Elivian
Игрок

  • Обсуждения: 5
  • Посты: 8
  • Лайки: 1
1 декабря 2025 г. в 12:24
Обнаружил другой баг - при количестве сегментов более 1 на полоске с градиентом все цвета съезжаются в одну кучу, а оставшиеся сегменты остаются неинициализированного бирюзового цвета
Вызвано тем, что для каждого сегмента создаётся свой div class в gradientSlider, и у них у всех одинаковые имена. Это можно исправить, например, так: отказываемся от querySelector в пользу querySelectorAll и потом применяем каждый отдельный ("двухточечный", не по всему пространству строки) градиент к каждому отдельному сегменту как раньше
function updateSliderGradient() {
if (!slider) return;

const connects = document.querySelectorAll('#gradientSlider .noUi-connect');
if(!connects)
return;

for(let i = 0; i < connects.length; i++)
{
segmentColors = [colors[i], colors[i+1]]
const gradientStops = segmentColors.map((color, index) => {
const position = (index) * 100;
return `${color} ${position}%`;
}).join(', ');

const gradient = `linear-gradient(to right, ${gradientStops})`;

connects[i].style.background = gradient;
}
}
Результат:

Всё ещё не идеально - наверно, в идеале по краям при отодвигании слайдера должны оставаться монохромные цветовые полоски, но в структуре класса подразумевается, что каждый цветовой сегмент ограничен двумя слайдерами

P.S. На JS никогда не писал, хотя и очень он похож на c++ - поэтому могу использовать методы несколько неадекватные задаче:
Наверно, если сделать единый объект заднего фона на котором перемещаются слайдеры с прозрачной заливкой, чтобы было видно задний фон, и менять его цвет исходя из текущего положения, то будет выглядеть как надо. Но точно должно быть более логичное решение

Надо будет ещё вывод в minimessage поправить - сейчас он как будто не очень соответствует действительности - сейчас чего-нибудь накидаю, сюда напишу
Elivian
Elivian
Игрок

  • Обсуждения: 5
  • Посты: 8
  • Лайки: 1
1 декабря 2025 г. в 16:13
Проверял "съедобность" minimessage тут:
https://webui.advntr.dev/

Вроде получилось что-то неплохое:


Из-за особенностей формата (а именно: символ не может быть "переходной точкой", переходы только между символами) - идеально точной ередачи не вышло:
Но в целом как будто удовлетворительно. Иначе есть большой риск потерять компактность minimessage

Функция формирования была приведена к такому виду:
        function generateMiniMessageFormat(text, prefix, formatting) {            let result = prefix ? prefix : '';            ///воспроизведём выбор градиента из getGradientColor (плохо!)            if (!slider || colors.length === 1)                result += `<#${colors[0].substring(1)}>${text}`;            else            {                let flagRightLimitReached = false;//проверка того, был ли сдвинут правый ползунок от края. Если да - не надо писать </gradient> в конце, потому что там уже будет не градиент, а монохромный текст                let flagGradientUsed = false;//есть ли градиент, который можно закрывать <\gradient>                let flagSkipAllRemains = false;//Если несколько конечних ползунков сдвинуты в точку                const characters = Array.from(text);                let current_segment=-1;                const values = slider.get().map(parseFloat);                if(values[0] != 0)                    result += `<#${colors[0].substring(1)}>`                for(let i=0; i < characters.length; ++i)                {                    const position = characters.length > 1 ? i / (characters.length - 1) : 0;                    if(current_segment < values.length-2 && !flagSkipAllRemains)                    {                        if(position >= values[current_segment+1])                        {                            while(position >= values[current_segment+1])//чтобы не возникали "склейки", когда ползунки сдвинуты в точку и в блоке <gradient>...</gradient> не оказывается ни одного символа                            {                                current_segment++;                                if(current_segment >= values.length-1)                                {                                    flagSkipAllRemains = true;                                    break;                                }                            }                            if(!flagSkipAllRemains)                            {                                current_segment--;                                if(flagGradientUsed)                                    result += `</gradient>`;                                colorStops=`${colors[current_segment+1]}:${colors[current_segment+2]}`                                result+=`<gradient:${colorStops}>`                                flagGradientUsed = true;                                current_segment++;                            }                        }                    }                    else if( (position > values[values.length-1]) && !flagRightLimitReached)                    {                        flagRightLimitReached = true;                        if(flagGradientUsed)                            result += `</gradient>`;                        result += `<${colors[colors.length-1]}>`;                    }                    result+=characters[i];                }                if(!flagRightLimitReached)                    result += `</gradient>`;            }            ///----конец логически копированного кода-----            const formatTags = [];            if (formatting.bold) formatTags.push('bold');            if (formatting.italic) formatTags.push('italic');            if (formatting.underlined) formatTags.push('underlined');            if (formatting.strikethrough) formatTags.push('strikethrough');            if (formatting.obfuscated) formatTags.push('obfuscated');            if (formatTags.length > 0) {                result = `<${formatTags.join(',')}>${result}</${formatTags.join(',')}>`;            }            return result;        }
В ней довольно много странного кода, который отвечает за не-добавление лишних <gradient></gradient> на 0 символов - чтобы было компактнее - типа таких случаев
Elivian
Elivian
Игрок

  • Обсуждения: 5
  • Посты: 8
  • Лайки: 1
1 декабря 2025 г. в 16:30
Редактор воспринимает переносы и виндовые \n\r, и линуксовые \n как переносы, а вот просмотр - нет
Я ещё маленько подправил, там с тегами (bold, italic) была проблема ещё
Нет кнопки редактирования комментария, окончательный вариант вот так:
        function generateMiniMessageFormat(text, prefix, formatting) {
let result = prefix ? prefix : '';

///воспроизведём выбор градиента из getGradientColor (плохо!)
if (!slider || colors.length === 1)
result += `<#${colors[0].substring(1)}>${text}`;
else
{
let flagRightLimitReached = false;//проверка того, был ли сдвинут правый ползунок от края. Если да - не надо писать </gradient> в конце, потому что там уже будет не градиент, а монохромный текст
let flagGradientUsed = false;//есть ли градиент, который можно закрывать <\gradient>
let flagSkipAllRemains = false;//Если несколько конечних ползунков сдвинуты в точку
const characters = Array.from(text);

let current_segment=-1;

const values = slider.get().map(parseFloat);

if(values[0] != 0)
result += `<#${colors[0].substring(1)}>`

for(let i=0; i < characters.length; ++i)
{
const position = characters.length > 1 ? i / (characters.length - 1) : 0;

if(current_segment < values.length-2 && !flagSkipAllRemains)
{
if(position >= values[current_segment+1])
{
while(position >= values[current_segment+1])//чтобы не возникали "склейки", когда ползунки сдвинуты в точку и в блоке <gradient>...</gradient> не оказывается ни одного символа
{
current_segment++;
if(current_segment >= values.length-1)
{
flagSkipAllRemains = true;
break;
}
}
if(!flagSkipAllRemains)
{
current_segment--;

if(flagGradientUsed)
result += `</gradient>`;

colorStops=`${colors[current_segment+1]}:${colors[current_segment+2]}`
result+=`<gradient:${colorStops}>`

flagGradientUsed = true;
current_segment++;
}
}
}
else if( (position > values[values.length-1]) && !flagRightLimitReached)
{
flagRightLimitReached = true;

if(flagGradientUsed)
result += `</gradient>`;
result += `<${colors[colors.length-1]}>`;
}
result+=characters[i];

}
if(!flagRightLimitReached)
result += `</gradient>`;
}

///----конец логически копированного кода-----

const formatTags = [];
if (formatting.bold) formatTags.push('bold');
if (formatting.italic) formatTags.push('italic');
if (formatting.underlined) formatTags.push('underlined');
if (formatting.strikethrough) formatTags.push('strikethrough');
if (formatting.obfuscated) formatTags.push('obfuscated');

if (formatTags.length > 0) {
result = `<${formatTags.join("><")}>${result}</${formatTags.reverse().join("></")}>`;
}

return result;
}