package net.minecraft.client; import com.google.common.collect.Lists; import java.util.List; import java.util.ListIterator; import java.util.Optional; import java.util.function.BiConsumer; import java.util.stream.Collectors; import javax.annotation.Nullable; import net.minecraft.network.chat.FormattedText; import net.minecraft.network.chat.Style; import net.minecraft.util.FormattedCharSequence; import net.minecraft.util.FormattedCharSink; import net.minecraft.util.StringDecomposer; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import org.apache.commons.lang3.mutable.MutableFloat; import org.apache.commons.lang3.mutable.MutableInt; import org.apache.commons.lang3.mutable.MutableObject; @OnlyIn(Dist.CLIENT) public class StringSplitter { final StringSplitter.WidthProvider widthProvider; public StringSplitter(StringSplitter.WidthProvider p_92335_) { this.widthProvider = p_92335_; } public float stringWidth(@Nullable String p_92354_) { if (p_92354_ == null) { return 0.0F; } else { MutableFloat mutablefloat = new MutableFloat(); StringDecomposer.iterateFormatted(p_92354_, Style.EMPTY, (p_92429_, p_92430_, p_92431_) -> { mutablefloat.add(this.widthProvider.getWidth(p_92431_, p_92430_)); return true; }); return mutablefloat.floatValue(); } } public float stringWidth(FormattedText p_92385_) { MutableFloat mutablefloat = new MutableFloat(); StringDecomposer.iterateFormatted(p_92385_, Style.EMPTY, (p_92420_, p_92421_, p_92422_) -> { mutablefloat.add(this.widthProvider.getWidth(p_92422_, p_92421_)); return true; }); return mutablefloat.floatValue(); } public float stringWidth(FormattedCharSequence p_92337_) { MutableFloat mutablefloat = new MutableFloat(); p_92337_.accept((p_92400_, p_92401_, p_92402_) -> { mutablefloat.add(this.widthProvider.getWidth(p_92402_, p_92401_)); return true; }); return mutablefloat.floatValue(); } public int plainIndexAtWidth(String p_92361_, int p_92362_, Style p_92363_) { StringSplitter.WidthLimitedCharSink stringsplitter$widthlimitedcharsink = new StringSplitter.WidthLimitedCharSink((float)p_92362_); StringDecomposer.iterate(p_92361_, p_92363_, stringsplitter$widthlimitedcharsink); return stringsplitter$widthlimitedcharsink.getPosition(); } public String plainHeadByWidth(String p_92411_, int p_92412_, Style p_92413_) { return p_92411_.substring(0, this.plainIndexAtWidth(p_92411_, p_92412_, p_92413_)); } public String plainTailByWidth(String p_92424_, int p_92425_, Style p_92426_) { MutableFloat mutablefloat = new MutableFloat(); MutableInt mutableint = new MutableInt(p_92424_.length()); StringDecomposer.iterateBackwards(p_92424_, p_92426_, (p_92407_, p_92408_, p_92409_) -> { float f = mutablefloat.addAndGet(this.widthProvider.getWidth(p_92409_, p_92408_)); if (f > (float)p_92425_) { return false; } else { mutableint.setValue(p_92407_); return true; } }); return p_92424_.substring(mutableint.intValue()); } public int formattedIndexByWidth(String p_168627_, int p_168628_, Style p_168629_) { StringSplitter.WidthLimitedCharSink stringsplitter$widthlimitedcharsink = new StringSplitter.WidthLimitedCharSink((float)p_168628_); StringDecomposer.iterateFormatted(p_168627_, p_168629_, stringsplitter$widthlimitedcharsink); return stringsplitter$widthlimitedcharsink.getPosition(); } @Nullable public Style componentStyleAtWidth(FormattedText p_92387_, int p_92388_) { StringSplitter.WidthLimitedCharSink stringsplitter$widthlimitedcharsink = new StringSplitter.WidthLimitedCharSink((float)p_92388_); return p_92387_.