minecraft-src/net/minecraft/network/chat/SubStringSource.java
2025-07-04 01:41:11 +03:00

77 lines
2.6 KiB
Java

package net.minecraft.network.chat;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import it.unimi.dsi.fastutil.ints.Int2IntFunction;
import java.util.List;
import java.util.Optional;
import java.util.function.UnaryOperator;
import net.minecraft.util.FormattedCharSequence;
import net.minecraft.util.StringDecomposer;
public class SubStringSource {
private final String plainText;
private final List<Style> charStyles;
private final Int2IntFunction reverseCharModifier;
private SubStringSource(String plainText, List<Style> charStyles, Int2IntFunction reverseCharModifier) {
this.plainText = plainText;
this.charStyles = ImmutableList.copyOf(charStyles);
this.reverseCharModifier = reverseCharModifier;
}
public String getPlainText() {
return this.plainText;
}
public List<FormattedCharSequence> substring(int fromIndex, int toIndex, boolean reversed) {
if (toIndex == 0) {
return ImmutableList.of();
} else {
List<FormattedCharSequence> list = Lists.<FormattedCharSequence>newArrayList();
Style style = (Style)this.charStyles.get(fromIndex);
int i = fromIndex;
for (int j = 1; j < toIndex; j++) {
int k = fromIndex + j;
Style style2 = (Style)this.charStyles.get(k);
if (!style2.equals(style)) {
String string = this.plainText.substring(i, k);
list.add(reversed ? FormattedCharSequence.backward(string, style, this.reverseCharModifier) : FormattedCharSequence.forward(string, style));
style = style2;
i = k;
}
}
if (i < fromIndex + toIndex) {
String string2 = this.plainText.substring(i, fromIndex + toIndex);
list.add(reversed ? FormattedCharSequence.backward(string2, style, this.reverseCharModifier) : FormattedCharSequence.forward(string2, style));
}
return reversed ? Lists.reverse(list) : list;
}
}
public static SubStringSource create(FormattedText formattedText) {
return create(formattedText, i -> i, string -> string);
}
public static SubStringSource create(FormattedText formattedText, Int2IntFunction reverseCharModifier, UnaryOperator<String> textTransformer) {
StringBuilder stringBuilder = new StringBuilder();
List<Style> list = Lists.<Style>newArrayList();
formattedText.visit((style, string) -> {
StringDecomposer.iterateFormatted(string, style, (i, stylex, j) -> {
stringBuilder.appendCodePoint(j);
int k = Character.charCount(j);
for (int l = 0; l < k; l++) {
list.add(stylex);
}
return true;
});
return Optional.empty();
}, Style.EMPTY);
return new SubStringSource((String)textTransformer.apply(stringBuilder.toString()), list, reverseCharModifier);
}
}