diff --git a/eco-api/src/main/java/com/willfp/eco/util/StringUtils.java b/eco-api/src/main/java/com/willfp/eco/util/StringUtils.java index d5653e88..5ea0e53e 100644 --- a/eco-api/src/main/java/com/willfp/eco/util/StringUtils.java +++ b/eco-api/src/main/java/com/willfp/eco/util/StringUtils.java @@ -796,21 +796,53 @@ public final class StringUtils { @NotNull public static List lineWrap(@NotNull final List input, final int lineLength) { + return lineWrap(input, lineLength, true); + } + + /** + * Line wrap a list of strings while preserving formatting. + * + * @param input The input list. + * @param lineLength The length of each line. + * @return The wrapped list. + */ + @NotNull + public static List lineWrap(@NotNull final List input, + final int lineLength, + final boolean preserveMargin) { return input.stream() - .flatMap(line -> lineWrap(line, lineLength).stream()) + .flatMap(line -> lineWrap(line, lineLength, preserveMargin).stream()) .toList(); } /** * Line wrap a string while preserving formatting. * - * @param input The input string. + * @param input The input list. * @param lineLength The length of each line. - * @return The wrapped string. + * @return The wrapped list. */ @NotNull public static List lineWrap(@NotNull final String input, final int lineLength) { + return lineWrap(input, lineLength, true); + } + + /** + * Line wrap a string while preserving formatting. + * + * @param input The input string. + * @param lineLength The length of each line. + * @param preserveMargin If the string has a margin, add it to the start of each line. + * @return The wrapped string. + */ + @NotNull + public static List lineWrap(@NotNull final String input, + final int lineLength, + final boolean preserveMargin) { + int margin = preserveMargin ? getMargin(input) : 0; + TextComponent space = Component.text(" "); + Component asComponent = toComponent(input); // The component contains the text as its children, so the child components @@ -841,6 +873,15 @@ public final class StringUtils { lines.add(Component.join(JoinConfiguration.noSeparators(), currentLine)); currentLine.clear(); } else { + // Add margin if starting a new line. + if (currentLine.isEmpty()) { + if (preserveMargin) { + for (int i = 0; i < margin; i++) { + currentLine.add(space); + } + } + } + currentLine.add(letter); } } @@ -853,6 +894,16 @@ public final class StringUtils { .collect(Collectors.toList()); } + /** + * Get a string's margin. + * + * @param input The input string. + * @return The margin. + */ + public static int getMargin(@NotNull final String input) { + return input.indexOf(input.trim()); + } + /** * Options for formatting. */ diff --git a/eco-api/src/main/kotlin/com/willfp/eco/util/StringUtils.kt b/eco-api/src/main/kotlin/com/willfp/eco/util/StringUtils.kt index 10332a38..4025dd13 100644 --- a/eco-api/src/main/kotlin/com/willfp/eco/util/StringUtils.kt +++ b/eco-api/src/main/kotlin/com/willfp/eco/util/StringUtils.kt @@ -71,9 +71,13 @@ fun String.replaceQuickly(target: String, replacement: String): String = StringUtils.replaceQuickly(this, target, replacement) /** @see StringUtils.lineWrap */ -fun String.lineWrap(width: Int): List = - StringUtils.lineWrap(this, width) +fun String.lineWrap(width: Int, preserveMargin: Boolean = true): List = + StringUtils.lineWrap(this, width, preserveMargin) /** @see StringUtils.lineWrap */ -fun List.lineWrap(width: Int): List = - StringUtils.lineWrap(this, width) +fun List.lineWrap(width: Int, preserveMargin: Boolean = true): List = + StringUtils.lineWrap(this, width, preserveMargin) + +/** @see StringUtils.getMargin */ +val String.margin: Int + get() = StringUtils.getMargin(this)