From 122912bea59c8ec0e52b2c1b730efe0645f2bb15 Mon Sep 17 00:00:00 2001 From: MattMX Date: Sun, 1 Dec 2024 14:28:02 +0000 Subject: [PATCH 1/3] =?UTF-8?q?=F0=9F=93=93=20Add=20test=20for=20#32?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 1 + logs/latest.log | 0 .../mattmx/nametags/config/TextFormatter.java | 14 +++++------- .../nametags/config/TextFormatterTest.java | 22 +++++++++++++++++++ 4 files changed, 29 insertions(+), 8 deletions(-) create mode 100644 logs/latest.log create mode 100644 src/test/java/com/mattmx/nametags/config/TextFormatterTest.java diff --git a/build.gradle.kts b/build.gradle.kts index 409eade..0479b3d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -35,6 +35,7 @@ dependencies { compileOnly(libs.tab.api) compileOnly(libs.packet.events) implementation(libs.entity.lib) + testImplementation("org.junit.jupiter:junit-jupiter:5.7.1") } tasks { diff --git a/logs/latest.log b/logs/latest.log new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/com/mattmx/nametags/config/TextFormatter.java b/src/main/java/com/mattmx/nametags/config/TextFormatter.java index 8630e2e..c63d40a 100644 --- a/src/main/java/com/mattmx/nametags/config/TextFormatter.java +++ b/src/main/java/com/mattmx/nametags/config/TextFormatter.java @@ -22,21 +22,19 @@ public enum TextFormatter { ) ; - // Converts legacy hex format &x&9&0&0&c&3&f to modern hex format ΄c3f + // Converts legacy hex format &x&9&0&0&c&3&f -> ΄c3f modern hex format // https://github.com/Matt-MX/DisplayNameTags/issues/32#issuecomment-2509403581 - private static String convertLegacyHex(String input) { - //regex to match the legacy hex format - String legacyHexPattern = "&x(&[0-9a-fA-F]){6}"; - Pattern pattern = Pattern.compile(legacyHexPattern); - Matcher matcher = pattern.matcher(input); + private static final Pattern LEGACY_HEX_PATTERN = Pattern.compile("&x(&[0-9a-fA-F]){6}"); + public static String convertLegacyHex(String input) { + Matcher matcher = LEGACY_HEX_PATTERN.matcher(input); StringBuilder result = new StringBuilder(); while (matcher.find()) { String legacyHex = matcher.group(); - //extract hex digits from the legacy format + // Extract hex digits from the legacy format String hexColor = legacyHex.replace("&x", "") .replace("&", ""); - //replace with modern format + // Replace with modern format String modernHex = "&#" + hexColor; matcher.appendReplacement(result, modernHex); } diff --git a/src/test/java/com/mattmx/nametags/config/TextFormatterTest.java b/src/test/java/com/mattmx/nametags/config/TextFormatterTest.java new file mode 100644 index 0000000..20fbf17 --- /dev/null +++ b/src/test/java/com/mattmx/nametags/config/TextFormatterTest.java @@ -0,0 +1,22 @@ +package com.mattmx.nametags.config; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +public class TextFormatterTest { + + @ParameterizedTest + @CsvSource({ + "&x&c&7&0&0&3&9[Admin],&#c70039[Admin]", + "&x&9&0&0&c&3&fCoyotea&r,΄c3fCoyotea&r", + "&x&9&0&0&c&3&fCoyotea,΄c3fCoyotea", + "&x&c&7&0&0&3&9[Admin] &x&9&0&0&c&3&fCoyotea&r,&#c70039[Admin] ΄c3fCoyotea&r" + }) + public void test_convertLegacyHex(String input, String expectedOut) { + final String out = TextFormatter.convertLegacyHex(input); + + Assertions.assertEquals(expectedOut, out); + } + +} \ No newline at end of file From 85bfaa8ed9cf85fcd2ea80cdf3cd357924860a1a Mon Sep 17 00:00:00 2001 From: MattMX Date: Sun, 1 Dec 2024 15:40:41 +0000 Subject: [PATCH 2/3] :bug: Fix #32 and introduce `smart` formatter --- gradle/libs.versions.toml | 2 +- .../java/com/mattmx/nametags/NameTags.java | 1 + .../config/TextDisplayMetaConfiguration.java | 1 + .../mattmx/nametags/config/TextFormatter.java | 69 ++++++++++++++++++- src/main/resources/config.yml | 1 + 5 files changed, 72 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0795a61..7686012 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,7 +4,7 @@ paperweight = "1.7.1" kotlin = "2.0.0" updateVersions = "0.51.0" shadow = "8.1.8" -paperApi = "1.20.4-R0.1-SNAPSHOT" +paperApi = "1.21.1-R0.1-SNAPSHOT" placeholderapi = "2.11.6" ktgui = "2.4.2-alpha" runPaper = "2.2.4" diff --git a/src/main/java/com/mattmx/nametags/NameTags.java b/src/main/java/com/mattmx/nametags/NameTags.java index 5f6b5e7..38c3577 100644 --- a/src/main/java/com/mattmx/nametags/NameTags.java +++ b/src/main/java/com/mattmx/nametags/NameTags.java @@ -22,6 +22,7 @@ public class NameTags extends JavaPlugin { public static final int TRANSPARENT = Color.fromARGB(0).asARGB(); + public static final char LEGACY_CHAR = (char)167; private static @Nullable NameTags instance; private final HashMap groups = new HashMap<>(); diff --git a/src/main/java/com/mattmx/nametags/config/TextDisplayMetaConfiguration.java b/src/main/java/com/mattmx/nametags/config/TextDisplayMetaConfiguration.java index ef636d6..fcb8fde 100644 --- a/src/main/java/com/mattmx/nametags/config/TextDisplayMetaConfiguration.java +++ b/src/main/java/com/mattmx/nametags/config/TextDisplayMetaConfiguration.java @@ -186,6 +186,7 @@ private static Component convertToComponent(Player self, Player sending, String String formatted = line; formatted = PapiHook.setPlaceholders(self, sending, formatted); + System.out.println(formatted); return NameTags.getInstance() .getFormatter() diff --git a/src/main/java/com/mattmx/nametags/config/TextFormatter.java b/src/main/java/com/mattmx/nametags/config/TextFormatter.java index c63d40a..3ea4902 100644 --- a/src/main/java/com/mattmx/nametags/config/TextFormatter.java +++ b/src/main/java/com/mattmx/nametags/config/TextFormatter.java @@ -1,5 +1,6 @@ package com.mattmx.nametags.config; +import com.mattmx.nametags.NameTags; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; @@ -18,7 +19,42 @@ public enum TextFormatter { ), LEGACY( "legacy", - (line) -> getLegacySerializer().deserialize(convertLegacyHex(line)) + (line) -> getLegacySerializer().deserialize(convertLegacyHex(line.replace(NameTags.LEGACY_CHAR, '&'))) + ), + SMART( + "smart", + (line) -> { + // First replace any legacy chars with & + String mutableLine = convertLegacyHex(line.replace(NameTags.LEGACY_CHAR, '&')); + + // Convert legacy to modern formatting + mutableLine = convertLegacyHexToMiniMessage(mutableLine); + mutableLine = mutableLine + .replace("&0", "") + .replace("&1", "") + .replace("&2", "") + .replace("&3", "") + .replace("&4", "") + .replace("&5", "") + .replace("&6", "") + .replace("&7", "") + .replace("&8", "") + .replace("&9", "") + .replace("&a", "") + .replace("&b", "") + .replace("&c", "") + .replace("&d", "") + .replace("&e", "") + .replace("&f", "") + .replace("&k", "") + .replace("&l", "") + .replace("&m", "") + .replace("&n", "") + .replace("&o", "") + .replace("&r", ""); + + return MINI_MESSAGE.format(mutableLine); + } ) ; @@ -43,6 +79,37 @@ public static String convertLegacyHex(String input) { return result.toString(); } + /** + * Converts Minecraft legacy hex color codes (&#RRGGBB) to MiniMessage format (<#RRGGBB>). + * + * @param legacyText The input string with legacy color codes. + * @return The converted string in MiniMessage format. + */ + public static String convertLegacyHexToMiniMessage(@NotNull String legacyText) { + if (legacyText.isEmpty()) { + return legacyText; + } + + // Regex to match legacy hex color codes (&# followed by 6 hexadecimal characters) + Pattern legacyHexPattern = Pattern.compile("&#([0-9a-fA-F]{6})"); + Matcher matcher = legacyHexPattern.matcher(legacyText); + + StringBuilder convertedText = new StringBuilder(); + + while (matcher.find()) { + // Extract the hex color code (RRGGBB) + String hexColor = matcher.group(1); + + // Replace with MiniMessage format + matcher.appendReplacement(convertedText, "<#" + hexColor + ">"); + } + + // Append the rest of the text + matcher.appendTail(convertedText); + + return convertedText.toString(); + } + private static final LegacyComponentSerializer legacy = LegacyComponentSerializer.builder() .character('&') .hexCharacter('#') diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index c3bdcb6..9a288ae 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -59,6 +59,7 @@ groups: # Options: # - minimessage # - legacy +# - smart (Attempts to format legacy -> minimessage) formatter: minimessage # Extra features From 4607de8adcd55152515b47c98bf044cdd977355e Mon Sep 17 00:00:00 2001 From: MattMX Date: Sun, 1 Dec 2024 15:42:59 +0000 Subject: [PATCH 3/3] =?UTF-8?q?=E2=9C=85=20Tested=20`smart`=20mode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/mattmx/nametags/config/ConfigHelper.java | 1 - .../com/mattmx/nametags/config/TextDisplayMetaConfiguration.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main/java/com/mattmx/nametags/config/ConfigHelper.java b/src/main/java/com/mattmx/nametags/config/ConfigHelper.java index 8f11cdd..2af09fd 100644 --- a/src/main/java/com/mattmx/nametags/config/ConfigHelper.java +++ b/src/main/java/com/mattmx/nametags/config/ConfigHelper.java @@ -1,6 +1,5 @@ package com.mattmx.nametags.config; -import me.tofaa.entitylib.meta.display.AbstractDisplayMeta; import org.bukkit.configuration.ConfigurationSection; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/com/mattmx/nametags/config/TextDisplayMetaConfiguration.java b/src/main/java/com/mattmx/nametags/config/TextDisplayMetaConfiguration.java index fcb8fde..ef636d6 100644 --- a/src/main/java/com/mattmx/nametags/config/TextDisplayMetaConfiguration.java +++ b/src/main/java/com/mattmx/nametags/config/TextDisplayMetaConfiguration.java @@ -186,7 +186,6 @@ private static Component convertToComponent(Player self, Player sending, String String formatted = line; formatted = PapiHook.setPlaceholders(self, sending, formatted); - System.out.println(formatted); return NameTags.getInstance() .getFormatter()