From 787e39d81df5bb71473773404a18c3bb3f2671a0 Mon Sep 17 00:00:00 2001 From: UNV Date: Sun, 30 Mar 2025 00:37:14 +0300 Subject: [PATCH] Support for rgb(...) colors in SVGColorProvider. --- .../impl/codeInsight/SVGColorProvider.java | 56 +++++++++++++++++-- 1 file changed, 51 insertions(+), 5 deletions(-) diff --git a/image-svg-impl/src/main/java/consulo/images/svg/impl/codeInsight/SVGColorProvider.java b/image-svg-impl/src/main/java/consulo/images/svg/impl/codeInsight/SVGColorProvider.java index 298cb10..7edbc6d 100644 --- a/image-svg-impl/src/main/java/consulo/images/svg/impl/codeInsight/SVGColorProvider.java +++ b/image-svg-impl/src/main/java/consulo/images/svg/impl/codeInsight/SVGColorProvider.java @@ -14,16 +14,18 @@ import consulo.ui.util.ColorValueUtil; import consulo.util.collection.HashingStrategy; import consulo.util.collection.Maps; +import consulo.util.lang.StringUtil; import consulo.util.lang.lazy.LazyValue; import consulo.xml.psi.xml.XmlAttribute; import consulo.xml.psi.xml.XmlTokenType; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; -import java.util.HashMap; import java.util.Locale; import java.util.Map; import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * @author UNV @@ -227,12 +229,19 @@ public ColorValue getColorFrom(@Nonnull PsiElement element) { return null; } - private ColorValue parseColor(String textColor) { - ColorValue colorValue = NamedColor.getColorValue(textColor); - if (colorValue != null) { - return colorValue; + private static ColorValue parseColor(String textColor) { + if (textColor.startsWith("#")) { + return parseHexColor(textColor); + } + + if (StringUtil.startsWithIgnoreCase(textColor, "rgb")) { + return parseRGBColor(textColor); } + return NamedColor.getColorValue(textColor); + } + + private static ColorValue parseHexColor(String textColor) { try { return ColorValueUtil.fromHex(textColor); } @@ -241,6 +250,43 @@ private ColorValue parseColor(String textColor) { } } + private static final Pattern RGB_PATTERN = Pattern.compile( + "rgb\\(\\s*(\\d+)(%?)\\s*,\\s*(\\d+)(%?)\\s*,\\s*(\\d+)(%?)\\s*\\)", + Pattern.CASE_INSENSITIVE + ); + + private static ColorValue parseRGBColor(String textColor) { + Matcher matcher = RGB_PATTERN.matcher(textColor); + if (!matcher.matches()) { + return null; + } + + try { + return new RGBColor( + parseRGBComponent(matcher.group(1), matcher.group(2)), + parseRGBComponent(matcher.group(3), matcher.group(4)), + parseRGBComponent(matcher.group(5), matcher.group(6)) + ); + } + catch (NumberFormatException e) { + return null; + } + } + + private static int parseRGBComponent(String value, String percent) { + int v = Integer.parseInt(value); + if (percent.isEmpty()) { + return clamp(v, 0, 255); + } + else { + return (int)(clamp(v, 0, 100) * (255 / 100.0) + 0.5); + } + } + + private static int clamp(int value, int min, int max) { + return Math.min(max, Math.max(value, min)); + } + @Override @RequiredWriteAction public void setColorTo(@Nonnull PsiElement element, @Nonnull ColorValue color) {