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 0fe68b69b..434f1bd97 100644 --- a/api/src/main/java/net/kyori/adventure/text/Component.java +++ b/api/src/main/java/net/kyori/adventure/text/Component.java @@ -1733,6 +1733,28 @@ default void detectCycle(final @NotNull Component that) { return this.append(builder.build()); } + /** + * Appends a newline to this component. + * + * @return a component with the newline added + * @since 4.12.0 + */ + @Contract(pure = true) + default @NotNull Component appendNewline() { + return this.append(newline()); + } + + /** + * Appends a space to this component. + * + * @return a component with the space added + * @since 4.12.0 + */ + @Contract(pure = true) + default @NotNull Component appendSpace() { + return this.append(space()); + } + /** * Apply a fallback style for this component and its 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 e79bd8f69..e75493d75 100644 --- a/api/src/main/java/net/kyori/adventure/text/ComponentBuilder.java +++ b/api/src/main/java/net/kyori/adventure/text/ComponentBuilder.java @@ -115,6 +115,26 @@ public interface ComponentBuilder, B extends @Contract("_ -> this") @NotNull B append(final @NotNull Iterable components); + /** + * Appends a newline to this component. + * + * @return this builder + * @since 4.12.0 + */ + default @NotNull B appendNewline() { + return this.append(Component.newline()); + } + + /** + * Appends a space to this component. + * + * @return this builder + * @since 4.12.0 + */ + default @NotNull B appendSpace() { + return this.append(Component.space()); + } + /** * Applies an action to this builder. * diff --git a/api/src/test/java/net/kyori/adventure/text/TextComponentTest.java b/api/src/test/java/net/kyori/adventure/text/TextComponentTest.java index af2ca53ae..8cde0a152 100644 --- a/api/src/test/java/net/kyori/adventure/text/TextComponentTest.java +++ b/api/src/test/java/net/kyori/adventure/text/TextComponentTest.java @@ -166,4 +166,24 @@ void testWrapping() { assertEquals(wrappedItalic.compact(), Component.text("italic").decoration(TextDecoration.ITALIC, true)); assertEquals(wrappedNotItalic.compact(), Component.text("non-italic").decoration(TextDecoration.ITALIC, false)); } + + @Test + void testAppendNewline() { + final Component c0 = Component.text("tuba").appendNewline().append(Component.text("time")); + final Component c1 = Component.text().content("tuba").appendNewline().append(Component.text("time")).build(); + + final Component c0Compact = c0.compact(); + assertEquals(c0Compact, Component.text("tuba\ntime")); + assertEquals(c0Compact, c1.compact()); + } + + @Test + void testAppendSpace() { + final Component c0 = Component.text("tuba").appendSpace().append(Component.text("time")); + final Component c1 = Component.text().content("tuba").appendSpace().append(Component.text("time")).build(); + + final Component c0Compact = c0.compact(); + assertEquals(c0Compact, Component.text("tuba time")); + assertEquals(c0Compact, c1.compact()); + } }