Общее предложение для генератора градиентного текста vcnw.ru - 2
29 просмотра
1 декабря 2025 г. в 12:24
Обнаружил другой баг - при количестве сегментов более 1 на полоске с градиентом все цвета съезжаются в одну кучу, а оставшиеся сегменты остаются неинициализированного бирюзового цвета
Вызвано тем, что для каждого сегмента создаётся свой div class в gradientSlider, и у них у всех одинаковые имена. Это можно исправить, например, так: отказываемся от querySelector в пользу querySelectorAll и потом применяем каждый отдельный ("двухточечный", не по всему пространству строки) градиент к каждому отдельному сегменту как раньше

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

Вызвано тем, что для каждого сегмента создаётся свой 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 поправить - сейчас он как будто не очень соответствует действительности - сейчас чего-нибудь накидаю, сюда напишу
1 декабря 2025 г. в 16:13
Проверял "съедобность" minimessage тут:
https://webui.advntr.dev/
Вроде получилось что-то неплохое:

Из-за особенностей формата (а именно: символ не может быть "переходной точкой", переходы только между символами) - идеально точной ередачи не вышло:
Но в целом как будто удовлетворительно. Иначе есть большой риск потерять компактность 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 символов - чтобы было компактнее - типа таких случаев
1 декабря 2025 г. в 16:30
Редактор воспринимает переносы и виндовые \n\r, и линуксовые \n как переносы, а вот просмотр - нет
Я ещё маленько подправил, там с тегами (bold, italic) была проблема ещё
Нет кнопки редактирования комментария, окончательный вариант вот так:
Я ещё маленько подправил, там с тегами (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;
}