Add usefull methods in DisplayUtil
This commit is contained in:
parent
a2b3e15e65
commit
a13e7f14b7
@ -1,6 +1,8 @@
|
|||||||
package fr.pandacube.java.util.text_display;
|
package fr.pandacube.java.util.text_display;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
@ -273,4 +275,146 @@ public class DisplayUtil {
|
|||||||
return 6 + (bold ? 1 : 0);
|
return 6 + (bold ? 1 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static List<String> wrapInLimitedPixels(String legacyText, int pixelWidth) {
|
||||||
|
List<String> lines = new ArrayList<>();
|
||||||
|
|
||||||
|
legacyText += "\n"; // workaround to force algorithm to compute last lines;
|
||||||
|
|
||||||
|
String currentLine = "";
|
||||||
|
int currentLineSize = 0;
|
||||||
|
int index = 0;
|
||||||
|
|
||||||
|
String currentWord = "";
|
||||||
|
int currentWordSize = 0;
|
||||||
|
boolean bold = false;
|
||||||
|
boolean firstCharCurrentWorldBold = false;
|
||||||
|
|
||||||
|
do {
|
||||||
|
char c = legacyText.charAt(index);
|
||||||
|
if (c == ChatColor.COLOR_CHAR && index < legacyText.length() - 1) {
|
||||||
|
currentWord += c;
|
||||||
|
c = legacyText.charAt(++index);
|
||||||
|
currentWord += c;
|
||||||
|
|
||||||
|
if (c == 'l' || c == 'L') // bold
|
||||||
|
bold = true;
|
||||||
|
if ((c >= '0' && c <= '9') // reset bold
|
||||||
|
|| (c >= 'a' && c <= 'f')
|
||||||
|
|| (c >= 'A' && c <= 'F')
|
||||||
|
|| c == 'r' || c == 'R')
|
||||||
|
bold = false;
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (c == ' ') {
|
||||||
|
if (currentLineSize + currentWordSize > pixelWidth && currentLineSize > 0) { // wrap before word
|
||||||
|
lines.add(currentLine);
|
||||||
|
String lastStyle = getLastColors(currentLine);
|
||||||
|
if (currentWord.charAt(0) == ' ') {
|
||||||
|
currentWord = currentWord.substring(1);
|
||||||
|
currentWordSize -= charW(' ', false, firstCharCurrentWorldBold);
|
||||||
|
}
|
||||||
|
currentLine = (lastStyle.equals("§r") ? "" : lastStyle) + currentWord;
|
||||||
|
currentLineSize = currentWordSize;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
currentLine += currentWord;
|
||||||
|
currentLineSize += currentWordSize;
|
||||||
|
}
|
||||||
|
currentWord = ""+c;
|
||||||
|
currentWordSize = charW(c, false, bold);
|
||||||
|
firstCharCurrentWorldBold = bold;
|
||||||
|
}
|
||||||
|
else if (c == '\n') {
|
||||||
|
if (currentLineSize + currentWordSize > pixelWidth && currentLineSize > 0) { // wrap before word
|
||||||
|
lines.add(currentLine);
|
||||||
|
String lastStyle = getLastColors(currentLine);
|
||||||
|
if (currentWord.charAt(0) == ' ') {
|
||||||
|
currentWord = currentWord.substring(1);
|
||||||
|
currentWordSize -= charW(' ', false, firstCharCurrentWorldBold);
|
||||||
|
}
|
||||||
|
currentLine = (lastStyle.equals("§r") ? "" : lastStyle) + currentWord;
|
||||||
|
currentLineSize = currentWordSize;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
currentLine += currentWord;
|
||||||
|
currentLineSize += currentWordSize;
|
||||||
|
}
|
||||||
|
// wrap after
|
||||||
|
lines.add(currentLine);
|
||||||
|
String lastStyle = getLastColors(currentLine);
|
||||||
|
|
||||||
|
currentLine = lastStyle.equals("§r") ? "" : lastStyle;
|
||||||
|
currentLineSize = 0;
|
||||||
|
currentWord = "";
|
||||||
|
currentWordSize = 0;
|
||||||
|
firstCharCurrentWorldBold = bold;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
currentWord += c;
|
||||||
|
currentWordSize += charW(c, false, bold);
|
||||||
|
}
|
||||||
|
|
||||||
|
} while(++index < legacyText.length());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return lines;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static String getLastColors(String legacyText) {
|
||||||
|
String result = "";
|
||||||
|
int length = legacyText.length();
|
||||||
|
|
||||||
|
// Search backwards from the end as it is faster
|
||||||
|
for (int index = length - 1; index > -1; index--) {
|
||||||
|
char section = legacyText.charAt(index);
|
||||||
|
if (section == ChatColor.COLOR_CHAR && index < length - 1) {
|
||||||
|
char c = legacyText.charAt(index + 1);
|
||||||
|
ChatColor color = getChatColorByChar(c);
|
||||||
|
|
||||||
|
if (color != null) {
|
||||||
|
result = color.toString() + result;
|
||||||
|
|
||||||
|
// Once we find a color or reset we can stop searching
|
||||||
|
char col = color.toString().charAt(1);
|
||||||
|
if ((col >= '0' && col <= '9')
|
||||||
|
|| (col >= 'a' && col <= 'f')
|
||||||
|
|| col == 'r') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ChatColor getChatColorByChar(char code) {
|
||||||
|
return ChatColor.getByChar(Character.toLowerCase(code));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user