package com.mojang.realmsclient.util; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Lists; import java.util.Arrays; import java.util.List; import java.util.Objects; import javax.annotation.Nullable; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @OnlyIn(Dist.CLIENT) public class TextRenderingUtils { private TextRenderingUtils() { } @VisibleForTesting protected static List lineBreak(String p_90249_) { return Arrays.asList(p_90249_.split("\\n")); } public static List decompose(String p_90257_, TextRenderingUtils.LineSegment... p_90258_) { return decompose(p_90257_, Arrays.asList(p_90258_)); } private static List decompose(String p_90254_, List p_90255_) { List list = lineBreak(p_90254_); return insertLinks(list, p_90255_); } private static List insertLinks(List p_90260_, List p_90261_) { int i = 0; List list = Lists.newArrayList(); for (String s : p_90260_) { List list1 = Lists.newArrayList(); for (String s1 : split(s, "%link")) { if ("%link".equals(s1)) { list1.add(p_90261_.get(i++)); } else { list1.add(TextRenderingUtils.LineSegment.text(s1)); } } list.add(new TextRenderingUtils.Line(list1)); } return list; } public static List split(String p_90251_, String p_90252_) { if (p_90252_.isEmpty()) { throw new IllegalArgumentException("Delimiter cannot be the empty string"); } else { List list = Lists.newArrayList(); int i = 0; int j; while ((j = p_90251_.indexOf(p_90252_, i)) != -1) { if (j > i) { list.add(p_90251_.substring(i, j)); } list.add(p_90252_); i = j + p_90252_.length(); } if (i < p_90251_.length()) { list.add(p_90251_.substring(i)); } return list; } } @OnlyIn(Dist.CLIENT) public static class Line { public final List segments; Line(TextRenderingUtils.LineSegment... p_167625_) { this(Arrays.asList(p_167625_)); } Line(List p_90264_) { this.segments = p_90264_; } @Override public String toString() { return "Line{segments=" + this.segments + "}"; } @Override public boolean equals(Object p_90266_) { if (this == p_90266_) { return true; } else if (p_90266_ != null && this.getClass() == p_90266_.getClass()) { TextRenderingUtils.Line textrenderingutils$line = (TextRenderingUtils.Line)p_90266_; return Objects.equals(this.segments, textrenderingutils$line.segments); } else { return false; } } @Override public int hashCode() { return Objects.hash(this.segments); } } @OnlyIn(Dist.CLIENT) public static class LineSegment { private final String fullText; @Nullable private final String linkTitle; @Nullable private final String linkUrl; private LineSegment(String p_90273_) { this.fullText = p_90273_; this.linkTitle = null; this.linkUrl = null; } private LineSegment(String p_90275_, @Nullable String p_90276_, @Nullable String p_90277_) { this.fullText = p_90275_; this.linkTitle = p_90276_; this.linkUrl = p_90277_; } @Override public boolean equals(Object p_90287_) { if (this == p_90287_) { return true; } else if (p_90287_ != null && this.getClass() == p_90287_.getClass()) { TextRenderingUtils.LineSegment textrenderingutils$linesegment = (TextRenderingUtils.LineSegment)p_90287_; return Objects.equals(this.fullText, textrenderingutils$linesegment.fullText) && Objects.equals(this.linkTitle, textrenderingutils$linesegment.linkTitle) && Objects.equals(this.linkUrl, textrenderingutils$linesegment.linkUrl); } else { return false; } } @Override public int hashCode() { return Objects.hash(this.fullText, this.linkTitle, this.linkUrl); } @Override public String toString() { return "Segment{fullText='" + this.fullText + "', linkTitle='" + this.linkTitle + "', linkUrl='" + this.linkUrl + "'}"; } public String renderedText() { return this.isLink() ? this.linkTitle : this.fullText; } public boolean isLink() { return this.linkTitle != null; } public String getLinkUrl() { if (!this.isLink()) { throw new IllegalStateException("Not a link: " + this); } else { return this.linkUrl; } } public static TextRenderingUtils.LineSegment link(String p_90282_, String p_90283_) { return new TextRenderingUtils.LineSegment(null, p_90282_, p_90283_); } @VisibleForTesting protected static TextRenderingUtils.LineSegment text(String p_90280_) { return new TextRenderingUtils.LineSegment(p_90280_); } } }