From 81f0cfe6b045bf39563e77c04ac5b8ffc6725755 Mon Sep 17 00:00:00 2001 From: kevinbarnes Date: Tue, 11 Jan 2022 22:33:35 -0500 Subject: [PATCH 01/10] add css colors transformation --- .../TransformationRegistryImpl.java | 1 + .../transformation/TransformationType.java | 5 + .../inbuild/CSSColorTransformation.java | 263 ++++++++++++++++++ 3 files changed, 269 insertions(+) create mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/inbuild/CSSColorTransformation.java diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/TransformationRegistryImpl.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/TransformationRegistryImpl.java index 17ea47674..6d9021b1e 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/TransformationRegistryImpl.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/TransformationRegistryImpl.java @@ -45,6 +45,7 @@ final class TransformationRegistryImpl implements TransformationRegistry { static { DEFAULT_TRANSFORMATIONS.add(TransformationType.COLOR); + DEFAULT_TRANSFORMATIONS.add(TransformationType.CSS_COLOR); DEFAULT_TRANSFORMATIONS.add(TransformationType.DECORATION); DEFAULT_TRANSFORMATIONS.add(TransformationType.HOVER_EVENT); DEFAULT_TRANSFORMATIONS.add(TransformationType.CLICK_EVENT); diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/TransformationType.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/TransformationType.java index b95ce4e9d..06d423582 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/TransformationType.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/TransformationType.java @@ -32,6 +32,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import net.kyori.adventure.text.format.TextDecoration; +import net.kyori.adventure.text.minimessage.transformation.inbuild.CSSColorTransformation; import net.kyori.adventure.text.minimessage.transformation.inbuild.ClickTransformation; import net.kyori.adventure.text.minimessage.transformation.inbuild.ColorTransformation; import net.kyori.adventure.text.minimessage.transformation.inbuild.DecorationTransformation; @@ -57,6 +58,10 @@ public final class TransformationType { ColorTransformation::canParse, ColorTransformation::create ); + public static final TransformationType CSS_COLOR = transformationType( + CSSColorTransformation::canParse, + CSSColorTransformation::create + ); public static final TransformationType DECORATION = transformationType( acceptingNames( Stream.of(TextDecoration.NAMES.keys(), DecorationTransformation.DECORATION_ALIASES.keySet()) diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/inbuild/CSSColorTransformation.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/inbuild/CSSColorTransformation.java new file mode 100644 index 000000000..1540f5853 --- /dev/null +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/inbuild/CSSColorTransformation.java @@ -0,0 +1,263 @@ +/* + * This file is part of adventure, licensed under the MIT License. + * + * Copyright (c) 2017-2022 KyoriPowered + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package net.kyori.adventure.text.minimessage.transformation.inbuild; + +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Stream; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextColor; +import net.kyori.adventure.text.minimessage.parser.ParsingException; +import net.kyori.adventure.text.minimessage.parser.node.TagPart; +import net.kyori.adventure.text.minimessage.transformation.Transformation; +import net.kyori.examination.ExaminableProperty; +import org.jetbrains.annotations.NotNull; + +/** + * A transformation applying a single css color. + * + * @since 4.10.0 + */ +public final class CSSColorTransformation extends Transformation { + + public static final Map CSS_COLORS = new HashMap<>(); + + static { + CSS_COLORS.put("aliceblue", TextColor.color(0xf0f8ff)); + CSS_COLORS.put("antiquewhite", TextColor.color(0xfaebd7)); + CSS_COLORS.put("aqua", TextColor.color(0x00ffff)); + CSS_COLORS.put("aquamarine", TextColor.color(0x7fffd4)); + CSS_COLORS.put("azure", TextColor.color(0xf0ffff)); + CSS_COLORS.put("beige", TextColor.color(0xf5f5dc)); + CSS_COLORS.put("bisque", TextColor.color(0xffe4c4)); + CSS_COLORS.put("black", TextColor.color(0x000000)); + CSS_COLORS.put("blanchedalmond", TextColor.color(0xffebcd)); + CSS_COLORS.put("blue", TextColor.color(0x0000ff)); + CSS_COLORS.put("blueviolet", TextColor.color(0x8a2be2)); + CSS_COLORS.put("brown", TextColor.color(0xa52a2a)); + CSS_COLORS.put("burlywood", TextColor.color(0xdeb887)); + CSS_COLORS.put("cadetblue", TextColor.color(0x5f9ea0)); + CSS_COLORS.put("chartreuse", TextColor.color(0x7fff00)); + CSS_COLORS.put("chocolate", TextColor.color(0xd2691e)); + CSS_COLORS.put("coral", TextColor.color(0xff7f50)); + CSS_COLORS.put("cornflowerblue", TextColor.color(0x6495ed)); + CSS_COLORS.put("cornsilk", TextColor.color(0xfff8dc)); + CSS_COLORS.put("crimson", TextColor.color(0xdc143c)); + CSS_COLORS.put("cyan", TextColor.color(0x00ffff)); + CSS_COLORS.put("darkblue", TextColor.color(0x00008b)); + CSS_COLORS.put("darkcyan", TextColor.color(0x008b8b)); + CSS_COLORS.put("darkgoldenrod", TextColor.color(0xb8860b)); + CSS_COLORS.put("darkgray", TextColor.color(0xa9a9a9)); + CSS_COLORS.put("darkgreen", TextColor.color(0x006400)); + CSS_COLORS.put("darkgrey", TextColor.color(0xa9a9a9)); + CSS_COLORS.put("darkkhaki", TextColor.color(0xbdb76b)); + CSS_COLORS.put("darkmagenta", TextColor.color(0x8b008b)); + CSS_COLORS.put("darkolivegreen", TextColor.color(0x556b2f)); + CSS_COLORS.put("darkorange", TextColor.color(0xff8c00)); + CSS_COLORS.put("darkorchid", TextColor.color(0x9932cc)); + CSS_COLORS.put("darkred", TextColor.color(0x8b0000)); + CSS_COLORS.put("darksalmon", TextColor.color(0xe9967a)); + CSS_COLORS.put("darkseagreen", TextColor.color(0x8fbc8f)); + CSS_COLORS.put("darkslateblue", TextColor.color(0x483d8b)); + CSS_COLORS.put("darkslategray", TextColor.color(0x2f4f4f)); + CSS_COLORS.put("darkslategrey", TextColor.color(0x2f4f4f)); + CSS_COLORS.put("darkturquoise", TextColor.color(0x00ced1)); + CSS_COLORS.put("darkviolet", TextColor.color(0x9400d3)); + CSS_COLORS.put("deeppink", TextColor.color(0xff1493)); + CSS_COLORS.put("deepskyblue", TextColor.color(0x00bfff)); + CSS_COLORS.put("dimgray", TextColor.color(0x696969)); + CSS_COLORS.put("dimgrey", TextColor.color(0x696969)); + CSS_COLORS.put("dodgerblue", TextColor.color(0x1e90ff)); + CSS_COLORS.put("firebrick", TextColor.color(0xb22222)); + CSS_COLORS.put("floralwhite", TextColor.color(0xfffaf0)); + CSS_COLORS.put("forestgreen", TextColor.color(0x228b22)); + CSS_COLORS.put("fuchsia", TextColor.color(0xff00ff)); + CSS_COLORS.put("gainsboro", TextColor.color(0xdcdcdc)); + CSS_COLORS.put("ghostwhite", TextColor.color(0xf8f8ff)); + CSS_COLORS.put("gold", TextColor.color(0xffd700)); + CSS_COLORS.put("goldenrod", TextColor.color(0xdaa520)); + CSS_COLORS.put("gray", TextColor.color(0x808080)); + CSS_COLORS.put("green", TextColor.color(0x008000)); + CSS_COLORS.put("greenyellow", TextColor.color(0xadff2f)); + CSS_COLORS.put("grey", TextColor.color(0x808080)); + CSS_COLORS.put("honeydew", TextColor.color(0xf0fff0)); + CSS_COLORS.put("hotpink", TextColor.color(0xff69b4)); + CSS_COLORS.put("indianred", TextColor.color(0xcd5c5c)); + CSS_COLORS.put("indigo", TextColor.color(0x4b0082)); + CSS_COLORS.put("ivory", TextColor.color(0xfffff0)); + CSS_COLORS.put("khaki", TextColor.color(0xf0e68c)); + CSS_COLORS.put("lavender", TextColor.color(0xe6e6fa)); + CSS_COLORS.put("lavenderblush", TextColor.color(0xfff0f5)); + CSS_COLORS.put("lawngreen", TextColor.color(0x7cfc00)); + CSS_COLORS.put("lemonchiffon", TextColor.color(0xfffacd)); + CSS_COLORS.put("lightblue", TextColor.color(0xadd8e6)); + CSS_COLORS.put("lightcoral", TextColor.color(0xf08080)); + CSS_COLORS.put("lightcyan", TextColor.color(0xe0ffff)); + CSS_COLORS.put("lightgoldenrodyellow", TextColor.color(0xfafad2)); + CSS_COLORS.put("lightgray", TextColor.color(0xd3d3d3)); + CSS_COLORS.put("lightgreen", TextColor.color(0x90ee90)); + CSS_COLORS.put("lightgrey", TextColor.color(0xd3d3d3)); + CSS_COLORS.put("lightpink", TextColor.color(0xffb6c1)); + CSS_COLORS.put("lightsalmon", TextColor.color(0xffa07a)); + CSS_COLORS.put("lightseagreen", TextColor.color(0x20b2aa)); + CSS_COLORS.put("lightskyblue", TextColor.color(0x87cefa)); + CSS_COLORS.put("lightslategray", TextColor.color(0x778899)); + CSS_COLORS.put("lightslategrey", TextColor.color(0x778899)); + CSS_COLORS.put("lightsteelblue", TextColor.color(0xb0c4de)); + CSS_COLORS.put("lightyellow", TextColor.color(0xffffe0)); + CSS_COLORS.put("lime", TextColor.color(0x00ff00)); + CSS_COLORS.put("limegreen", TextColor.color(0x32cd32)); + CSS_COLORS.put("linen", TextColor.color(0xfaf0e6)); + CSS_COLORS.put("magenta", TextColor.color(0xff00ff)); + CSS_COLORS.put("maroon", TextColor.color(0x800000)); + CSS_COLORS.put("mediumaquamarine", TextColor.color(0x66cdaa)); + CSS_COLORS.put("mediumblue", TextColor.color(0x0000cd)); + CSS_COLORS.put("mediumorchid", TextColor.color(0xba55d3)); + CSS_COLORS.put("mediumpurple", TextColor.color(0x9370db)); + CSS_COLORS.put("mediumseagreen", TextColor.color(0x3cb371)); + CSS_COLORS.put("mediumslateblue", TextColor.color(0x7b68ee)); + CSS_COLORS.put("mediumspringgreen", TextColor.color(0x00fa9a)); + CSS_COLORS.put("mediumturquoise", TextColor.color(0x48d1cc)); + CSS_COLORS.put("mediumvioletred", TextColor.color(0xc71585)); + CSS_COLORS.put("midnightblue", TextColor.color(0x191970)); + CSS_COLORS.put("mintcream", TextColor.color(0xf5fffa)); + CSS_COLORS.put("mistyrose", TextColor.color(0xffe4e1)); + CSS_COLORS.put("moccasin", TextColor.color(0xffe4b5)); + CSS_COLORS.put("navajowhite", TextColor.color(0xffdead)); + CSS_COLORS.put("navy", TextColor.color(0x000080)); + CSS_COLORS.put("oldlace", TextColor.color(0xfdf5e6)); + CSS_COLORS.put("olive", TextColor.color(0x808000)); + CSS_COLORS.put("olivedrab", TextColor.color(0x6b8e23)); + CSS_COLORS.put("orange", TextColor.color(0xffa500)); + CSS_COLORS.put("orangered", TextColor.color(0xff4500)); + CSS_COLORS.put("orchid", TextColor.color(0xda70d6)); + CSS_COLORS.put("palegoldenrod", TextColor.color(0xeee8aa)); + CSS_COLORS.put("palegreen", TextColor.color(0x98fb98)); + CSS_COLORS.put("paleturquoise", TextColor.color(0xafeeee)); + CSS_COLORS.put("palevioletred", TextColor.color(0xdb7093)); + CSS_COLORS.put("papayawhip", TextColor.color(0xffefd5)); + CSS_COLORS.put("peachpuff", TextColor.color(0xffdab9)); + CSS_COLORS.put("peru", TextColor.color(0xcd853f)); + CSS_COLORS.put("pink", TextColor.color(0xffc0cb)); + CSS_COLORS.put("plum", TextColor.color(0xdda0dd)); + CSS_COLORS.put("powderblue", TextColor.color(0xb0e0e6)); + CSS_COLORS.put("purple", TextColor.color(0x800080)); + CSS_COLORS.put("red", TextColor.color(0xff0000)); + CSS_COLORS.put("rosybrown", TextColor.color(0xbc8f8f)); + CSS_COLORS.put("royalblue", TextColor.color(0x4169e1)); + CSS_COLORS.put("saddlebrown", TextColor.color(0x8b4513)); + CSS_COLORS.put("salmon", TextColor.color(0xfa8072)); + CSS_COLORS.put("sandybrown", TextColor.color(0xf4a460)); + CSS_COLORS.put("seagreen", TextColor.color(0x2e8b57)); + CSS_COLORS.put("seashell", TextColor.color(0xfff5ee)); + CSS_COLORS.put("sienna", TextColor.color(0xa0522d)); + CSS_COLORS.put("silver", TextColor.color(0xc0c0c0)); + CSS_COLORS.put("skyblue", TextColor.color(0x87ceeb)); + CSS_COLORS.put("slateblue", TextColor.color(0x6a5acd)); + CSS_COLORS.put("slategray", TextColor.color(0x708090)); + CSS_COLORS.put("slategrey", TextColor.color(0x708090)); + CSS_COLORS.put("snow", TextColor.color(0xfffafa)); + CSS_COLORS.put("springgreen", TextColor.color(0x00ff7f)); + CSS_COLORS.put("steelblue", TextColor.color(0x4682b4)); + CSS_COLORS.put("tan", TextColor.color(0xd2b48c)); + CSS_COLORS.put("teal", TextColor.color(0x008080)); + CSS_COLORS.put("thistle", TextColor.color(0xd8bfd8)); + CSS_COLORS.put("tomato", TextColor.color(0xff6347)); + CSS_COLORS.put("turquoise", TextColor.color(0x40e0d0)); + CSS_COLORS.put("violet", TextColor.color(0xee82ee)); + CSS_COLORS.put("wheat", TextColor.color(0xf5deb3)); + CSS_COLORS.put("white", TextColor.color(0xffffff)); + CSS_COLORS.put("whitesmoke", TextColor.color(0xf5f5f5)); + CSS_COLORS.put("yellow", TextColor.color(0xffff00)); + CSS_COLORS.put("yellowgreen", TextColor.color(0x9acd32)); + } + + private final TextColor color; + + /** + * Get if this transformation can handle the provided tag name. + * + * @param name tag name to test + * @return if this transformation is applicable + * @since 4.10.0 + */ + public static boolean canParse(final String name) { + return CSS_COLORS.containsKey(name) || name.equalsIgnoreCase("css"); + } + + /** + * Create a new css color. + * + * @param name the tag name + * @param args the tag arguments + * @return a new transformation + * @since 4.10.0 + */ + public static CSSColorTransformation create(final String name, final List args) { + final TextColor color; + if (name.equalsIgnoreCase("css")) { + if (args.size() == 1) { + color = CSS_COLORS.get(args.get(0).value().toLowerCase(Locale.ROOT)); + } else { + throw new ParsingException("Expected to find a css color name, but found " + args, args); + } + } else { + color = CSS_COLORS.get(name); + if (color == null) { + throw new ParsingException("Expected to find a css color name, but found " + name, args); + } + } + return new CSSColorTransformation(color); + } + + private CSSColorTransformation(final TextColor color) { + this.color = color; + } + + @Override + public Component apply() { + return Component.empty().color(this.color); + } + + @Override + public @NotNull Stream examinableProperties() { + return Stream.of(ExaminableProperty.of("color", this.color)); + } + + @Override + public boolean equals(final Object other) { + if (this == other) return true; + if (other == null || this.getClass() != other.getClass()) return false; + final CSSColorTransformation that = (CSSColorTransformation) other; + return Objects.equals(this.color, that.color); + } + + @Override + public int hashCode() { + return Objects.hash(this.color); + } +} From 50b195b93d2a220298de3c4c111700c05c97d85c Mon Sep 17 00:00:00 2001 From: kevinbarnes Date: Wed, 12 Jan 2022 14:40:22 -0500 Subject: [PATCH 02/10] add unit tests --- .../minimessage/MiniMessageParserTest.java | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageParserTest.java b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageParserTest.java index a44eeac5e..94ed067b2 100644 --- a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageParserTest.java +++ b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageParserTest.java @@ -1684,4 +1684,67 @@ void testNestedGradientsDontOverrideColors() { this.assertParsedEquals(expected, input); } + + @Test + public void singleCssColor() { + final String input = "Alice Blue"; + + final Component expected = Component.text("Alice Blue").color(TextColor.color(0xf0f8ff)); + + this.assertParsedEquals(expected, input); + } + + @Test + public void multipleCssColors() { + final String input = "Blue White Orange"; + + final Component expected = Component.empty() + .append(Component.text("Blue").color(TextColor.color(0xf0f8ff))) + .append(Component.text(" White ")) + .append(Component.text("Orange").color(TextColor.color(0xffa500))); + + this.assertParsedEquals(expected, input); + } + + @Test + public void multipleCssColorsUsingArgs() { + final String input = "Blue White Orange"; + + final Component expected = Component.empty() + .append(Component.text("Blue").color(TextColor.color(0xf0f8ff))) + .append(Component.text(" White ")) + .append(Component.text("Orange").color(TextColor.color(0xffa500))); + + this.assertParsedEquals(expected, input); + } + + @Test + public void mcColorThatExistsInCss() { + final String input = "Minecraft"; + + final Component expected = Component.text("Minecraft").color(NamedTextColor.AQUA); + + this.assertParsedEquals(expected, input); + } + + @Test + public void specifyCssColorThatExistsInMc() { + final String input = "CSS"; + + final Component expected = Component.text("CSS").color(TextColor.color(0x00ffff)); + + this.assertParsedEquals(expected, input); + } + + @Test + public void cssAndMcColors() { + final String input = "MC Aqua White CSS Aqua"; + + final Component expected = Component.empty() + .append(Component.text("MC Aqua").color(TextColor.color(0x55ffff))) + .append(Component.text(" White ")) + .append(Component.text("CSS Aqua").color(TextColor.color(0x00ffff))); + + this.assertParsedEquals(expected, input); + } } From b9fe9dccb372ed6a50a14df9bdd0c3518ab94a9e Mon Sep 17 00:00:00 2001 From: kevinbarnes Date: Wed, 12 Jan 2022 16:48:44 -0500 Subject: [PATCH 03/10] add TransformationType#color methods --- .../TransformationRegistryImpl.java | 1 - .../transformation/TransformationType.java | 57 +++++++++++++++++ .../inbuild/CSSColorTransformation.java | 2 +- .../inbuild/ColorTransformation.java | 8 ++- .../minimessage/MiniMessageParserTest.java | 61 +++++++++++++++++-- 5 files changed, 120 insertions(+), 9 deletions(-) diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/TransformationRegistryImpl.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/TransformationRegistryImpl.java index 6d9021b1e..17ea47674 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/TransformationRegistryImpl.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/TransformationRegistryImpl.java @@ -45,7 +45,6 @@ final class TransformationRegistryImpl implements TransformationRegistry { static { DEFAULT_TRANSFORMATIONS.add(TransformationType.COLOR); - DEFAULT_TRANSFORMATIONS.add(TransformationType.CSS_COLOR); DEFAULT_TRANSFORMATIONS.add(TransformationType.DECORATION); DEFAULT_TRANSFORMATIONS.add(TransformationType.HOVER_EVENT); DEFAULT_TRANSFORMATIONS.add(TransformationType.CLICK_EVENT); diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/TransformationType.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/TransformationType.java index 06d423582..f631b4180 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/TransformationType.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/TransformationType.java @@ -27,11 +27,14 @@ import java.util.Collection; import java.util.HashSet; import java.util.Locale; +import java.util.Map; import java.util.Set; import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; +import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.format.TextDecoration; +import net.kyori.adventure.text.minimessage.parser.ParsingException; import net.kyori.adventure.text.minimessage.transformation.inbuild.CSSColorTransformation; import net.kyori.adventure.text.minimessage.transformation.inbuild.ClickTransformation; import net.kyori.adventure.text.minimessage.transformation.inbuild.ColorTransformation; @@ -187,4 +190,58 @@ public static Predicate acceptingNames(final Collection elements return names::contains; } } + + /** + * Create a new color transformation type for parsing the supplied color map. + * + * @param aliases map of color names to their {@link TextColor} values + * @return a new color transformation + * @since 4.10.0 + */ + public static TransformationType color(final Map aliases) { + return transformationType( + acceptingNames(aliases.keySet()), + (name, args) -> { + final TextColor color = aliases.get(name.toLowerCase(Locale.ROOT)); + if (color == null) { + throw new ParsingException("Expected to find a color name, but found " + name, args); + } + return new ColorTransformation(color); + } + ); + } + + /** + * Create a new color transformation type for parsing the supplied color map + * The identifier allows you to use an alias that is already present, such as 'gray', + * by specifying 'identifier:gray' in the tag to ensure your supplied color is used. + * + * @param identifier the alias identifier + * @param aliases map of color names to their {@link TextColor} values + * @return a new color transformation + * @since 4.10.0 + */ + public static TransformationType color(final String identifier, final Map aliases) { + final Set names = new HashSet<>(aliases.keySet()); + names.add(identifier); + return transformationType( + acceptingNames(names), + (name, args) -> { + final TextColor color; + if (name.equalsIgnoreCase(identifier)) { + if (args.size() == 1) { + color = aliases.get(args.get(0).value().toLowerCase(Locale.ROOT)); + } else { + throw new ParsingException("Expected to find a color name, but found " + args, args); + } + } else { + color = aliases.get(name.toLowerCase(Locale.ROOT)); + if (color == null) { + throw new ParsingException("Expected to find a color name, but found " + name, args); + } + } + return new ColorTransformation(color); + } + ); + } } diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/inbuild/CSSColorTransformation.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/inbuild/CSSColorTransformation.java index 1540f5853..2d1e8c779 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/inbuild/CSSColorTransformation.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/inbuild/CSSColorTransformation.java @@ -226,7 +226,7 @@ public static CSSColorTransformation create(final String name, final List return new ColorTransformation(color); } - private ColorTransformation(final TextColor color) { + /** + * Create a new color transformation. + * + * @param color the color + * @since 4.10.0 + */ + public ColorTransformation(final TextColor color) { this.color = color; } diff --git a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageParserTest.java b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageParserTest.java index 94ed067b2..2cf65a255 100644 --- a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageParserTest.java +++ b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageParserTest.java @@ -23,6 +23,8 @@ */ package net.kyori.adventure.text.minimessage; +import java.util.HashMap; +import java.util.Map; import java.util.UUID; import net.kyori.adventure.key.Key; import net.kyori.adventure.text.Component; @@ -33,6 +35,7 @@ import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.minimessage.placeholder.Placeholder; import net.kyori.adventure.text.minimessage.placeholder.PlaceholderResolver; +import net.kyori.adventure.text.minimessage.transformation.TransformationType; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import org.junit.jupiter.api.Test; @@ -1691,7 +1694,9 @@ public void singleCssColor() { final Component expected = Component.text("Alice Blue").color(TextColor.color(0xf0f8ff)); - this.assertParsedEquals(expected, input); + assertEquals(expected, MiniMessage.builder().transformations(builder -> + builder.add(TransformationType.CSS_COLOR) + ).build().parse(input)); } @Test @@ -1703,7 +1708,9 @@ public void multipleCssColors() { .append(Component.text(" White ")) .append(Component.text("Orange").color(TextColor.color(0xffa500))); - this.assertParsedEquals(expected, input); + assertEquals(expected, MiniMessage.builder().transformations(builder -> + builder.add(TransformationType.CSS_COLOR) + ).build().parse(input)); } @Test @@ -1715,7 +1722,9 @@ public void multipleCssColorsUsingArgs() { .append(Component.text(" White ")) .append(Component.text("Orange").color(TextColor.color(0xffa500))); - this.assertParsedEquals(expected, input); + assertEquals(expected, MiniMessage.builder().transformations(builder -> + builder.add(TransformationType.CSS_COLOR) + ).build().parse(input)); } @Test @@ -1724,7 +1733,9 @@ public void mcColorThatExistsInCss() { final Component expected = Component.text("Minecraft").color(NamedTextColor.AQUA); - this.assertParsedEquals(expected, input); + assertEquals(expected, MiniMessage.builder().transformations(builder -> + builder.add(TransformationType.CSS_COLOR) + ).build().parse(input)); } @Test @@ -1733,7 +1744,9 @@ public void specifyCssColorThatExistsInMc() { final Component expected = Component.text("CSS").color(TextColor.color(0x00ffff)); - this.assertParsedEquals(expected, input); + assertEquals(expected, MiniMessage.builder().transformations(builder -> + builder.add(TransformationType.CSS_COLOR) + ).build().parse(input)); } @Test @@ -1745,6 +1758,42 @@ public void cssAndMcColors() { .append(Component.text(" White ")) .append(Component.text("CSS Aqua").color(TextColor.color(0x00ffff))); - this.assertParsedEquals(expected, input); + assertEquals(expected, MiniMessage.builder().transformations(builder -> + builder.add(TransformationType.CSS_COLOR) + ).build().parse(input)); + } + + @Test + public void testCustomColorTransformation() { + final String input = "Orange"; + + final Component expected = Component.text("Orange").color(TextColor.color(0xfc6a03)); + + final Map colorMap = new HashMap<>(); + colorMap.put("orange", TextColor.color(0xfc6a03)); + + assertEquals( + expected, + MiniMessage.builder().transformations(builder -> + builder.add(TransformationType.color(colorMap)) + ).build().parse(input) + ); + } + + @Test + public void testCustomColorTransformationWithIdentifier() { + final String input = "Orange"; + + final Component expected = Component.text("Orange").color(TextColor.color(0xfc6a03)); + + final Map colorMap = new HashMap<>(); + colorMap.put("orange", TextColor.color(0xfc6a03)); + + assertEquals( + expected, + MiniMessage.builder().transformations(builder -> + builder.add(TransformationType.color("identifier", colorMap)).add(TransformationType.CSS_COLOR) + ).build().parse(input) + ); } } From 2561c1b991d9766452cd5bad0fe54dd259a60b94 Mon Sep 17 00:00:00 2001 From: kevinbarnes Date: Wed, 12 Jan 2022 20:27:19 -0500 Subject: [PATCH 04/10] parse -> deserialize --- .../text/minimessage/MiniMessageParserTest.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageParserTest.java b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageParserTest.java index 2cf65a255..e1f0b4e59 100644 --- a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageParserTest.java +++ b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageParserTest.java @@ -1696,7 +1696,7 @@ public void singleCssColor() { assertEquals(expected, MiniMessage.builder().transformations(builder -> builder.add(TransformationType.CSS_COLOR) - ).build().parse(input)); + ).build().deserialize(input)); } @Test @@ -1710,7 +1710,7 @@ public void multipleCssColors() { assertEquals(expected, MiniMessage.builder().transformations(builder -> builder.add(TransformationType.CSS_COLOR) - ).build().parse(input)); + ).build().deserialize(input)); } @Test @@ -1724,7 +1724,7 @@ public void multipleCssColorsUsingArgs() { assertEquals(expected, MiniMessage.builder().transformations(builder -> builder.add(TransformationType.CSS_COLOR) - ).build().parse(input)); + ).build().deserialize(input)); } @Test @@ -1735,7 +1735,7 @@ public void mcColorThatExistsInCss() { assertEquals(expected, MiniMessage.builder().transformations(builder -> builder.add(TransformationType.CSS_COLOR) - ).build().parse(input)); + ).build().deserialize(input)); } @Test @@ -1746,7 +1746,7 @@ public void specifyCssColorThatExistsInMc() { assertEquals(expected, MiniMessage.builder().transformations(builder -> builder.add(TransformationType.CSS_COLOR) - ).build().parse(input)); + ).build().deserialize(input)); } @Test @@ -1760,7 +1760,7 @@ public void cssAndMcColors() { assertEquals(expected, MiniMessage.builder().transformations(builder -> builder.add(TransformationType.CSS_COLOR) - ).build().parse(input)); + ).build().deserialize(input)); } @Test @@ -1776,7 +1776,7 @@ public void testCustomColorTransformation() { expected, MiniMessage.builder().transformations(builder -> builder.add(TransformationType.color(colorMap)) - ).build().parse(input) + ).build().deserialize(input) ); } @@ -1793,7 +1793,7 @@ public void testCustomColorTransformationWithIdentifier() { expected, MiniMessage.builder().transformations(builder -> builder.add(TransformationType.color("identifier", colorMap)).add(TransformationType.CSS_COLOR) - ).build().parse(input) + ).build().deserialize(input) ); } } From 9c97f84ae9c22fe1804fef6bc45546cef28c0b04 Mon Sep 17 00:00:00 2001 From: kevinbarnes Date: Thu, 13 Jan 2022 12:04:18 -0500 Subject: [PATCH 05/10] TransformationType#color -> ColorTransformation#color --- .../transformation/TransformationType.java | 57 ------------------- .../inbuild/ColorTransformation.java | 57 ++++++++++++++++++- .../minimessage/MiniMessageParserTest.java | 5 +- 3 files changed, 57 insertions(+), 62 deletions(-) diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/TransformationType.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/TransformationType.java index f631b4180..06d423582 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/TransformationType.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/TransformationType.java @@ -27,14 +27,11 @@ import java.util.Collection; import java.util.HashSet; import java.util.Locale; -import java.util.Map; import java.util.Set; import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; -import net.kyori.adventure.text.format.TextColor; import net.kyori.adventure.text.format.TextDecoration; -import net.kyori.adventure.text.minimessage.parser.ParsingException; import net.kyori.adventure.text.minimessage.transformation.inbuild.CSSColorTransformation; import net.kyori.adventure.text.minimessage.transformation.inbuild.ClickTransformation; import net.kyori.adventure.text.minimessage.transformation.inbuild.ColorTransformation; @@ -190,58 +187,4 @@ public static Predicate acceptingNames(final Collection elements return names::contains; } } - - /** - * Create a new color transformation type for parsing the supplied color map. - * - * @param aliases map of color names to their {@link TextColor} values - * @return a new color transformation - * @since 4.10.0 - */ - public static TransformationType color(final Map aliases) { - return transformationType( - acceptingNames(aliases.keySet()), - (name, args) -> { - final TextColor color = aliases.get(name.toLowerCase(Locale.ROOT)); - if (color == null) { - throw new ParsingException("Expected to find a color name, but found " + name, args); - } - return new ColorTransformation(color); - } - ); - } - - /** - * Create a new color transformation type for parsing the supplied color map - * The identifier allows you to use an alias that is already present, such as 'gray', - * by specifying 'identifier:gray' in the tag to ensure your supplied color is used. - * - * @param identifier the alias identifier - * @param aliases map of color names to their {@link TextColor} values - * @return a new color transformation - * @since 4.10.0 - */ - public static TransformationType color(final String identifier, final Map aliases) { - final Set names = new HashSet<>(aliases.keySet()); - names.add(identifier); - return transformationType( - acceptingNames(names), - (name, args) -> { - final TextColor color; - if (name.equalsIgnoreCase(identifier)) { - if (args.size() == 1) { - color = aliases.get(args.get(0).value().toLowerCase(Locale.ROOT)); - } else { - throw new ParsingException("Expected to find a color name, but found " + args, args); - } - } else { - color = aliases.get(name.toLowerCase(Locale.ROOT)); - if (color == null) { - throw new ParsingException("Expected to find a color name, but found " + name, args); - } - } - return new ColorTransformation(color); - } - ); - } } diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/inbuild/ColorTransformation.java b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/inbuild/ColorTransformation.java index 782fedc9e..be1d25f1a 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/inbuild/ColorTransformation.java +++ b/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/inbuild/ColorTransformation.java @@ -24,10 +24,12 @@ package net.kyori.adventure.text.minimessage.transformation.inbuild; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.stream.Stream; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; @@ -35,6 +37,7 @@ import net.kyori.adventure.text.minimessage.parser.ParsingException; import net.kyori.adventure.text.minimessage.parser.node.TagPart; import net.kyori.adventure.text.minimessage.transformation.Transformation; +import net.kyori.adventure.text.minimessage.transformation.TransformationType; import net.kyori.examination.ExaminableProperty; import org.jetbrains.annotations.NotNull; @@ -113,12 +116,60 @@ public static ColorTransformation create(final String name, final List } /** - * Create a new color transformation. + * Create a new color transformation type for parsing the supplied color map. * - * @param color the color + * @param aliases map of color names to their {@link TextColor} values + * @return a new color transformation * @since 4.10.0 */ - public ColorTransformation(final TextColor color) { + public static TransformationType color(final Map aliases) { + return TransformationType.transformationType( + TransformationType.acceptingNames(aliases.keySet()), + (name, args) -> { + final TextColor color = aliases.get(name.toLowerCase(Locale.ROOT)); + if (color == null) { + throw new ParsingException("Expected to find a color name, but found " + name, args); + } + return new ColorTransformation(color); + } + ); + } + + /** + * Create a new color transformation type for parsing the supplied color map + * The identifier allows you to use an alias that is already present, such as 'gray', + * by specifying 'identifier:gray' in the tag to ensure your supplied color is used. + * + * @param identifier the alias identifier + * @param aliases map of color names to their {@link TextColor} values + * @return a new color transformation + * @since 4.10.0 + */ + public static TransformationType color(final String identifier, final Map aliases) { + final Set names = new HashSet<>(aliases.keySet()); + names.add(identifier); + return TransformationType.transformationType( + TransformationType.acceptingNames(names), + (name, args) -> { + final TextColor color; + if (name.equalsIgnoreCase(identifier)) { + if (args.size() == 1) { + color = aliases.get(args.get(0).value().toLowerCase(Locale.ROOT)); + } else { + throw new ParsingException("Expected to find a color name, but found " + args, args); + } + } else { + color = aliases.get(name.toLowerCase(Locale.ROOT)); + if (color == null) { + throw new ParsingException("Expected to find a color name, but found " + name, args); + } + } + return new ColorTransformation(color); + } + ); + } + + private ColorTransformation(final TextColor color) { this.color = color; } diff --git a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageParserTest.java b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageParserTest.java index e1f0b4e59..c871d0bce 100644 --- a/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageParserTest.java +++ b/text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/MiniMessageParserTest.java @@ -36,6 +36,7 @@ import net.kyori.adventure.text.minimessage.placeholder.Placeholder; import net.kyori.adventure.text.minimessage.placeholder.PlaceholderResolver; import net.kyori.adventure.text.minimessage.transformation.TransformationType; +import net.kyori.adventure.text.minimessage.transformation.inbuild.ColorTransformation; import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; import org.junit.jupiter.api.Test; @@ -1775,7 +1776,7 @@ public void testCustomColorTransformation() { assertEquals( expected, MiniMessage.builder().transformations(builder -> - builder.add(TransformationType.color(colorMap)) + builder.add(ColorTransformation.color(colorMap)) ).build().deserialize(input) ); } @@ -1792,7 +1793,7 @@ public void testCustomColorTransformationWithIdentifier() { assertEquals( expected, MiniMessage.builder().transformations(builder -> - builder.add(TransformationType.color("identifier", colorMap)).add(TransformationType.CSS_COLOR) + builder.add(ColorTransformation.color("identifier", colorMap)).add(TransformationType.CSS_COLOR) ).build().deserialize(input) ); } From 527114b2e9d784a0125410e682fae1bcceac1afd Mon Sep 17 00:00:00 2001 From: kevinbarnes Date: Mon, 14 Feb 2022 11:00:56 -0500 Subject: [PATCH 06/10] fetch upstream - modify css tag --- .checkstyle/checkstyle.xml | 5 +- .checkstyle/suppressions.xml | 8 +- .github/workflows/build.yml | 31 +- .../net/kyori/adventure/bossbar/BossBar.java | 10 +- .../kyori/adventure/bossbar/BossBarImpl.java | 4 +- .../adventure/identity/IdentityImpl.java | 4 +- .../kyori/adventure/internal/Internals.java | 49 +++ .../adventure/internal}/package-info.java | 5 +- .../properties/AdventureProperties.java | 97 +++++ .../properties/AdventurePropertiesImpl.java | 108 +++++ .../internal/properties}/package-info.java | 5 +- .../kyori/adventure/inventory/BookImpl.java | 4 +- .../adventure/nbt/api/BinaryTagHolder.java | 15 + .../kyori/adventure/pointer/PointerImpl.java | 4 +- .../net/kyori/adventure/sound/SoundImpl.java | 4 +- .../kyori/adventure/sound/SoundStopImpl.java | 4 +- .../adventure/text/AbstractComponent.java | 26 +- .../adventure/text/BlockNBTComponent.java | 76 +++- .../adventure/text/BlockNBTComponentImpl.java | 10 +- .../net/kyori/adventure/text/Component.java | 14 +- .../adventure/text/ComponentBuilder.java | 2 +- .../adventure/text/ComponentInternals.java | 13 +- .../adventure/text/EntityNBTComponent.java | 12 + .../text/EntityNBTComponentImpl.java | 12 +- .../adventure/text/JoinConfigurationImpl.java | 4 +- .../adventure/text/KeybindComponent.java | 12 + .../adventure/text/KeybindComponentImpl.java | 12 +- .../kyori/adventure/text/NBTComponent.java | 14 + .../adventure/text/NBTComponentImpl.java | 14 - .../kyori/adventure/text/ScoreComponent.java | 14 + .../adventure/text/ScoreComponentImpl.java | 14 +- .../adventure/text/SelectorComponent.java | 13 + .../adventure/text/SelectorComponentImpl.java | 13 +- .../adventure/text/StorageNBTComponent.java | 12 + .../text/StorageNBTComponentImpl.java | 12 +- .../kyori/adventure/text/TextComponent.java | 12 + .../adventure/text/TextComponentImpl.java | 15 +- .../text/TextReplacementConfigImpl.java | 4 +- .../adventure/text/TranslatableComponent.java | 13 + .../text/TranslatableComponentImpl.java | 12 +- .../adventure/text/event/ClickEvent.java | 4 +- .../adventure/text/event/HoverEvent.java | 8 +- .../adventure/text/format/NamedTextColor.java | 33 ++ .../kyori/adventure/text/format/Style.java | 26 +- .../adventure/text/format/StyleImpl.java | 9 +- .../adventure/text/format/TextColor.java | 2 +- .../format/TextDecorationAndStateImpl.java | 4 +- .../TranslatableComponentRenderer.java | 2 +- .../net/kyori/adventure/title/TitleImpl.java | 6 +- .../translation/GlobalTranslator.java | 14 + .../translation/TranslationLocales.java | 4 +- .../translation/TranslationRegistryImpl.java | 6 +- .../java/net/kyori/adventure/util/Codec.java | 30 ++ .../net/kyori/adventure/util/HSVLike.java | 17 + .../net/kyori/adventure/util/HSVLikeImpl.java | 4 +- .../java/net/kyori/adventure/util/Index.java | 20 + .../net/kyori/adventure/util/Services.java | 4 +- .../net/kyori/adventure/util/ShadyPines.java | 2 +- .../properties/AdventurePropertiesTest.java | 35 ++ .../adventure/text/AbstractComponentTest.java | 5 +- .../adventure/text/BlockNBTComponentTest.java | 26 +- .../adventure/text/TextComponentTest.java | 24 +- .../adventure/text/format/StyleTest.java | 43 +- .../translation/GlobalTranslatorTest.java | 20 +- .../net/kyori/adventure/util/HSVLikeTest.java | 12 +- .../java/net/kyori/test/WeirdAssertions.java | 10 - build-logic/build.gradle.kts | 10 +- build-logic/src/main/kotlin/CopyJavadoc.kt | 82 ---- .../adventure.base-conventions.gradle.kts | 3 +- .../adventure.common-conventions.gradle.kts | 100 +---- .../adventure.parent-build-logic.gradle.kts | 1 - build-logic/src/main/kotlin/extensions.kt | 2 +- gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 59821 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- .../net/kyori/adventure/key/KeyedValue.java | 17 + .../kyori/adventure/key/KeyedValueTest.java | 6 +- .../net/kyori/adventure/nbt/BinaryTagIO.java | 20 +- .../HoverEventShowItemSerializer.java | 2 +- .../HoverEventSerializersTest.java | 2 +- .../HoverEventShowItemSerializer.java | 2 +- .../HoverEventSerializersTest.java | 2 +- .../benchmark/MiniMessageBenchmark.java | 11 +- .../text/minimessage/ArgumentQueueImpl.java | 90 ++++ .../adventure/text/minimessage/Context.java | 47 +- .../text/minimessage/ContextImpl.java | 75 +++- .../text/minimessage/MiniMessage.java | 181 +++++--- .../text/minimessage/MiniMessageImpl.java | 98 ++--- .../text/minimessage/MiniMessageParser.java | 177 ++++---- .../minimessage/MiniMessageSerializer.java | 84 ++-- .../Modifying.java => ParsingException.java} | 38 +- ...ception.java => ParsingExceptionImpl.java} | 124 +----- .../text/minimessage/parser/Token.java | 22 +- .../text/minimessage/parser/TokenParser.java | 237 +++++----- .../StringResolvingMatchedTokenConsumer.java | 51 +-- .../parser/match/package-info.java | 1 + .../minimessage/parser/node/ElementNode.java | 22 +- .../minimessage/parser/node/RootNode.java | 4 +- .../text/minimessage/parser/node/TagNode.java | 40 +- .../text/minimessage/parser/node/TagPart.java | 31 +- .../minimessage/parser/node/package-info.java | 1 + .../text/minimessage/parser/package-info.java | 1 + .../placeholder/PlaceholderResolver.java | 161 ------- .../text/minimessage/tag/AbstractTag.java | 34 ++ .../CallbackStylingTagImpl.java} | 50 +-- .../Inserting.java} | 39 +- .../InsertingImpl.java} | 42 +- .../Replacement.java => tag/Modifying.java} | 47 +- .../text/minimessage/tag/ParserDirective.java | 50 +++ .../PreProcess.java} | 28 +- .../PreProcessTagImpl.java} | 29 +- .../text/minimessage/tag/StylingTagImpl.java | 64 +++ .../adventure/text/minimessage/tag/Tag.java | 220 ++++++++++ .../nonstandard/CSSColorTagResolver.java} | 95 ++--- .../nonstandard}/package-info.java | 12 +- .../text/minimessage/tag/package-info.java | 27 ++ .../tag/resolver/ArgumentQueue.java | 93 ++++ .../tag/resolver/CachingTagResolver.java | 71 +++ .../resolver/EmptyTagResolver.java} | 29 +- .../resolver/MapTagResolver.java} | 25 +- .../resolver/MappableResolver.java} | 29 +- .../resolver}/Placeholder.java | 58 ++- .../tag/resolver/SequentialTagResolver.java | 80 ++++ .../tag/resolver/SingleResolver.java | 83 ++++ .../minimessage/tag/resolver/TagResolver.java | 403 ++++++++++++++++++ .../tag/resolver/TagResolverBuilderImpl.java | 135 ++++++ .../resolver/package-info.java} | 7 +- .../minimessage/tag/standard/ClickTag.java | 56 +++ .../tag/standard/ColorTagResolver.java | 101 +++++ .../standard/DecorationTag.java} | 82 +--- .../minimessage/tag/standard/FontTag.java | 61 +++ .../standard/GradientTag.java} | 84 ++-- .../minimessage/tag/standard/HoverTag.java | 96 +++++ .../tag/standard/InsertionTag.java | 46 ++ .../minimessage/tag/standard/KeybindTag.java | 47 ++ .../standard/RainbowTag.java} | 76 ++-- .../tag/standard/StandardTags.java | 203 +++++++++ .../tag/standard/TranslatableTag.java | 62 +++ .../tag/standard/package-info.java | 31 ++ .../transformation/TransformationFactory.java | 72 ---- .../TransformationRegistry.java | 134 ------ .../TransformationRegistryImpl.java | 167 -------- .../transformation/TransformationType.java | 190 --------- .../inbuild/ClickTransformation.java | 101 ----- .../inbuild/ColorTransformation.java | 198 --------- .../inbuild/ComponentTransformation.java | 80 ---- .../inbuild/FontTransformation.java | 99 ----- .../inbuild/HoverTransformation.java | 155 ------- .../inbuild/InsertionTransformation.java | 88 ---- .../inbuild/KeybindTransformation.java | 88 ---- .../inbuild/TranslatableTransformation.java | 114 ----- .../adventure/text/minimessage/tree/Node.java | 66 +++ .../text/minimessage/tree/package-info.java | 31 ++ .../minimessage/MiniMessageParserTest.java | 153 ++++--- .../MiniMessageSerializerTest.java | 6 +- .../text/minimessage/MiniMessageTest.java | 100 +++-- .../adventure/text/minimessage/TestBase.java | 28 +- .../{ => tag}/PlaceholderTest.java | 6 +- .../text/minimessage/tag/TagResolverTest.java | 96 +++++ .../NBTLegacyHoverEventSerializerImpl.java | 2 +- .../ComponentDeserializationBenchmark.java | 2 +- .../gson/ComponentSerializationBenchmark.java | 2 +- .../serializer/gson/ShowItemSerializer.java | 4 +- .../gson/ShowItemSerializerTest.java | 2 +- .../plain/PlainComponentSerializer.java | 12 +- 164 files changed, 4227 insertions(+), 3293 deletions(-) create mode 100644 api/src/main/java/net/kyori/adventure/internal/Internals.java rename {text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation => api/src/main/java/net/kyori/adventure/internal}/package-info.java (90%) create mode 100644 api/src/main/java/net/kyori/adventure/internal/properties/AdventureProperties.java create mode 100644 api/src/main/java/net/kyori/adventure/internal/properties/AdventurePropertiesImpl.java rename {text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/placeholder => api/src/main/java/net/kyori/adventure/internal/properties}/package-info.java (90%) rename build-logic/src/main/kotlin/JavadocPackaging.kt => api/src/main/java/net/kyori/adventure/text/ComponentInternals.java (76%) create mode 100644 api/src/test/java/net/kyori/adventure/internal/properties/AdventurePropertiesTest.java delete mode 100644 build-logic/src/main/kotlin/CopyJavadoc.kt create mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/ArgumentQueueImpl.java rename text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/{transformation/Modifying.java => ParsingException.java} (59%) rename text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/parser/{ParsingException.java => ParsingExceptionImpl.java} (56%) delete mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/placeholder/PlaceholderResolver.java create mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/AbstractTag.java rename text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/{transformation/Transformation.java => tag/CallbackStylingTagImpl.java} (53%) rename text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/{parser/node/PlaceholderNode.java => tag/Inserting.java} (62%) rename text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/{placeholder/PlaceholderImpl.java => tag/InsertingImpl.java} (61%) rename text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/{placeholder/Replacement.java => tag/Modifying.java} (53%) create mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/ParserDirective.java rename text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/{placeholder/EmptyPlaceholderResolver.java => tag/PreProcess.java} (73%) rename text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/{placeholder/ReplacementImpl.java => tag/PreProcessTagImpl.java} (70%) create mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/StylingTagImpl.java create mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/Tag.java rename text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/{transformation/inbuild/CSSColorTransformation.java => tag/nonstandard/CSSColorTagResolver.java} (80%) rename text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/{transformation/inbuild => tag/nonstandard}/package-info.java (76%) create mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/package-info.java create mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/ArgumentQueue.java create mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/CachingTagResolver.java rename text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/{placeholder/GroupedPlaceholderResolver.java => tag/resolver/EmptyTagResolver.java} (66%) rename text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/{placeholder/DynamicPlaceholderResolver.java => tag/resolver/MapTagResolver.java} (69%) rename text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/{placeholder/MapPlaceholderResolver.java => tag/resolver/MappableResolver.java} (67%) rename text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/{placeholder => tag/resolver}/Placeholder.java (54%) create mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/SequentialTagResolver.java create mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/SingleResolver.java create mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/TagResolver.java create mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/resolver/TagResolverBuilderImpl.java rename text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/{transformation/Inserting.java => tag/resolver/package-info.java} (86%) create mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/ClickTag.java create mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/ColorTagResolver.java rename text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/{transformation/inbuild/DecorationTransformation.java => tag/standard/DecorationTag.java} (50%) create mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/FontTag.java rename text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/{transformation/inbuild/GradientTransformation.java => tag/standard/GradientTag.java} (72%) create mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/HoverTag.java create mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/InsertionTag.java create mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/KeybindTag.java rename text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/{transformation/inbuild/RainbowTransformation.java => tag/standard/RainbowTag.java} (70%) create mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/StandardTags.java create mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/TranslatableTag.java create mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tag/standard/package-info.java delete mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/TransformationFactory.java delete mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/TransformationRegistry.java delete mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/TransformationRegistryImpl.java delete mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/TransformationType.java delete mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/inbuild/ClickTransformation.java delete mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/inbuild/ColorTransformation.java delete mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/inbuild/ComponentTransformation.java delete mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/inbuild/FontTransformation.java delete mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/inbuild/HoverTransformation.java delete mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/inbuild/InsertionTransformation.java delete mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/inbuild/KeybindTransformation.java delete mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/inbuild/TranslatableTransformation.java create mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tree/Node.java create mode 100644 text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/tree/package-info.java rename text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/{ => tag}/PlaceholderTest.java (92%) create mode 100644 text-minimessage/src/test/java/net/kyori/adventure/text/minimessage/tag/TagResolverTest.java diff --git a/.checkstyle/checkstyle.xml b/.checkstyle/checkstyle.xml index 80d519f63..0f337f5fe 100644 --- a/.checkstyle/checkstyle.xml +++ b/.checkstyle/checkstyle.xml @@ -42,7 +42,7 @@ - + @@ -245,9 +245,6 @@ - - - diff --git a/.checkstyle/suppressions.xml b/.checkstyle/suppressions.xml index df0c57a6a..04ed5fffe 100644 --- a/.checkstyle/suppressions.xml +++ b/.checkstyle/suppressions.xml @@ -4,10 +4,10 @@ - - - - + + + + diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1d1c36c3f..7771daee9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,6 +1,17 @@ name: "build" -on: ["pull_request", "push"] +on: + push: + branches: "**" + tags-ignore: ["**"] + pull_request: + +concurrency: + group: "${{ github.workflow }}-${{ github.event.number || github.ref }}" + cancel-in-progress: true + +env: + RUNTIME_VERSION: 11 jobs: build: @@ -13,17 +24,21 @@ jobs: steps: - name: "checkout repository" uses: "actions/checkout@v2" - - name: "setup jdk 11" - uses: "actions/setup-java@v1" + - name: "setup jdk ${{ env.RUNTIME_VERSION }}" + uses: "actions/setup-java@v2" + with: + distribution: "temurin" + java-version: "${{ env.RUNTIME_VERSION }}" + - name: "run gradle build" + uses: "gradle/gradle-build-action@v2" with: - java-version: "11" - - name: "build" - run: "./gradlew build" + cache-read-only: "${{ !startsWith(github.ref, 'refs/heads/main/') || github.event_name == 'pull_request' }}" + arguments: "build" - name: "Archive test results" if: "${{ always() }}" uses: "actions/upload-artifact@v2" with: - name: "test-results" + name: "${{ runner.os }}-test-results" path: | build/reports/ */build/reports/ @@ -36,7 +51,7 @@ jobs: echo "STATUS=release" >> $GITHUB_ENV fi - name: "publish" - if: "${{ runner.os == 'Linux' && env.STATUS != 'release' && github.event_name == 'push' && github.ref == 'refs/heads/master' }}" + if: "${{ runner.os == 'Linux' && env.STATUS != 'release' && github.event_name == 'push' && startsWith(github.ref, 'refs/heads/main/') }}" run: "./gradlew publish" env: ORG_GRADLE_PROJECT_sonatypeUsername: "${{ secrets.SONATYPE_USERNAME }}" diff --git a/api/src/main/java/net/kyori/adventure/bossbar/BossBar.java b/api/src/main/java/net/kyori/adventure/bossbar/BossBar.java index f574fbe3a..f0e93b3eb 100644 --- a/api/src/main/java/net/kyori/adventure/bossbar/BossBar.java +++ b/api/src/main/java/net/kyori/adventure/bossbar/BossBar.java @@ -68,8 +68,8 @@ public interface BossBar extends Examinable { /** * The minimum value the progress can be. * - * @deprecated for removal since 4.2.0, use {@link #MIN_PROGRESS} * @since 4.0.0 + * @deprecated for removal since 4.2.0, use {@link #MIN_PROGRESS} */ @ApiStatus.ScheduledForRemoval(inVersion = "5.0.0") @Deprecated @@ -77,8 +77,8 @@ public interface BossBar extends Examinable { /** * The maximum value the progress can be. * - * @deprecated for removal since 4.2.0, use {@link #MAX_PROGRESS} * @since 4.0.0 + * @deprecated for removal since 4.2.0, use {@link #MAX_PROGRESS} */ @ApiStatus.ScheduledForRemoval(inVersion = "5.0.0") @Deprecated @@ -209,8 +209,8 @@ public interface BossBar extends Examinable { *

The progress is a value between 0 and 1.

* * @return the progress - * @deprecated for removal since 4.2.0, use {@link #progress()} * @since 4.0.0 + * @deprecated for removal since 4.2.0, use {@link #progress()} */ @ApiStatus.ScheduledForRemoval(inVersion = "5.0.0") @Deprecated @@ -226,8 +226,8 @@ default float percent() { * @param progress the progress * @return the bossbar * @throws IllegalArgumentException if progress is less than 0 or greater than 1 - * @deprecated for removal since 4.2.0, use {@link #progress(float)} * @since 4.0.0 + * @deprecated for removal since 4.2.0, use {@link #progress(float)} */ @ApiStatus.ScheduledForRemoval(inVersion = "5.0.0") @Contract("_ -> this") @@ -415,8 +415,8 @@ default void bossBarProgressChanged(final @NotNull BossBar bar, final float oldP * @param bar the bossbar * @param oldProgress the old progress * @param newProgress the new progress - * @deprecated for removal since 4.2.0, use {@link #bossBarProgressChanged(BossBar, float, float)} * @since 4.0.0 + * @deprecated for removal since 4.2.0, use {@link #bossBarProgressChanged(BossBar, float, float)} */ @ApiStatus.ScheduledForRemoval(inVersion = "5.0.0") @Deprecated diff --git a/api/src/main/java/net/kyori/adventure/bossbar/BossBarImpl.java b/api/src/main/java/net/kyori/adventure/bossbar/BossBarImpl.java index 29aabe87d..a6a4ee35c 100644 --- a/api/src/main/java/net/kyori/adventure/bossbar/BossBarImpl.java +++ b/api/src/main/java/net/kyori/adventure/bossbar/BossBarImpl.java @@ -33,9 +33,9 @@ import java.util.function.BiPredicate; import java.util.function.Consumer; import java.util.stream.Stream; +import net.kyori.adventure.internal.Internals; import net.kyori.adventure.text.Component; import net.kyori.examination.ExaminableProperty; -import net.kyori.examination.string.StringExaminer; import org.jetbrains.annotations.NotNull; import static java.util.Objects.requireNonNull; @@ -262,6 +262,6 @@ private void forEachListener(final @NotNull Consumer consumer) { @Override public String toString() { - return this.examine(StringExaminer.simpleEscaping()); + return Internals.toString(this); } } diff --git a/api/src/main/java/net/kyori/adventure/identity/IdentityImpl.java b/api/src/main/java/net/kyori/adventure/identity/IdentityImpl.java index f2cdd3589..0583f6f41 100644 --- a/api/src/main/java/net/kyori/adventure/identity/IdentityImpl.java +++ b/api/src/main/java/net/kyori/adventure/identity/IdentityImpl.java @@ -24,8 +24,8 @@ package net.kyori.adventure.identity; import java.util.UUID; +import net.kyori.adventure.internal.Internals; import net.kyori.examination.Examinable; -import net.kyori.examination.string.StringExaminer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -43,7 +43,7 @@ final class IdentityImpl implements Examinable, Identity { @Override public String toString() { - return this.examine(StringExaminer.simpleEscaping()); + return Internals.toString(this); } @Override diff --git a/api/src/main/java/net/kyori/adventure/internal/Internals.java b/api/src/main/java/net/kyori/adventure/internal/Internals.java new file mode 100644 index 000000000..5e0538609 --- /dev/null +++ b/api/src/main/java/net/kyori/adventure/internal/Internals.java @@ -0,0 +1,49 @@ +/* + * This file is part of adventure, licensed under the MIT License. + * + * Copyright (c) 2017-2022 KyoriPowered + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package net.kyori.adventure.internal; + +import net.kyori.examination.Examinable; +import net.kyori.examination.string.StringExaminer; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + +/** + * Utilities internal to Adventure. + */ +@ApiStatus.Internal +public final class Internals { + private Internals() { + } + + /** + * Examines an {@link Examinable} using the {@link StringExaminer}. + * + * @param examinable the examinable + * @return the result from examining + * @since 4.10.0 + */ + public static @NotNull String toString(final @NotNull Examinable examinable) { + return examinable.examine(StringExaminer.simpleEscaping()); + } +} diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/package-info.java b/api/src/main/java/net/kyori/adventure/internal/package-info.java similarity index 90% rename from text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/package-info.java rename to api/src/main/java/net/kyori/adventure/internal/package-info.java index 638412d20..87191ad77 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/transformation/package-info.java +++ b/api/src/main/java/net/kyori/adventure/internal/package-info.java @@ -22,6 +22,7 @@ * SOFTWARE. */ /** - * Transformations. + * Internal things, not for public use. */ -package net.kyori.adventure.text.minimessage.transformation; +@org.jetbrains.annotations.ApiStatus.Internal +package net.kyori.adventure.internal; diff --git a/api/src/main/java/net/kyori/adventure/internal/properties/AdventureProperties.java b/api/src/main/java/net/kyori/adventure/internal/properties/AdventureProperties.java new file mode 100644 index 000000000..3be704bd2 --- /dev/null +++ b/api/src/main/java/net/kyori/adventure/internal/properties/AdventureProperties.java @@ -0,0 +1,97 @@ +/* + * This file is part of adventure, licensed under the MIT License. + * + * Copyright (c) 2017-2022 KyoriPowered + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package net.kyori.adventure.internal.properties; + +import java.util.function.Function; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * Adventure properties. + * + * @since 4.10.0 + */ +@ApiStatus.Internal +public final class AdventureProperties { + /** + * Property for specifying whether debug mode is enabled. + * + * @since 4.10.0 + */ + public static final Property DEBUG = property("debug", Boolean::parseBoolean, false); + /** + * Property for specifying the default translation locale. + * + * @since 4.10.0 + */ + public static final Property DEFAULT_TRANSLATION_LOCALE = property("defaultTranslationLocale", Function.identity(), null); + /** + * Property for specifying whether service load failures are fatal. + * + * @since 4.10.0 + */ + public static final Property SERVICE_LOAD_FAILURES_ARE_FATAL = property("serviceLoadFailuresAreFatal", Boolean::parseBoolean, Boolean.TRUE); + /** + * Property for specifying whether to warn when legacy formatting is detected. + * + * @since 4.10.0 + */ + public static final Property TEXT_WARN_WHEN_LEGACY_FORMATTING_DETECTED = property("text.warnWhenLegacyFormattingDetected", Boolean::parseBoolean, Boolean.FALSE); + + private AdventureProperties() { + } + + /** + * Creates a new property. + * + * @param name the property name + * @param parser the value parser + * @param defaultValue the default value + * @param the value type + * @return a property + * @since 4.10.0 + */ + public static @NotNull Property property(final @NotNull String name, final @NotNull Function parser, final @Nullable T defaultValue) { + return AdventurePropertiesImpl.property(name, parser, defaultValue); + } + + /** + * A property. + * + * @param the value type + * @since 4.10.0 + */ + @ApiStatus.Internal + @ApiStatus.NonExtendable + public interface Property { + /** + * Gets the value. + * + * @return the value + * @since 4.10.0 + */ + @Nullable T value(); + } +} diff --git a/api/src/main/java/net/kyori/adventure/internal/properties/AdventurePropertiesImpl.java b/api/src/main/java/net/kyori/adventure/internal/properties/AdventurePropertiesImpl.java new file mode 100644 index 000000000..b6b5c1210 --- /dev/null +++ b/api/src/main/java/net/kyori/adventure/internal/properties/AdventurePropertiesImpl.java @@ -0,0 +1,108 @@ +/* + * This file is part of adventure, licensed under the MIT License. + * + * Copyright (c) 2017-2022 KyoriPowered + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package net.kyori.adventure.internal.properties; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Optional; +import java.util.Properties; +import java.util.function.Function; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.VisibleForTesting; + +final class AdventurePropertiesImpl { + private static final String FILESYSTEM_DIRECTORY_NAME = "config"; + private static final String FILESYSTEM_FILE_NAME = "adventure.properties"; + private static final Properties PROPERTIES = new Properties(); + + static { + final Path path = Optional.ofNullable(System.getProperty(systemPropertyName("config"))) + .map(Paths::get) + .orElseGet(() -> Paths.get(FILESYSTEM_DIRECTORY_NAME, FILESYSTEM_FILE_NAME)); + if (Files.isRegularFile(path)) { + try (final InputStream is = Files.newInputStream(path)) { + PROPERTIES.load(is); + } catch (final IOException e) { + // Well, that's awkward. + e.printStackTrace(); + } + } + } + + private AdventurePropertiesImpl() { + } + + @VisibleForTesting + static @NotNull String systemPropertyName(final String name) { + return String.join(".", "net", "kyori", "adventure", name); + } + + static AdventureProperties.@NotNull Property property(final @NotNull String name, final @NotNull Function parser, final @Nullable T defaultValue) { + return new PropertyImpl<>(name, parser, defaultValue); + } + + private static final class PropertyImpl implements AdventureProperties.Property { + private final String name; + private final Function parser; + private final @Nullable T defaultValue; + private boolean valueCalculated; + private @Nullable T value; + + PropertyImpl(final @NotNull String name, final @NotNull Function parser, final @Nullable T defaultValue) { + this.name = name; + this.parser = parser; + this.defaultValue = defaultValue; + } + + @Override + public @Nullable T value() { + if (!this.valueCalculated) { + final String property = systemPropertyName(this.name); + final String value = System.getProperty(property, PROPERTIES.getProperty(this.name)); + if (value != null) { + this.value = this.parser.apply(value); + } + if (this.value == null) { + this.value = this.defaultValue; + } + this.valueCalculated = true; + } + return this.value; + } + + @Override + public boolean equals(final @Nullable Object that) { + return this == that; + } + + @Override + public int hashCode() { + return this.name.hashCode(); + } + } +} diff --git a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/placeholder/package-info.java b/api/src/main/java/net/kyori/adventure/internal/properties/package-info.java similarity index 90% rename from text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/placeholder/package-info.java rename to api/src/main/java/net/kyori/adventure/internal/properties/package-info.java index 950c19674..22f4308c4 100644 --- a/text-minimessage/src/main/java/net/kyori/adventure/text/minimessage/placeholder/package-info.java +++ b/api/src/main/java/net/kyori/adventure/internal/properties/package-info.java @@ -22,6 +22,7 @@ * SOFTWARE. */ /** - * Placeholders. + * Internal properties. */ -package net.kyori.adventure.text.minimessage.placeholder; +@org.jetbrains.annotations.ApiStatus.Internal +package net.kyori.adventure.internal.properties; diff --git a/api/src/main/java/net/kyori/adventure/inventory/BookImpl.java b/api/src/main/java/net/kyori/adventure/inventory/BookImpl.java index e5d8b1e7a..2a42821da 100644 --- a/api/src/main/java/net/kyori/adventure/inventory/BookImpl.java +++ b/api/src/main/java/net/kyori/adventure/inventory/BookImpl.java @@ -28,9 +28,9 @@ import java.util.Collections; import java.util.List; import java.util.stream.Stream; +import net.kyori.adventure.internal.Internals; import net.kyori.adventure.text.Component; import net.kyori.examination.ExaminableProperty; -import net.kyori.examination.string.StringExaminer; import org.jetbrains.annotations.NotNull; import static java.util.Objects.requireNonNull; @@ -105,7 +105,7 @@ public int hashCode() { @Override public String toString() { - return this.examine(StringExaminer.simpleEscaping()); + return Internals.toString(this); } static final class BuilderImpl implements Book.Builder { diff --git a/api/src/main/java/net/kyori/adventure/nbt/api/BinaryTagHolder.java b/api/src/main/java/net/kyori/adventure/nbt/api/BinaryTagHolder.java index 4bdf67284..f0ab06b36 100644 --- a/api/src/main/java/net/kyori/adventure/nbt/api/BinaryTagHolder.java +++ b/api/src/main/java/net/kyori/adventure/nbt/api/BinaryTagHolder.java @@ -24,6 +24,7 @@ package net.kyori.adventure.nbt.api; import net.kyori.adventure.util.Codec; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; /** @@ -52,13 +53,27 @@ public interface BinaryTagHolder { return new BinaryTagHolderImpl(codec.encode(nbt)); } + /** + * Creates an encoded binary tag holder. + * + * @param string the encoded binary tag value + * @return the encoded binary tag + * @since 4.10.0 + */ + static @NotNull BinaryTagHolder binaryTagHolder(final @NotNull String string) { + return new BinaryTagHolderImpl(string); + } + /** * Creates an encoded binary tag holder. * * @param string the encoded binary tag value * @return the encoded binary tag * @since 4.0.0 + * @deprecated for removal since 4.10.0, use {@link #binaryTagHolder(String)} instead. */ + @Deprecated + @ApiStatus.ScheduledForRemoval(inVersion = "5.0.0") static @NotNull BinaryTagHolder of(final @NotNull String string) { return new BinaryTagHolderImpl(string); } diff --git a/api/src/main/java/net/kyori/adventure/pointer/PointerImpl.java b/api/src/main/java/net/kyori/adventure/pointer/PointerImpl.java index 0c3f10463..234671ba2 100644 --- a/api/src/main/java/net/kyori/adventure/pointer/PointerImpl.java +++ b/api/src/main/java/net/kyori/adventure/pointer/PointerImpl.java @@ -23,8 +23,8 @@ */ package net.kyori.adventure.pointer; +import net.kyori.adventure.internal.Internals; import net.kyori.adventure.key.Key; -import net.kyori.examination.string.StringExaminer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -49,7 +49,7 @@ final class PointerImpl implements Pointer { @Override public String toString() { - return this.examine(StringExaminer.simpleEscaping()); + return Internals.toString(this); } @Override diff --git a/api/src/main/java/net/kyori/adventure/sound/SoundImpl.java b/api/src/main/java/net/kyori/adventure/sound/SoundImpl.java index a9f35d9eb..2429ee716 100644 --- a/api/src/main/java/net/kyori/adventure/sound/SoundImpl.java +++ b/api/src/main/java/net/kyori/adventure/sound/SoundImpl.java @@ -24,9 +24,9 @@ package net.kyori.adventure.sound; import java.util.stream.Stream; +import net.kyori.adventure.internal.Internals; import net.kyori.adventure.util.ShadyPines; import net.kyori.examination.ExaminableProperty; -import net.kyori.examination.string.StringExaminer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -102,6 +102,6 @@ public int hashCode() { @Override public String toString() { - return this.examine(StringExaminer.simpleEscaping()); + return Internals.toString(this); } } diff --git a/api/src/main/java/net/kyori/adventure/sound/SoundStopImpl.java b/api/src/main/java/net/kyori/adventure/sound/SoundStopImpl.java index d6ffada4e..12105ea3a 100644 --- a/api/src/main/java/net/kyori/adventure/sound/SoundStopImpl.java +++ b/api/src/main/java/net/kyori/adventure/sound/SoundStopImpl.java @@ -25,9 +25,9 @@ import java.util.Objects; import java.util.stream.Stream; +import net.kyori.adventure.internal.Internals; import net.kyori.adventure.key.Key; import net.kyori.examination.ExaminableProperty; -import net.kyori.examination.string.StringExaminer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -75,6 +75,6 @@ public int hashCode() { @Override public String toString() { - return this.examine(StringExaminer.simpleEscaping()); + return Internals.toString(this); } } diff --git a/api/src/main/java/net/kyori/adventure/text/AbstractComponent.java b/api/src/main/java/net/kyori/adventure/text/AbstractComponent.java index 995e5b353..e7f380b82 100644 --- a/api/src/main/java/net/kyori/adventure/text/AbstractComponent.java +++ b/api/src/main/java/net/kyori/adventure/text/AbstractComponent.java @@ -78,27 +78,13 @@ public int hashCode() { return result; } - @SuppressWarnings("unused") - private String debuggerString() { - return StringExaminer.simpleEscaping().examine(this.examinableName(), this.examinablePropertiesWithoutChildren()); - } - - protected Stream examinablePropertiesWithoutChildren() { - return Stream.of(ExaminableProperty.of("style", this.style)); - } - @Override - public @NotNull Stream examinableProperties() { - return Stream.concat( - this.examinablePropertiesWithoutChildren(), - Stream.of( - ExaminableProperty.of("children", this.children) - ) - ); - } + public abstract String toString(); - @Override - public String toString() { - return this.examine(StringExaminer.simpleEscaping()); + @SuppressWarnings("unused") + private String debuggerString() { + final Stream examinablePropertiesWithoutChildren = this.examinableProperties() + .filter(property -> !property.name().equals(ComponentInternals.CHILDREN_PROPERTY)); + return StringExaminer.simpleEscaping().examine(this.examinableName(), examinablePropertiesWithoutChildren); } } diff --git a/api/src/main/java/net/kyori/adventure/text/BlockNBTComponent.java b/api/src/main/java/net/kyori/adventure/text/BlockNBTComponent.java index 50f953121..75ba64189 100644 --- a/api/src/main/java/net/kyori/adventure/text/BlockNBTComponent.java +++ b/api/src/main/java/net/kyori/adventure/text/BlockNBTComponent.java @@ -24,7 +24,10 @@ package net.kyori.adventure.text; import java.util.regex.Matcher; +import java.util.stream.Stream; import net.kyori.examination.Examinable; +import net.kyori.examination.ExaminableProperty; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; @@ -73,7 +76,7 @@ public interface BlockNBTComponent extends NBTComponent examinableProperties() { + return Stream.concat( + Stream.of( + ExaminableProperty.of("pos", this.pos()) + ), + NBTComponent.super.examinableProperties() + ); + } + /** * An NBT component builder. * @@ -145,7 +158,7 @@ interface Builder extends NBTComponentBuilder { */ @Contract("_, _, _ -> this") default @NotNull Builder localPos(final double left, final double up, final double forwards) { - return this.pos(LocalPos.of(left, up, forwards)); + return this.pos(LocalPos.localPos(left, up, forwards)); } /** @@ -159,7 +172,7 @@ interface Builder extends NBTComponentBuilder { */ @Contract("_, _, _ -> this") default @NotNull Builder worldPos(final WorldPos.@NotNull Coordinate x, final WorldPos.@NotNull Coordinate y, final WorldPos.@NotNull Coordinate z) { - return this.pos(WorldPos.of(x, y, z)); + return this.pos(WorldPos.worldPos(x, y, z)); } /** @@ -212,7 +225,7 @@ interface Pos extends Examinable { static @NotNull Pos fromString(final @NotNull String input) throws IllegalArgumentException { final Matcher localMatch = BlockNBTComponentImpl.Tokens.LOCAL_PATTERN.matcher(input); if (localMatch.matches()) { - return BlockNBTComponent.LocalPos.of( + return BlockNBTComponent.LocalPos.localPos( Double.parseDouble(localMatch.group(1)), Double.parseDouble(localMatch.group(3)), Double.parseDouble(localMatch.group(5)) @@ -221,7 +234,7 @@ interface Pos extends Examinable { final Matcher worldMatch = BlockNBTComponentImpl.Tokens.WORLD_PATTERN.matcher(input); if (worldMatch.matches()) { - return BlockNBTComponent.WorldPos.of( + return BlockNBTComponent.WorldPos.worldPos( BlockNBTComponentImpl.Tokens.deserializeCoordinate(worldMatch.group(1), worldMatch.group(2)), BlockNBTComponentImpl.Tokens.deserializeCoordinate(worldMatch.group(3), worldMatch.group(4)), BlockNBTComponentImpl.Tokens.deserializeCoordinate(worldMatch.group(5), worldMatch.group(6)) @@ -247,6 +260,19 @@ interface Pos extends Examinable { * @since 4.0.0 */ interface LocalPos extends Pos { + /** + * Creates a local position with the given values. + * + * @param left the left value + * @param up the up value + * @param forwards the forwards value + * @return a local position + * @since 4.10.0 + */ + static @NotNull LocalPos localPos(final double left, final double up, final double forwards) { + return new BlockNBTComponentImpl.LocalPosImpl(left, up, forwards); + } + /** * Creates a local position with the given values. * @@ -255,7 +281,10 @@ interface LocalPos extends Pos { * @param forwards the forwards value * @return a local position * @since 4.0.0 + * @deprecated for removal since 4.10.0, use {@link #localPos(double, double, double)} instead. */ + @Deprecated + @ApiStatus.ScheduledForRemoval(inVersion = "5.0.0") static @NotNull LocalPos of(final double left, final double up, final double forwards) { return new BlockNBTComponentImpl.LocalPosImpl(left, up, forwards); } @@ -291,6 +320,19 @@ interface LocalPos extends Pos { * @since 4.0.0 */ interface WorldPos extends Pos { + /** + * Creates a world position with the given coordinates. + * + * @param x the x coordinate + * @param y the y coordinate + * @param z the z coordinate + * @return a world position + * @since 4.10.0 + */ + static @NotNull WorldPos worldPos(final @NotNull Coordinate x, final @NotNull Coordinate y, final @NotNull Coordinate z) { + return new BlockNBTComponentImpl.WorldPosImpl(x, y, z); + } + /** * Creates a world position with the given coordinates. * @@ -299,7 +341,10 @@ interface WorldPos extends Pos { * @param z the z coordinate * @return a world position * @since 4.0.0 + * @deprecated for removal since 4.10.0, use {@link #worldPos(WorldPos.Coordinate, WorldPos.Coordinate, WorldPos.Coordinate)} instead. */ + @Deprecated + @ApiStatus.ScheduledForRemoval(inVersion = "5.0.0") static @NotNull WorldPos of(final @NotNull Coordinate x, final @NotNull Coordinate y, final @NotNull Coordinate z) { return new BlockNBTComponentImpl.WorldPosImpl(x, y, z); } @@ -342,7 +387,7 @@ interface Coordinate extends Examinable { * @since 4.0.0 */ static @NotNull Coordinate absolute(final int value) { - return of(value, Type.ABSOLUTE); + return coordinate(value, Type.ABSOLUTE); } /** @@ -353,7 +398,19 @@ interface Coordinate extends Examinable { * @since 4.0.0 */ static @NotNull Coordinate relative(final int value) { - return of(value, Type.RELATIVE); + return coordinate(value, Type.RELATIVE); + } + + /** + * Creates a coordinate with the given value and type. + * + * @param value the value + * @param type the type + * @return a coordinate + * @since 4.10.0 + */ + static @NotNull Coordinate coordinate(final int value, final @NotNull Type type) { + return new BlockNBTComponentImpl.WorldPosImpl.CoordinateImpl(value, type); } /** @@ -363,7 +420,10 @@ interface Coordinate extends Examinable { * @param type the type * @return a coordinate * @since 4.0.0 + * @deprecated for removal since 4.10.0, use {@link #coordinate(int, Coordinate.Type)} instead. */ + @Deprecated + @ApiStatus.ScheduledForRemoval(inVersion = "5.0.0") static @NotNull Coordinate of(final int value, final @NotNull Type type) { return new BlockNBTComponentImpl.WorldPosImpl.CoordinateImpl(value, type); } diff --git a/api/src/main/java/net/kyori/adventure/text/BlockNBTComponentImpl.java b/api/src/main/java/net/kyori/adventure/text/BlockNBTComponentImpl.java index f6db7d0b9..38749d531 100644 --- a/api/src/main/java/net/kyori/adventure/text/BlockNBTComponentImpl.java +++ b/api/src/main/java/net/kyori/adventure/text/BlockNBTComponentImpl.java @@ -27,6 +27,7 @@ import java.util.Objects; import java.util.regex.Pattern; import java.util.stream.Stream; +import net.kyori.adventure.internal.Internals; import net.kyori.adventure.text.format.Style; import net.kyori.adventure.util.ShadyPines; import net.kyori.examination.ExaminableProperty; @@ -102,13 +103,8 @@ public int hashCode() { } @Override - protected @NotNull Stream examinablePropertiesWithoutChildren() { - return Stream.concat( - Stream.of( - ExaminableProperty.of("pos", this.pos) - ), - super.examinablePropertiesWithoutChildren() - ); + public String toString() { + return Internals.toString(this); } @Override diff --git a/api/src/main/java/net/kyori/adventure/text/Component.java b/api/src/main/java/net/kyori/adventure/text/Component.java index 436bd6ad4..4d4c777c1 100644 --- a/api/src/main/java/net/kyori/adventure/text/Component.java +++ b/api/src/main/java/net/kyori/adventure/text/Component.java @@ -39,6 +39,7 @@ import java.util.function.UnaryOperator; import java.util.regex.Pattern; import java.util.stream.Collector; +import java.util.stream.Stream; import net.kyori.adventure.key.Key; import net.kyori.adventure.text.event.ClickEvent; import net.kyori.adventure.text.event.HoverEvent; @@ -55,6 +56,7 @@ import net.kyori.adventure.util.IntFunction2; import net.kyori.adventure.util.MonkeyBars; import net.kyori.examination.Examinable; +import net.kyori.examination.ExaminableProperty; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; @@ -1679,8 +1681,8 @@ default boolean contains(final @NotNull Component that, final @NotNull BiPredica * Prevents a cycle between this component and the provided component. * * @param that the other component - * @deprecated for removal since 4.7.0, with no replacement - this method is not necessary due to the fact {@code Component}s are immutable * @since 4.0.0 + * @deprecated for removal since 4.7.0, with no replacement - this method is not necessary due to the fact {@code Component}s are immutable */ @ApiStatus.ScheduledForRemoval(inVersion = "5.0.0") @Deprecated @@ -1807,7 +1809,7 @@ default void detectCycle(final @NotNull Component that) { */ @Contract(pure = true) default @NotNull Component mergeStyle(final @NotNull Component that, final Style.@NotNull Merge@NotNull... merges) { - return this.mergeStyle(that, Style.Merge.of(merges)); + return this.mergeStyle(that, Style.Merge.merges(merges)); } /** @@ -2336,4 +2338,12 @@ default void componentBuilderApply(final @NotNull ComponentBuilder compone default @NotNull HoverEvent asHoverEvent(final @NotNull UnaryOperator op) { return HoverEvent.showText(op.apply(this)); } + + @Override + default @NotNull Stream examinableProperties() { + return Stream.of( + ExaminableProperty.of("style", this.style()), + ExaminableProperty.of(ComponentInternals.CHILDREN_PROPERTY, this.children()) + ); + } } diff --git a/api/src/main/java/net/kyori/adventure/text/ComponentBuilder.java b/api/src/main/java/net/kyori/adventure/text/ComponentBuilder.java index ca3bd32f1..e4a795376 100644 --- a/api/src/main/java/net/kyori/adventure/text/ComponentBuilder.java +++ b/api/src/main/java/net/kyori/adventure/text/ComponentBuilder.java @@ -362,7 +362,7 @@ public interface ComponentBuilder, B extends */ @Contract("_, _ -> this") default @NotNull B mergeStyle(final @NotNull Component that, final Style.@NotNull Merge@NotNull... merges) { - return this.mergeStyle(that, Style.Merge.of(merges)); + return this.mergeStyle(that, Style.Merge.merges(merges)); } /** diff --git a/build-logic/src/main/kotlin/JavadocPackaging.kt b/api/src/main/java/net/kyori/adventure/text/ComponentInternals.java similarity index 76% rename from build-logic/src/main/kotlin/JavadocPackaging.kt rename to api/src/main/java/net/kyori/adventure/text/ComponentInternals.java index 2cbf6c591..467ff7775 100644 --- a/build-logic/src/main/kotlin/JavadocPackaging.kt +++ b/api/src/main/java/net/kyori/adventure/text/ComponentInternals.java @@ -1,7 +1,7 @@ /* * This file is part of adventure, licensed under the MIT License. * - * Copyright (c) 2017-2021 KyoriPowered + * Copyright (c) 2017-2022 KyoriPowered * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -21,14 +21,11 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -import org.gradle.api.Named -import org.gradle.api.attributes.Attribute +package net.kyori.adventure.text; -interface JavadocPackaging : Named { - companion object { - val ATTRIBUTE: Attribute = Attribute.of("net.kyori.javadoc.packaging", JavadocPackaging::class.java) +final class ComponentInternals { + static final String CHILDREN_PROPERTY = "children"; - const val ARCHIVE = "archive" - const val DIRECTORY = "directory" + private ComponentInternals() { } } diff --git a/api/src/main/java/net/kyori/adventure/text/EntityNBTComponent.java b/api/src/main/java/net/kyori/adventure/text/EntityNBTComponent.java index 4ba069f4a..40192dc96 100644 --- a/api/src/main/java/net/kyori/adventure/text/EntityNBTComponent.java +++ b/api/src/main/java/net/kyori/adventure/text/EntityNBTComponent.java @@ -23,6 +23,8 @@ */ package net.kyori.adventure.text; +import java.util.stream.Stream; +import net.kyori.examination.ExaminableProperty; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; @@ -60,6 +62,16 @@ public interface EntityNBTComponent extends NBTComponent examinableProperties() { + return Stream.concat( + Stream.of( + ExaminableProperty.of("selector", this.selector()) + ), + NBTComponent.super.examinableProperties() + ); + } + /** * An entity NBT component builder. * diff --git a/api/src/main/java/net/kyori/adventure/text/EntityNBTComponentImpl.java b/api/src/main/java/net/kyori/adventure/text/EntityNBTComponentImpl.java index ceee2babd..4d3de4850 100644 --- a/api/src/main/java/net/kyori/adventure/text/EntityNBTComponentImpl.java +++ b/api/src/main/java/net/kyori/adventure/text/EntityNBTComponentImpl.java @@ -25,9 +25,8 @@ import java.util.List; import java.util.Objects; -import java.util.stream.Stream; +import net.kyori.adventure.internal.Internals; import net.kyori.adventure.text.format.Style; -import net.kyori.examination.ExaminableProperty; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -101,13 +100,8 @@ public int hashCode() { } @Override - protected @NotNull Stream examinablePropertiesWithoutChildren() { - return Stream.concat( - Stream.of( - ExaminableProperty.of("selector", this.selector) - ), - super.examinablePropertiesWithoutChildren() - ); + public String toString() { + return Internals.toString(this); } @Override diff --git a/api/src/main/java/net/kyori/adventure/text/JoinConfigurationImpl.java b/api/src/main/java/net/kyori/adventure/text/JoinConfigurationImpl.java index 494d69c30..a39575f3f 100644 --- a/api/src/main/java/net/kyori/adventure/text/JoinConfigurationImpl.java +++ b/api/src/main/java/net/kyori/adventure/text/JoinConfigurationImpl.java @@ -28,8 +28,8 @@ import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Stream; +import net.kyori.adventure.internal.Internals; import net.kyori.examination.ExaminableProperty; -import net.kyori.examination.string.StringExaminer; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -131,7 +131,7 @@ private JoinConfigurationImpl(final @NotNull BuilderImpl builder) { @Override public String toString() { - return this.examine(StringExaminer.simpleEscaping()); + return Internals.toString(this); } @Contract(pure = true) diff --git a/api/src/main/java/net/kyori/adventure/text/KeybindComponent.java b/api/src/main/java/net/kyori/adventure/text/KeybindComponent.java index a0a581b59..856594d54 100644 --- a/api/src/main/java/net/kyori/adventure/text/KeybindComponent.java +++ b/api/src/main/java/net/kyori/adventure/text/KeybindComponent.java @@ -24,6 +24,8 @@ package net.kyori.adventure.text; import java.util.Objects; +import java.util.stream.Stream; +import net.kyori.examination.ExaminableProperty; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; @@ -70,6 +72,16 @@ public interface KeybindComponent extends BuildableComponent examinableProperties() { + return Stream.concat( + Stream.of( + ExaminableProperty.of("keybind", this.keybind()) + ), + BuildableComponent.super.examinableProperties() + ); + } + /** * Something that can provide a keybind identifier. * diff --git a/api/src/main/java/net/kyori/adventure/text/KeybindComponentImpl.java b/api/src/main/java/net/kyori/adventure/text/KeybindComponentImpl.java index ee12dee25..ceeec2b5c 100644 --- a/api/src/main/java/net/kyori/adventure/text/KeybindComponentImpl.java +++ b/api/src/main/java/net/kyori/adventure/text/KeybindComponentImpl.java @@ -25,9 +25,8 @@ import java.util.List; import java.util.Objects; -import java.util.stream.Stream; +import net.kyori.adventure.internal.Internals; import net.kyori.adventure.text.format.Style; -import net.kyori.examination.ExaminableProperty; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -79,13 +78,8 @@ public int hashCode() { } @Override - protected @NotNull Stream examinablePropertiesWithoutChildren() { - return Stream.concat( - Stream.of( - ExaminableProperty.of("keybind", this.keybind) - ), - super.examinablePropertiesWithoutChildren() - ); + public String toString() { + return Internals.toString(this); } @Override diff --git a/api/src/main/java/net/kyori/adventure/text/NBTComponent.java b/api/src/main/java/net/kyori/adventure/text/NBTComponent.java index ed3144ee8..59c756b9a 100644 --- a/api/src/main/java/net/kyori/adventure/text/NBTComponent.java +++ b/api/src/main/java/net/kyori/adventure/text/NBTComponent.java @@ -23,6 +23,8 @@ */ package net.kyori.adventure.text; +import java.util.stream.Stream; +import net.kyori.examination.ExaminableProperty; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -102,4 +104,16 @@ public interface NBTComponent, B extends NBTCompone * @since 4.8.0 */ @NotNull C separator(final @Nullable ComponentLike separator); + + @Override + default @NotNull Stream examinableProperties() { + return Stream.concat( + Stream.of( + ExaminableProperty.of("nbtPath", this.nbtPath()), + ExaminableProperty.of("interpret", this.interpret()), + ExaminableProperty.of("separator", this.separator()) + ), + BuildableComponent.super.examinableProperties() + ); + } } diff --git a/api/src/main/java/net/kyori/adventure/text/NBTComponentImpl.java b/api/src/main/java/net/kyori/adventure/text/NBTComponentImpl.java index d6ca69b6c..64631aada 100644 --- a/api/src/main/java/net/kyori/adventure/text/NBTComponentImpl.java +++ b/api/src/main/java/net/kyori/adventure/text/NBTComponentImpl.java @@ -25,9 +25,7 @@ import java.util.List; import java.util.Objects; -import java.util.stream.Stream; import net.kyori.adventure.text.format.Style; -import net.kyori.examination.ExaminableProperty; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -74,18 +72,6 @@ public int hashCode() { return result; } - @Override - protected @NotNull Stream examinablePropertiesWithoutChildren() { - return Stream.concat( - Stream.of( - ExaminableProperty.of("nbtPath", this.nbtPath), - ExaminableProperty.of("interpret", this.interpret), - ExaminableProperty.of("separator", this.separator) - ), - super.examinablePropertiesWithoutChildren() - ); - } - static abstract class BuilderImpl, B extends NBTComponentBuilder> extends AbstractComponentBuilder implements NBTComponentBuilder { protected @Nullable String nbtPath; protected boolean interpret = INTERPRET_DEFAULT; diff --git a/api/src/main/java/net/kyori/adventure/text/ScoreComponent.java b/api/src/main/java/net/kyori/adventure/text/ScoreComponent.java index 82b20eee6..efdd8afd4 100644 --- a/api/src/main/java/net/kyori/adventure/text/ScoreComponent.java +++ b/api/src/main/java/net/kyori/adventure/text/ScoreComponent.java @@ -23,6 +23,8 @@ */ package net.kyori.adventure.text; +import java.util.stream.Stream; +import net.kyori.examination.ExaminableProperty; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -108,6 +110,18 @@ public interface ScoreComponent extends BuildableComponent examinableProperties() { + return Stream.concat( + Stream.of( + ExaminableProperty.of("name", this.name()), + ExaminableProperty.of("objective", this.objective()), + ExaminableProperty.of("value", this.value()) + ), + BuildableComponent.super.examinableProperties() + ); + } + /** * A score component builder. * diff --git a/api/src/main/java/net/kyori/adventure/text/ScoreComponentImpl.java b/api/src/main/java/net/kyori/adventure/text/ScoreComponentImpl.java index 83c7e4017..fd78dece5 100644 --- a/api/src/main/java/net/kyori/adventure/text/ScoreComponentImpl.java +++ b/api/src/main/java/net/kyori/adventure/text/ScoreComponentImpl.java @@ -25,9 +25,8 @@ import java.util.List; import java.util.Objects; -import java.util.stream.Stream; +import net.kyori.adventure.internal.Internals; import net.kyori.adventure.text.format.Style; -import net.kyori.examination.ExaminableProperty; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -113,15 +112,8 @@ public int hashCode() { } @Override - protected @NotNull Stream examinablePropertiesWithoutChildren() { - return Stream.concat( - Stream.of( - ExaminableProperty.of("name", this.name), - ExaminableProperty.of("objective", this.objective), - ExaminableProperty.of("value", this.value) - ), - super.examinablePropertiesWithoutChildren() - ); + public String toString() { + return Internals.toString(this); } @Override diff --git a/api/src/main/java/net/kyori/adventure/text/SelectorComponent.java b/api/src/main/java/net/kyori/adventure/text/SelectorComponent.java index d392c3d54..e4c6f58e1 100644 --- a/api/src/main/java/net/kyori/adventure/text/SelectorComponent.java +++ b/api/src/main/java/net/kyori/adventure/text/SelectorComponent.java @@ -23,6 +23,8 @@ */ package net.kyori.adventure.text; +import java.util.stream.Stream; +import net.kyori.examination.ExaminableProperty; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -78,6 +80,17 @@ public interface SelectorComponent extends BuildableComponent examinableProperties() { + return Stream.concat( + Stream.of( + ExaminableProperty.of("pattern", this.pattern()), + ExaminableProperty.of("separator", this.separator()) + ), + BuildableComponent.super.examinableProperties() + ); + } + /** * A selector component builder. * diff --git a/api/src/main/java/net/kyori/adventure/text/SelectorComponentImpl.java b/api/src/main/java/net/kyori/adventure/text/SelectorComponentImpl.java index 40df51e59..5e71557ed 100644 --- a/api/src/main/java/net/kyori/adventure/text/SelectorComponentImpl.java +++ b/api/src/main/java/net/kyori/adventure/text/SelectorComponentImpl.java @@ -25,9 +25,8 @@ import java.util.List; import java.util.Objects; -import java.util.stream.Stream; +import net.kyori.adventure.internal.Internals; import net.kyori.adventure.text.format.Style; -import net.kyori.examination.ExaminableProperty; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -92,14 +91,8 @@ public int hashCode() { } @Override - protected @NotNull Stream examinablePropertiesWithoutChildren() { - return Stream.concat( - Stream.of( - ExaminableProperty.of("pattern", this.pattern), - ExaminableProperty.of("separator", this.separator) - ), - super.examinablePropertiesWithoutChildren() - ); + public String toString() { + return Internals.toString(this); } @Override diff --git a/api/src/main/java/net/kyori/adventure/text/StorageNBTComponent.java b/api/src/main/java/net/kyori/adventure/text/StorageNBTComponent.java index 6f5159373..26e05f08e 100644 --- a/api/src/main/java/net/kyori/adventure/text/StorageNBTComponent.java +++ b/api/src/main/java/net/kyori/adventure/text/StorageNBTComponent.java @@ -23,7 +23,9 @@ */ package net.kyori.adventure.text; +import java.util.stream.Stream; import net.kyori.adventure.key.Key; +import net.kyori.examination.ExaminableProperty; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; @@ -61,6 +63,16 @@ public interface StorageNBTComponent extends NBTComponent examinableProperties() { + return Stream.concat( + Stream.of( + ExaminableProperty.of("storage", this.storage()) + ), + NBTComponent.super.examinableProperties() + ); + } + /** * A command storage NBT component builder. * diff --git a/api/src/main/java/net/kyori/adventure/text/StorageNBTComponentImpl.java b/api/src/main/java/net/kyori/adventure/text/StorageNBTComponentImpl.java index 2e2067306..9bb23744d 100644 --- a/api/src/main/java/net/kyori/adventure/text/StorageNBTComponentImpl.java +++ b/api/src/main/java/net/kyori/adventure/text/StorageNBTComponentImpl.java @@ -25,10 +25,9 @@ import java.util.List; import java.util.Objects; -import java.util.stream.Stream; +import net.kyori.adventure.internal.Internals; import net.kyori.adventure.key.Key; import net.kyori.adventure.text.format.Style; -import net.kyori.examination.ExaminableProperty; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -102,13 +101,8 @@ public int hashCode() { } @Override - protected @NotNull Stream examinablePropertiesWithoutChildren() { - return Stream.concat( - Stream.of( - ExaminableProperty.of("storage", this.storage) - ), - super.examinablePropertiesWithoutChildren() - ); + public String toString() { + return Internals.toString(this); } @Override diff --git a/api/src/main/java/net/kyori/adventure/text/TextComponent.java b/api/src/main/java/net/kyori/adventure/text/TextComponent.java index bdaac9d8d..1a7291e7a 100644 --- a/api/src/main/java/net/kyori/adventure/text/TextComponent.java +++ b/api/src/main/java/net/kyori/adventure/text/TextComponent.java @@ -23,6 +23,8 @@ */ package net.kyori.adventure.text; +import java.util.stream.Stream; +import net.kyori.examination.ExaminableProperty; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; @@ -71,6 +73,16 @@ public interface TextComponent extends BuildableComponent examinableProperties() { + return Stream.concat( + Stream.of( + ExaminableProperty.of("content", this.content()) + ), + BuildableComponent.super.examinableProperties() + ); + } + /** * A text component builder. * diff --git a/api/src/main/java/net/kyori/adventure/text/TextComponentImpl.java b/api/src/main/java/net/kyori/adventure/text/TextComponentImpl.java index 0e2bf7388..cc7542fa5 100644 --- a/api/src/main/java/net/kyori/adventure/text/TextComponentImpl.java +++ b/api/src/main/java/net/kyori/adventure/text/TextComponentImpl.java @@ -26,10 +26,10 @@ import java.util.Collections; import java.util.List; import java.util.Objects; -import java.util.stream.Stream; +import net.kyori.adventure.internal.Internals; +import net.kyori.adventure.internal.properties.AdventureProperties; import net.kyori.adventure.text.format.Style; import net.kyori.adventure.util.Nag; -import net.kyori.examination.ExaminableProperty; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.VisibleForTesting; @@ -37,7 +37,7 @@ import static java.util.Objects.requireNonNull; final class TextComponentImpl extends AbstractComponent implements TextComponent { - private static final boolean WARN_WHEN_LEGACY_FORMATTING_DETECTED = Boolean.getBoolean(String.join(".", "net", "kyori", "adventure", "text", "warnWhenLegacyFormattingDetected")); + private static final boolean WARN_WHEN_LEGACY_FORMATTING_DETECTED = Boolean.TRUE.equals(AdventureProperties.TEXT_WARN_WHEN_LEGACY_FORMATTING_DETECTED.value()); @VisibleForTesting static final char SECTION_CHAR = '§'; @@ -109,13 +109,8 @@ public int hashCode() { } @Override - protected @NotNull Stream examinablePropertiesWithoutChildren() { - return Stream.concat( - Stream.of( - ExaminableProperty.of("content", this.content) - ), - super.examinablePropertiesWithoutChildren() - ); + public String toString() { + return Internals.toString(this); } @Override diff --git a/api/src/main/java/net/kyori/adventure/text/TextReplacementConfigImpl.java b/api/src/main/java/net/kyori/adventure/text/TextReplacementConfigImpl.java index 75b95f684..5f4b7bd40 100644 --- a/api/src/main/java/net/kyori/adventure/text/TextReplacementConfigImpl.java +++ b/api/src/main/java/net/kyori/adventure/text/TextReplacementConfigImpl.java @@ -27,8 +27,8 @@ import java.util.regex.MatchResult; import java.util.regex.Pattern; import java.util.stream.Stream; +import net.kyori.adventure.internal.Internals; import net.kyori.examination.ExaminableProperty; -import net.kyori.examination.string.StringExaminer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -70,7 +70,7 @@ TextReplacementRenderer.State createState() { @Override public String toString() { - return this.examine(StringExaminer.simpleEscaping()); + return Internals.toString(this); } static final class Builder implements TextReplacementConfig.Builder { diff --git a/api/src/main/java/net/kyori/adventure/text/TranslatableComponent.java b/api/src/main/java/net/kyori/adventure/text/TranslatableComponent.java index 19bf104dc..a8082f20e 100644 --- a/api/src/main/java/net/kyori/adventure/text/TranslatableComponent.java +++ b/api/src/main/java/net/kyori/adventure/text/TranslatableComponent.java @@ -26,10 +26,12 @@ import java.util.List; import java.util.Locale; import java.util.Objects; +import java.util.stream.Stream; import net.kyori.adventure.audience.Audience; import net.kyori.adventure.translation.GlobalTranslator; import net.kyori.adventure.translation.Translatable; import net.kyori.adventure.translation.TranslationRegistry; +import net.kyori.examination.ExaminableProperty; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; @@ -117,6 +119,17 @@ public interface TranslatableComponent extends BuildableComponent args); + @Override + default @NotNull Stream examinableProperties() { + return Stream.concat( + Stream.of( + ExaminableProperty.of("key", this.key()), + ExaminableProperty.of("args", this.args()) + ), + BuildableComponent.super.examinableProperties() + ); + } + /** * A text component builder. * diff --git a/api/src/main/java/net/kyori/adventure/text/TranslatableComponentImpl.java b/api/src/main/java/net/kyori/adventure/text/TranslatableComponentImpl.java index e01f93856..c47aae19b 100644 --- a/api/src/main/java/net/kyori/adventure/text/TranslatableComponentImpl.java +++ b/api/src/main/java/net/kyori/adventure/text/TranslatableComponentImpl.java @@ -29,8 +29,8 @@ import java.util.Objects; import java.util.stream.Collectors; import java.util.stream.Stream; +import net.kyori.adventure.internal.Internals; import net.kyori.adventure.text.format.Style; -import net.kyori.examination.ExaminableProperty; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -105,14 +105,8 @@ public int hashCode() { } @Override - protected @NotNull Stream examinablePropertiesWithoutChildren() { - return Stream.concat( - Stream.of( - ExaminableProperty.of("key", this.key), - ExaminableProperty.of("args", this.args) - ), - super.examinablePropertiesWithoutChildren() - ); + public String toString() { + return Internals.toString(this); } @Override diff --git a/api/src/main/java/net/kyori/adventure/text/event/ClickEvent.java b/api/src/main/java/net/kyori/adventure/text/event/ClickEvent.java index e771bd773..5adbcd0e7 100644 --- a/api/src/main/java/net/kyori/adventure/text/event/ClickEvent.java +++ b/api/src/main/java/net/kyori/adventure/text/event/ClickEvent.java @@ -26,12 +26,12 @@ import java.net.URL; import java.util.Objects; import java.util.stream.Stream; +import net.kyori.adventure.internal.Internals; import net.kyori.adventure.text.format.Style; import net.kyori.adventure.text.format.StyleBuilderApplicable; import net.kyori.adventure.util.Index; import net.kyori.examination.Examinable; import net.kyori.examination.ExaminableProperty; -import net.kyori.examination.string.StringExaminer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -206,7 +206,7 @@ public int hashCode() { @Override public String toString() { - return this.examine(StringExaminer.simpleEscaping()); + return Internals.toString(this); } /** diff --git a/api/src/main/java/net/kyori/adventure/text/event/HoverEvent.java b/api/src/main/java/net/kyori/adventure/text/event/HoverEvent.java index 997f705ad..bd5f7c486 100644 --- a/api/src/main/java/net/kyori/adventure/text/event/HoverEvent.java +++ b/api/src/main/java/net/kyori/adventure/text/event/HoverEvent.java @@ -27,6 +27,7 @@ import java.util.UUID; import java.util.function.UnaryOperator; import java.util.stream.Stream; +import net.kyori.adventure.internal.Internals; import net.kyori.adventure.key.Key; import net.kyori.adventure.key.Keyed; import net.kyori.adventure.nbt.api.BinaryTagHolder; @@ -38,7 +39,6 @@ import net.kyori.adventure.util.Index; import net.kyori.examination.Examinable; import net.kyori.examination.ExaminableProperty; -import net.kyori.examination.string.StringExaminer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Range; @@ -318,7 +318,7 @@ public int hashCode() { @Override public String toString() { - return this.examine(StringExaminer.simpleEscaping()); + return Internals.toString(this); } /** @@ -480,7 +480,7 @@ public int hashCode() { @Override public String toString() { - return this.examine(StringExaminer.simpleEscaping()); + return Internals.toString(this); } } @@ -654,7 +654,7 @@ public int hashCode() { @Override public String toString() { - return this.examine(StringExaminer.simpleEscaping()); + return Internals.toString(this); } } diff --git a/api/src/main/java/net/kyori/adventure/text/format/NamedTextColor.java b/api/src/main/java/net/kyori/adventure/text/format/NamedTextColor.java index 1c9a453c6..aea34f152 100644 --- a/api/src/main/java/net/kyori/adventure/text/format/NamedTextColor.java +++ b/api/src/main/java/net/kyori/adventure/text/format/NamedTextColor.java @@ -30,6 +30,7 @@ import net.kyori.adventure.util.HSVLike; import net.kyori.adventure.util.Index; import net.kyori.examination.ExaminableProperty; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -163,13 +164,45 @@ public final class NamedTextColor implements TextColor { */ public static final Index NAMES = Index.create(constant -> constant.name, VALUES); + /** + * Gets the named color exactly matching the provided color. + * + * @param value the color to match + * @return the matched color, or null + * @since 4.10.0 + */ + public static @Nullable NamedTextColor namedColor(final int value) { + switch (value) { + case BLACK_VALUE: return BLACK; + case DARK_BLUE_VALUE: return DARK_BLUE; + case DARK_GREEN_VALUE: return DARK_GREEN; + case DARK_AQUA_VALUE: return DARK_AQUA; + case DARK_RED_VALUE: return DARK_RED; + case DARK_PURPLE_VALUE: return DARK_PURPLE; + case GOLD_VALUE: return GOLD; + case GRAY_VALUE: return GRAY; + case DARK_GRAY_VALUE: return DARK_GRAY; + case BLUE_VALUE: return BLUE; + case GREEN_VALUE: return GREEN; + case AQUA_VALUE: return AQUA; + case RED_VALUE: return RED; + case LIGHT_PURPLE_VALUE: return LIGHT_PURPLE; + case YELLOW_VALUE: return YELLOW; + case WHITE_VALUE: return WHITE; + default: return null; + } + } + /** * Gets the named color exactly matching the provided color. * * @param value the color to match * @return the matched color, or null * @since 4.0.0 + * @deprecated for removal since 4.10.0, use {@link #namedColor(int)} instead */ + @Deprecated + @ApiStatus.ScheduledForRemoval(inVersion = "5.0.0") public static @Nullable NamedTextColor ofExact(final int value) { switch (value) { case BLACK_VALUE: return BLACK; diff --git a/api/src/main/java/net/kyori/adventure/text/format/Style.java b/api/src/main/java/net/kyori/adventure/text/format/Style.java index b4ba3b300..264b9e26c 100644 --- a/api/src/main/java/net/kyori/adventure/text/format/Style.java +++ b/api/src/main/java/net/kyori/adventure/text/format/Style.java @@ -478,7 +478,7 @@ default boolean hasDecoration(final @NotNull TextDecoration decoration) { * @since 4.0.0 */ default @NotNull Style merge(final @NotNull Style that, final @NotNull Merge@NotNull... merges) { - return this.merge(that, Merge.of(merges)); + return this.merge(that, Merge.merges(merges)); } /** @@ -491,7 +491,7 @@ default boolean hasDecoration(final @NotNull TextDecoration decoration) { * @since 4.0.0 */ default @NotNull Style merge(final @NotNull Style that, final Merge.@NotNull Strategy strategy, final @NotNull Merge@NotNull... merges) { - return this.merge(that, strategy, Merge.of(merges)); + return this.merge(that, strategy, Merge.merges(merges)); } /** @@ -571,8 +571,8 @@ enum Merge { */ FONT; - static final Set ALL = of(values()); - static final Set COLOR_AND_DECORATIONS = of(COLOR, DECORATIONS); + static final Set ALL = merges(values()); + static final Set COLOR_AND_DECORATIONS = merges(COLOR, DECORATIONS); /** * Gets a merge set of all merge types. @@ -594,13 +594,27 @@ enum Merge { return COLOR_AND_DECORATIONS; } + /** + * Creates a merge set. + * + * @param merges the merge parts + * @return a merge set + * @since 4.10.0 + */ + public static @Unmodifiable @NotNull Set merges(final Merge@NotNull... merges) { + return MonkeyBars.enumSet(Merge.class, merges); + } + /** * Creates a merge set. * * @param merges the merge parts * @return a merge set * @since 4.0.0 + * @deprecated for removal since 4.10.0, use {@link #merges(Style.Merge...)} instead. */ + @Deprecated + @ApiStatus.ScheduledForRemoval(inVersion = "5.0.0") public static @Unmodifiable @NotNull Set of(final Merge@NotNull... merges) { return MonkeyBars.enumSet(Merge.class, merges); } @@ -816,7 +830,7 @@ interface Builder extends Buildable.Builder