TextRenderingUtils.java

com.mojang.realmsclient.util.TextRenderingUtils

信息

  • 全限定名:com.mojang.realmsclient.util.TextRenderingUtils
  • 类型:public class
  • 包:com.mojang.realmsclient.util
  • 源码路径:src/main/java/com/mojang/realmsclient/util/TextRenderingUtils.java
  • 起始行号:L13
  • 职责:

    TODO

字段/常量

内部类/嵌套类型

  • com.mojang.realmsclient.util.TextRenderingUtils.Line

    • 类型: class
    • 修饰符: public static
    • 源码定位: L78
    • 说明:

      TODO

  • com.mojang.realmsclient.util.TextRenderingUtils.LineSegment

    • 类型: class
    • 修饰符: public static
    • 源码定位: L113
    • 说明:

      TODO

构造器

private TextRenderingUtils() @ L14

  • 构造器名:TextRenderingUtils
  • 源码定位:L14
  • 修饰符:private

参数:

说明:

TODO

方法

下面的方法块按源码顺序生成。

protected static List<String> lineBreak(String text) @ L17

  • 方法名:lineBreak
  • 源码定位:L17
  • 返回类型:List
  • 修饰符:protected static

参数:

  • text: String

说明:

TODO

  • 方法名:decompose
  • 源码定位:L22
  • 返回类型:List<TextRenderingUtils.Line>
  • 修饰符:public static

参数:

  • text: String
  • links: TextRenderingUtils.LineSegment…

说明:

TODO

  • 方法名:decompose
  • 源码定位:L26
  • 返回类型:List<TextRenderingUtils.Line>
  • 修饰符:private static

参数:

  • text: String
  • links: List<TextRenderingUtils.LineSegment>

说明:

TODO

  • 方法名:insertLinks
  • 源码定位:L31
  • 返回类型:List<TextRenderingUtils.Line>
  • 修饰符:private static

参数:

  • lines: List
  • links: List<TextRenderingUtils.LineSegment>

说明:

TODO

public static List<String> split(String line, String delimiter) @ L52

  • 方法名:split
  • 源码定位:L52
  • 返回类型:List
  • 修饰符:public static

参数:

  • line: String
  • delimiter: String

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class TextRenderingUtils {
    private TextRenderingUtils() {
    }
 
    @VisibleForTesting
    protected static List<String> lineBreak(String text) {
        return Arrays.asList(text.split("\\n"));
    }
 
    public static List<TextRenderingUtils.Line> decompose(String text, TextRenderingUtils.LineSegment... links) {
        return decompose(text, Arrays.asList(links));
    }
 
    private static List<TextRenderingUtils.Line> decompose(String text, List<TextRenderingUtils.LineSegment> links) {
        List<String> brokenLines = lineBreak(text);
        return insertLinks(brokenLines, links);
    }
 
    private static List<TextRenderingUtils.Line> insertLinks(List<String> lines, List<TextRenderingUtils.LineSegment> links) {
        int linkCount = 0;
        List<TextRenderingUtils.Line> processedLines = Lists.newArrayList();
 
        for (String line : lines) {
            List<TextRenderingUtils.LineSegment> segments = Lists.newArrayList();
 
            for (String part : split(line, "%link")) {
                if ("%link".equals(part)) {
                    segments.add(links.get(linkCount++));
                } else {
                    segments.add(TextRenderingUtils.LineSegment.text(part));
                }
            }
 
            processedLines.add(new TextRenderingUtils.Line(segments));
        }
 
        return processedLines;
    }
 
    public static List<String> split(String line, String delimiter) {
        if (delimiter.isEmpty()) {
            throw new IllegalArgumentException("Delimiter cannot be the empty string");
        } else {
            List<String> parts = Lists.newArrayList();
            int searchStart = 0;
 
            int matchIndex;
            while ((matchIndex = line.indexOf(delimiter, searchStart)) != -1) {
                if (matchIndex > searchStart) {
                    parts.add(line.substring(searchStart, matchIndex));
                }
 
                parts.add(delimiter);
                searchStart = matchIndex + delimiter.length();
            }
 
            if (searchStart < line.length()) {
                parts.add(line.substring(searchStart));
            }
 
            return parts;
        }
    }
 
    @OnlyIn(Dist.CLIENT)
    public static class Line {
        public final List<TextRenderingUtils.LineSegment> segments;
 
        Line(TextRenderingUtils.LineSegment... segments) {
            this(Arrays.asList(segments));
        }
 
        Line(List<TextRenderingUtils.LineSegment> segments) {
            this.segments = segments;
        }
 
        @Override
        public String toString() {
            return "Line{segments=" + this.segments + "}";
        }
 
        @Override
        public boolean equals(Object o) {
            if (this == o) {
                return true;
            } else if (o != null && this.getClass() == o.getClass()) {
                TextRenderingUtils.Line line = (TextRenderingUtils.Line)o;
                return Objects.equals(this.segments, 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;
        private final @Nullable String linkTitle;
        private final @Nullable String linkUrl;
 
        private LineSegment(String fullText) {
            this.fullText = fullText;
            this.linkTitle = null;
            this.linkUrl = null;
        }
 
        private LineSegment(String fullText, @Nullable String linkTitle, @Nullable String linkUrl) {
            this.fullText = fullText;
            this.linkTitle = linkTitle;
            this.linkUrl = linkUrl;
        }
 
        @Override
        public boolean equals(Object o) {
            if (this == o) {
                return true;
            } else if (o != null && this.getClass() == o.getClass()) {
                TextRenderingUtils.LineSegment segment = (TextRenderingUtils.LineSegment)o;
                return Objects.equals(this.fullText, segment.fullText)
                    && Objects.equals(this.linkTitle, segment.linkTitle)
                    && Objects.equals(this.linkUrl, segment.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 linkTitle, String linkUrl) {
            return new TextRenderingUtils.LineSegment(null, linkTitle, linkUrl);
        }
 
        @VisibleForTesting
        protected static TextRenderingUtils.LineSegment text(String fullText) {
            return new TextRenderingUtils.LineSegment(fullText);
        }
    }
}

引用的其他类