diff --git a/base/command/pom.xml b/base/command/pom.xml index 55576f5..4579032 100644 --- a/base/command/pom.xml +++ b/base/command/pom.xml @@ -5,7 +5,7 @@ easyplugin-parent cc.carm.lib - 1.4.16 + 1.4.17 ../../pom.xml 4.0.0 diff --git a/base/conf/pom.xml b/base/conf/pom.xml index 215704b..dc83ec9 100644 --- a/base/conf/pom.xml +++ b/base/conf/pom.xml @@ -5,7 +5,7 @@ easyplugin-parent cc.carm.lib - 1.4.16 + 1.4.17 ../../pom.xml 4.0.0 diff --git a/base/database/pom.xml b/base/database/pom.xml index b446353..0e695b4 100644 --- a/base/database/pom.xml +++ b/base/database/pom.xml @@ -5,7 +5,7 @@ easyplugin-parent cc.carm.lib - 1.4.16 + 1.4.17 ../../pom.xml 4.0.0 diff --git a/base/gui/pom.xml b/base/gui/pom.xml index 2885adc..78dd7d0 100644 --- a/base/gui/pom.xml +++ b/base/gui/pom.xml @@ -5,7 +5,7 @@ easyplugin-parent cc.carm.lib - 1.4.16 + 1.4.17 ../../pom.xml 4.0.0 diff --git a/base/listener/pom.xml b/base/listener/pom.xml index 26479b8..3e93e42 100644 --- a/base/listener/pom.xml +++ b/base/listener/pom.xml @@ -5,7 +5,7 @@ easyplugin-parent cc.carm.lib - 1.4.16 + 1.4.17 ../../pom.xml 4.0.0 diff --git a/base/main/pom.xml b/base/main/pom.xml index 66c44a8..a00d683 100644 --- a/base/main/pom.xml +++ b/base/main/pom.xml @@ -5,7 +5,7 @@ easyplugin-parent cc.carm.lib - 1.4.16 + 1.4.17 ../../pom.xml 4.0.0 diff --git a/base/main/src/main/java/cc/carm/lib/easyplugin/utils/ColorParser.java b/base/main/src/main/java/cc/carm/lib/easyplugin/utils/ColorParser.java index 5f6c188..644fcf2 100644 --- a/base/main/src/main/java/cc/carm/lib/easyplugin/utils/ColorParser.java +++ b/base/main/src/main/java/cc/carm/lib/easyplugin/utils/ColorParser.java @@ -4,9 +4,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.awt.*; -import java.util.ArrayList; -import java.util.Arrays; import java.util.List; +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -23,9 +22,11 @@ public class ColorParser { public static final Pattern HEX_PATTERN = Pattern.compile("&\\(&?#([\\da-fA-F]{6})\\)"); public static final Pattern GRADIENT_PATTERN = Pattern.compile("&<&?#([\\da-fA-F]{6})>"); + public static final Pattern COLOR_PATTERN = Pattern.compile("([&§][0-9a-fA-FrRxX])+"); // 会影响颜色的代码 + public static final Pattern FORMAT_PATTERN = Pattern.compile("([&§][0-9a-fA-Fk-oK-OrRxX])+"); // MC可用的格式化代码 public static String parse(String text) { - return parseBaseColor(parseHexColor(parseGradientColor(text))); + return parseBaseColor(parseGradientColor(parseHexColor(text))); } public static String[] parse(String... texts) { @@ -68,7 +69,7 @@ public class ColorParser { * @param text 消息内容 * @return RGB渐变处理后的消息 */ - public static String parseGradientColor(String text) { + public static @NotNull String parseGradientColor(@NotNull String text) { List colors = new ArrayList<>(); Matcher matcher = ColorParser.GRADIENT_PATTERN.matcher(text); @@ -87,14 +88,29 @@ public class ColorParser { return builder.toString(); } - public static String gradientText(@NotNull String text, @Nullable String startHex, @Nullable String endHex) { - if (startHex == null || endHex == null) return gradientText(text, (Color) null, null); - return gradientText(text, Color.decode("0x" + startHex), Color.decode("0x" + endHex)); - } + public static @NotNull String gradientText(@NotNull String text, + @Nullable Color startColor, @Nullable Color endColor) { + Objects.requireNonNull(text, "Text to be gradient should not be null!"); + if (startColor == null || endColor == null || text.isEmpty()) { + // 起始颜色有任一为空,则不进行渐变上色。 + // 若有起始颜色,则代表其跟在某个渐变之后,应当添加"&r"阻断前面的渐变。 + return (startColor != null ? "&r" : "") + text; + } - public static String gradientText(@NotNull String text, @Nullable Color startColor, @Nullable Color endColor) { - if (startColor == null || endColor == null || text.isEmpty()) return text; // 有任一为空,则不进行渐变上色 - if (text.length() == 1) return buildHexColor(colorToHex(startColor)) + text;// 只有一个字符,无需渐变 + // 用于记录消息中特殊格式的位置 + // 在渐变中,允许使用格式字符与颜色字符来改变其中某个字的颜色/格式,以支持更多形式内容。 + LinkedHashMap extraFormats = new LinkedHashMap<>(); + Matcher matcher = ColorParser.FORMAT_PATTERN.matcher(text); + while (matcher.find()) { + extraFormats.put(matcher.start(), matcher.group()); + text = matcher.replaceFirst(""); + matcher.reset(text); + } + + if (text.length() == 1) { + // 当只有一个实际字符时,无需进行渐变计算,直接返回 中间颜色+起始格式(如果有)+消息 即可。 + return colorText(text, extraFormats.get(0), buildHexColor(mediumHex(startColor, endColor))); + } String[] characters = text.split(""); int step = characters.length; // 变换次数 @@ -104,6 +120,7 @@ public class ColorParser { int gDirection = startColor.getGreen() < endColor.getGreen() ? 1 : -1; int bDirection = startColor.getBlue() < endColor.getBlue() ? 1 : -1; + // 决定每种颜色每次变换的度 int rStep = Math.abs(startColor.getRed() - endColor.getRed()) / (step - 1); int gStep = Math.abs(startColor.getGreen() - endColor.getGreen()) / (step - 1); int bStep = Math.abs(startColor.getBlue() - endColor.getBlue()) / (step - 1); @@ -115,10 +132,34 @@ public class ColorParser { )).toArray(String[]::new); return IntStream.range(0, characters.length) - .mapToObj(i -> buildHexColor(hexes[i]) + characters[i]) + .mapToObj(i -> colorText(characters[i], extraFormats.get(i), buildHexColor(hexes[i]))) .collect(Collectors.joining()); } + protected static String gradientText(@NotNull String text, @Nullable String startHex, @Nullable String endHex) { + return gradientText(text, + startHex == null ? null : Color.decode("0x" + startHex), + endHex == null ? null : Color.decode("0x" + endHex) + ); + } + + private static String mediumHex(@NotNull Color start, @NotNull Color end) { + return colorToHex( + Math.abs(start.getRed() - end.getRed()) / 2, + Math.abs(start.getGreen() - end.getGreen()) / 2, + Math.abs(start.getBlue() - end.getBlue()) / 2 + ); + } + + private static String colorText(String message, @Nullable String format, @Nullable String color) { + if (format != null && COLOR_PATTERN.matcher(format).find()) { + // format中存在影响颜色的内容,则当前消息的颜色会被覆盖。 + // 为了减少最终消息的长度,故直接返回键入的FORMAT和对应消息的内容。 + return format + message; + } + return (color == null ? "" : color) + (format == null ? "" : parseBaseColor(format)) + message; + } + protected static String colorToHex(Color color) { return colorToHex(color.getRed(), color.getGreen(), color.getBlue()); } diff --git a/base/main/src/test/java/GradientTest.java b/base/main/src/test/java/GradientTest.java index 862ea8a..3faf2ab 100644 --- a/base/main/src/test/java/GradientTest.java +++ b/base/main/src/test/java/GradientTest.java @@ -1,10 +1,12 @@ import cc.carm.lib.easyplugin.utils.ColorParser; import org.junit.Test; -import java.util.ArrayList; -import java.util.List; +import java.util.LinkedHashMap; import java.util.regex.Matcher; +import static cc.carm.lib.easyplugin.utils.ColorParser.parse; +import static cc.carm.lib.easyplugin.utils.ColorParser.parseGradientColor; + public class GradientTest { @@ -12,27 +14,37 @@ public class GradientTest { public void test() { System.out.println(" "); System.out.println(parseGradientColor("&<#AAAAAA>我真的&<#BBBBBB>爱死&<#111111>你&<#FFFFFF>!")); + + // 测试穿插 + System.out.println(parse("&<#AAAAAA>&l我&r真&b的&<#BBBBBB>&o爱死&<#111111>你&<#FFFFFF>了&r!")); + System.out.println(parse("&<#AAAAAA>&l我&r真&(#666666)的&<#BBBBBB>&o爱死&<#111111>你&<#FFFFFF>了&r!")); + System.out.println(parse("&r正常的颜色理应&c&l不受影响&r。")); + } - - public static String parseGradientColor(String text) { - List colors = new ArrayList<>(); - - Matcher matcher = ColorParser.GRADIENT_PATTERN.matcher(text); - while (matcher.find()) colors.add(matcher.group(1)); - - if (colors.isEmpty()) return text; // 无渐变颜色,直接跳出 - - String[] parts = ColorParser.GRADIENT_PATTERN.split(text); - StringBuilder builder = new StringBuilder(); - for (int i = 0; i < parts.length; i++) { - String startHex = i - 1 >= 0 && colors.size() > i - 1 ? colors.get(i - 1) : null; // 本条消息的起始颜色 - String endHex = colors.size() > i ? colors.get(i) : null; // 本条消息的结束颜色 - System.out.println("[" + startHex + "]" + parts[i] + "[" + endHex + "]"); - builder.append(ColorParser.gradientText(parts[i], startHex, endHex)); + @Test + public void formatReadTest() { + LinkedHashMap formats = new LinkedHashMap<>(); + String text = "&k&l &m&1我&k爱你爱你爱你&o吗?"; + Matcher matcher = ColorParser.FORMAT_PATTERN.matcher(text); + while (matcher.find()) { + String code = matcher.group(); + formats.put(matcher.start(), code); + text = matcher.replaceFirst(""); + matcher.reset(text); } - return builder.toString(); + formats.forEach((index, code) -> System.out.println(index + " -> " + code)); + + String[] parts = text.split(""); + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < parts.length; i++) { + String format = formats.get(i); + if (format != null) builder.append(ColorParser.parseBaseColor(format)); + builder.append(parts[i]); + } + + System.out.println(builder); } } diff --git a/base/storage/pom.xml b/base/storage/pom.xml index 9486fca..e80900a 100644 --- a/base/storage/pom.xml +++ b/base/storage/pom.xml @@ -5,7 +5,7 @@ easyplugin-parent cc.carm.lib - 1.4.16 + 1.4.17 ../../pom.xml 4.0.0 diff --git a/collection/all/pom.xml b/collection/all/pom.xml index 568b31f..06bccb4 100644 --- a/collection/all/pom.xml +++ b/collection/all/pom.xml @@ -5,7 +5,7 @@ easyplugin-parent cc.carm.lib - 1.4.16 + 1.4.17 ../../pom.xml 4.0.0 diff --git a/collection/bom/pom.xml b/collection/bom/pom.xml index fbb84c9..9fa05e1 100644 --- a/collection/bom/pom.xml +++ b/collection/bom/pom.xml @@ -5,7 +5,7 @@ easyplugin-parent cc.carm.lib - 1.4.16 + 1.4.17 ../../pom.xml 4.0.0 diff --git a/collection/common/pom.xml b/collection/common/pom.xml index 458d9fc..b1cd0a0 100644 --- a/collection/common/pom.xml +++ b/collection/common/pom.xml @@ -5,7 +5,7 @@ easyplugin-parent cc.carm.lib - 1.4.16 + 1.4.17 ../../pom.xml 4.0.0 diff --git a/extension/gh-checker/pom.xml b/extension/gh-checker/pom.xml index a1ccd47..e32614e 100644 --- a/extension/gh-checker/pom.xml +++ b/extension/gh-checker/pom.xml @@ -5,7 +5,7 @@ easyplugin-parent cc.carm.lib - 1.4.16 + 1.4.17 ../../pom.xml 4.0.0 diff --git a/extension/papi/pom.xml b/extension/papi/pom.xml index e3fd573..6bc4186 100644 --- a/extension/papi/pom.xml +++ b/extension/papi/pom.xml @@ -5,7 +5,7 @@ easyplugin-parent cc.carm.lib - 1.4.16 + 1.4.17 ../../pom.xml 4.0.0 diff --git a/extension/vault/pom.xml b/extension/vault/pom.xml index af15064..4d44407 100644 --- a/extension/vault/pom.xml +++ b/extension/vault/pom.xml @@ -5,7 +5,7 @@ easyplugin-parent cc.carm.lib - 1.4.16 + 1.4.17 ../../pom.xml 4.0.0 diff --git a/pom.xml b/pom.xml index a546ef6..acd39f1 100644 --- a/pom.xml +++ b/pom.xml @@ -15,7 +15,7 @@ cc.carm.lib easyplugin-parent pom - 1.4.16 + 1.4.17 base/main