PaperPR - Add hex color code support for console logging

This commit is contained in:
William Blake Galbreath
2020-09-20 12:25:47 -05:00
parent 081f5a7b9e
commit 0743d383bd

View File

@@ -0,0 +1,64 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <Blake.Galbreath@GMail.com>
Date: Sun, 20 Sep 2020 12:25:18 -0500
Subject: [PATCH] PaperPR - Add hex color code support for console logging
diff --git a/src/main/java/com/destroystokyo/paper/console/TerminalConsoleCommandSender.java b/src/main/java/com/destroystokyo/paper/console/TerminalConsoleCommandSender.java
index 685deaa0e..73c2bdd58 100644
--- a/src/main/java/com/destroystokyo/paper/console/TerminalConsoleCommandSender.java
+++ b/src/main/java/com/destroystokyo/paper/console/TerminalConsoleCommandSender.java
@@ -1,17 +1,52 @@
package com.destroystokyo.paper.console;
+import java.awt.Color;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import net.minecrell.terminalconsole.MinecraftFormattingConverter;
+import net.minecrell.terminalconsole.TerminalConsoleAppender;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.util.PropertiesUtil;
+import org.bukkit.ChatColor;
import org.bukkit.craftbukkit.command.CraftConsoleCommandSender;
public class TerminalConsoleCommandSender extends CraftConsoleCommandSender {
private static final Logger LOGGER = LogManager.getRootLogger();
+ private static final char ANSI_ESC_CHAR = '\u001B';
+ private static final String RGB_STRING = ANSI_ESC_CHAR + "[38;2;%d;%d;%dm";
+ private static final String ANSI_RESET = ANSI_ESC_CHAR + "[0m";
+ private static final Pattern HEX_PATTERN = Pattern.compile("(?i)(" + ChatColor.COLOR_CHAR + "x(" + ChatColor.COLOR_CHAR + "[0-9a-f]){6})");
+ private static final boolean keepFormatting = PropertiesUtil.getProperties().getBooleanProperty(MinecraftFormattingConverter.KEEP_FORMATTING_PROPERTY);
@Override
public void sendRawMessage(String message) {
// TerminalConsoleAppender supports color codes directly in log messages
- LOGGER.info(message);
+ // However, we need to convert hex colors manually, as those do not get transformed
+ LOGGER.info(hexMagicToAnsi(message));
}
+ private static String hexMagicToAnsi(String input) {
+ // If formatting should be kept, just leave the input as-is
+ if (keepFormatting)
+ return input;
+
+ // If Ansi is not supported, just strip out any hex coloring
+ if (!TerminalConsoleAppender.isAnsiSupported())
+ return HEX_PATTERN.matcher(input).replaceAll("");
+
+ Matcher matcher = HEX_PATTERN.matcher(input);
+ StringBuffer buffer = new StringBuffer();
+ while (matcher.find()) {
+ String hex = matcher.group().replace(String.valueOf(ChatColor.COLOR_CHAR), "").replace('x', '#');
+ Color color = Color.decode(hex);
+ String replacement = String.format(RGB_STRING, color.getRed(), color.getGreen(), color.getBlue());
+ matcher.appendReplacement(buffer, replacement);
+ }
+ matcher.appendTail(buffer);
+
+ // We add the Ansi reset to the end of each message to prevent the color from carrying over to the next logged message
+ return buffer.toString() + ANSI_RESET;
+ }
}