geforkt von Mirrors/Velocity
Merge branch 'master' into merged
Dieser Commit ist enthalten in:
Commit
1be508ed5e
@ -1,66 +0,0 @@
|
|||||||
package com.velocitypowered.api.util;
|
|
||||||
|
|
||||||
import com.google.common.base.Preconditions;
|
|
||||||
import org.checkerframework.checker.nullness.qual.NonNull;
|
|
||||||
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* LegacyChatColorUtils contains utilities for handling legacy Minecraft color codes. Generally, you should prefer
|
|
||||||
* JSON-based components, but for convenience Velocity provides a limited set of tools to handle Minecraft color codes.
|
|
||||||
*/
|
|
||||||
public class LegacyChatColorUtils {
|
|
||||||
private LegacyChatColorUtils() {
|
|
||||||
throw new AssertionError();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents the legacy Minecraft format character, the section symbol.
|
|
||||||
*/
|
|
||||||
public static final char FORMAT_CHAR = '\u00a7';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Translates a string with Minecraft color codes prefixed with a different character than the section symbol into
|
|
||||||
* a string that uses the section symbol.
|
|
||||||
* @param originalChar the char the color codes are prefixed by
|
|
||||||
* @param text the text to translate
|
|
||||||
* @return the translated text
|
|
||||||
*/
|
|
||||||
public static String translate(char originalChar, @NonNull String text) {
|
|
||||||
Preconditions.checkNotNull(text, "text");
|
|
||||||
char[] textChars = text.toCharArray();
|
|
||||||
int foundSectionIdx = -1;
|
|
||||||
for (int i = 0; i < textChars.length; i++) {
|
|
||||||
char textChar = textChars[i];
|
|
||||||
if (textChar == originalChar) {
|
|
||||||
foundSectionIdx = i;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (foundSectionIdx >= 0) {
|
|
||||||
textChar = Character.toLowerCase(textChar);
|
|
||||||
if ((textChar >= 'a' && textChar <= 'f') || (textChar >= '0' && textChar <= '9') ||
|
|
||||||
(textChar >= 'l' && textChar <= 'o' || textChar == 'r')) {
|
|
||||||
textChars[foundSectionIdx] = FORMAT_CHAR;
|
|
||||||
}
|
|
||||||
foundSectionIdx = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return new String(textChars);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A regex that matches all Minecraft color codes and removes them.
|
|
||||||
*/
|
|
||||||
private static final Pattern CHAT_COLOR_MATCHER = Pattern.compile("(?i)" + Character.toString(FORMAT_CHAR) + "[0-9A-FL-OR]");
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes all Minecraft color codes from the string.
|
|
||||||
* @param text the text to remove color codes from
|
|
||||||
* @return a new String without Minecraft color codes
|
|
||||||
*/
|
|
||||||
public static String removeFormatting(@NonNull String text) {
|
|
||||||
Preconditions.checkNotNull(text, "text");
|
|
||||||
return CHAT_COLOR_MATCHER.matcher(text).replaceAll("");
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,62 +0,0 @@
|
|||||||
package com.velocitypowered.api.util;
|
|
||||||
|
|
||||||
import com.velocitypowered.api.util.LegacyChatColorUtils;
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.*;
|
|
||||||
|
|
||||||
class LegacyChatColorUtilsTest {
|
|
||||||
private static final String NON_FORMATTED = "Velocity";
|
|
||||||
private static final String FORMATTED = "\u00a7cVelocity";
|
|
||||||
private static final String FORMATTED_MULTIPLE = "\u00a7c\u00a7lVelocity";
|
|
||||||
private static final String FORMATTED_MULTIPLE_VARIED = "\u00a7c\u00a7lVelo\u00a7a\u00a7mcity";
|
|
||||||
private static final String INVALID = "\u00a7gVelocity";
|
|
||||||
private static final String RAW_SECTION = "\u00a7";
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void removeFormattingNonFormatted() {
|
|
||||||
assertEquals(NON_FORMATTED, LegacyChatColorUtils.removeFormatting(NON_FORMATTED));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void removeFormattingFormatted() {
|
|
||||||
assertEquals(NON_FORMATTED, LegacyChatColorUtils.removeFormatting(FORMATTED));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void removeFormattingFormattedMultiple() {
|
|
||||||
assertEquals(NON_FORMATTED, LegacyChatColorUtils.removeFormatting(FORMATTED_MULTIPLE));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void removeFormattingFormattedMultipleVaried() {
|
|
||||||
assertEquals(NON_FORMATTED, LegacyChatColorUtils.removeFormatting(FORMATTED_MULTIPLE_VARIED));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void removeFormattingInvalidFormat() {
|
|
||||||
assertEquals(INVALID, LegacyChatColorUtils.removeFormatting(INVALID));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void removeFormattingRawSection() {
|
|
||||||
assertEquals(RAW_SECTION, LegacyChatColorUtils.removeFormatting(RAW_SECTION));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void translate() {
|
|
||||||
assertEquals(FORMATTED, LegacyChatColorUtils.translate('&', "&cVelocity"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void translateMultiple() {
|
|
||||||
assertEquals(FORMATTED_MULTIPLE, LegacyChatColorUtils.translate('&', "&c&lVelocity"));
|
|
||||||
assertEquals(FORMATTED_MULTIPLE_VARIED, LegacyChatColorUtils.translate('&', "&c&lVelo&a&mcity"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void translateDifferentChar() {
|
|
||||||
assertEquals(FORMATTED, LegacyChatColorUtils.translate('$', "$cVelocity"));
|
|
||||||
assertEquals(FORMATTED_MULTIPLE_VARIED, LegacyChatColorUtils.translate('$', "$c$lVelo$a$mcity"));
|
|
||||||
}
|
|
||||||
}
|
|
@ -5,8 +5,6 @@ import com.google.common.collect.ImmutableMap;
|
|||||||
import com.moandjiezana.toml.Toml;
|
import com.moandjiezana.toml.Toml;
|
||||||
import com.velocitypowered.api.util.Favicon;
|
import com.velocitypowered.api.util.Favicon;
|
||||||
import com.velocitypowered.proxy.util.AddressUtil;
|
import com.velocitypowered.proxy.util.AddressUtil;
|
||||||
import com.velocitypowered.api.util.LegacyChatColorUtils;
|
|
||||||
import io.netty.buffer.ByteBufUtil;
|
|
||||||
import net.kyori.text.Component;
|
import net.kyori.text.Component;
|
||||||
import net.kyori.text.serializer.ComponentSerializers;
|
import net.kyori.text.serializer.ComponentSerializers;
|
||||||
|
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren