From 03c0cce53e2fe8cf5ce6a0575a023be5eb05b5a3 Mon Sep 17 00:00:00 2001 From: Kenzie Togami Date: Sat, 5 Oct 2019 02:06:18 -0700 Subject: [PATCH] Update to Piston 0.5.2 + Doctools/Deprecation improvements (#523) * Update to Piston 0.5.2 * [Doctools] Fix output, be verbose about deprecations * Improve deprecation system, doctools output --- buildSrc/src/main/kotlin/Versions.kt | 2 +- .../bukkit/BukkitBlockCommandSender.java | 3 +- .../bukkit/BukkitCommandInspector.java | 2 +- .../worldedit/bukkit/BukkitCommandSender.java | 3 +- .../sk89q/worldedit/bukkit/BukkitPlayer.java | 3 +- .../bukkit/BukkitServerInterface.java | 2 +- .../sk89q/worldedit/cli/CLICommandSender.java | 3 +- .../internal/util/DocumentationPrinter.kt | 52 ++++++++------ .../internal/util/RstWorldEditText.kt | 69 +++++++++++++++++++ .../sk89q/worldedit/command/ToolCommands.java | 2 +- .../platform/PlatformCommandManager.java | 7 +- .../internal/command/CommandUtil.java | 63 +++++++++++++++-- .../util/formatting/WorldEditText.java | 35 +++++----- .../formatting/component/CommandUsageBox.java | 12 ++-- .../sk89q/worldedit/fabric/FabricPlayer.java | 3 +- .../sk89q/worldedit/forge/ForgePlayer.java | 3 +- .../worldedit/sponge/SpongeCommandSender.java | 3 +- .../sk89q/worldedit/sponge/SpongePlayer.java | 3 +- .../worldedit/sponge/SpongeTextAdapter.java | 2 + 19 files changed, 205 insertions(+), 67 deletions(-) create mode 100644 worldedit-core/doctools/src/main/kotlin/com/sk89q/worldedit/internal/util/RstWorldEditText.kt rename worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitTextAdapter.java => worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/WorldEditText.java (54%) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 391029752..d9d0e643a 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -3,7 +3,7 @@ import org.gradle.api.Project object Versions { const val TEXT = "3.0.1" const val TEXT_EXTRAS = "3.0.2" - const val PISTON = "0.4.3" + const val PISTON = "0.5.2" const val AUTO_VALUE = "1.6.5" const val JUNIT = "5.5.0" const val MOCKITO = "3.0.0" diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitBlockCommandSender.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitBlockCommandSender.java index d87462322..fe5114cb1 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitBlockCommandSender.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitBlockCommandSender.java @@ -27,6 +27,7 @@ import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.session.SessionKey; import com.sk89q.worldedit.util.Location; import com.sk89q.worldedit.util.auth.AuthorizationException; +import com.sk89q.worldedit.util.formatting.WorldEditText; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.TextComponent; import com.sk89q.worldedit.util.formatting.text.adapter.bukkit.TextAdapter; @@ -90,7 +91,7 @@ public class BukkitBlockCommandSender extends AbstractNonPlayerActor implements @Override public void print(Component component) { - TextAdapter.sendComponent(sender, component); + TextAdapter.sendComponent(sender, WorldEditText.format(component)); } @Override diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitCommandInspector.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitCommandInspector.java index 972f7f5e1..de2a5ffa1 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitCommandInspector.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitCommandInspector.java @@ -33,7 +33,7 @@ import org.slf4j.LoggerFactory; import java.util.Optional; import static com.google.common.base.Preconditions.checkNotNull; -import static com.sk89q.worldedit.bukkit.BukkitTextAdapter.reduceToText; +import static com.sk89q.worldedit.util.formatting.WorldEditText.reduceToText; class BukkitCommandInspector implements CommandInspector { diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitCommandSender.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitCommandSender.java index f1ac08599..75d5aa903 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitCommandSender.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitCommandSender.java @@ -25,6 +25,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import com.sk89q.worldedit.extension.platform.AbstractNonPlayerActor; import com.sk89q.worldedit.session.SessionKey; import com.sk89q.worldedit.util.auth.AuthorizationException; +import com.sk89q.worldedit.util.formatting.WorldEditText; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.adapter.bukkit.TextAdapter; import org.bukkit.command.CommandSender; @@ -93,7 +94,7 @@ public class BukkitCommandSender extends AbstractNonPlayerActor { @Override public void print(Component component) { - TextAdapter.sendComponent(sender, component); + TextAdapter.sendComponent(sender, WorldEditText.format(component)); } @Override diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java index 3e12279ea..75b9c0ff7 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitPlayer.java @@ -31,6 +31,7 @@ import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.session.SessionKey; import com.sk89q.worldedit.util.HandSide; +import com.sk89q.worldedit.util.formatting.WorldEditText; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.world.World; import com.sk89q.worldedit.world.block.BaseBlock; @@ -129,7 +130,7 @@ public class BukkitPlayer extends AbstractPlayerActor { @Override public void print(Component component) { - TextAdapter.sendComponent(player, component); + TextAdapter.sendComponent(player, WorldEditText.format(component)); } @Override diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitServerInterface.java b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitServerInterface.java index 5bdffb5e9..0fda56974 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitServerInterface.java +++ b/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitServerInterface.java @@ -47,7 +47,7 @@ import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; -import static com.sk89q.worldedit.bukkit.BukkitTextAdapter.reduceToText; +import static com.sk89q.worldedit.util.formatting.WorldEditText.reduceToText; public class BukkitServerInterface implements MultiUserPlatform { public Server server; diff --git a/worldedit-cli/src/main/java/com/sk89q/worldedit/cli/CLICommandSender.java b/worldedit-cli/src/main/java/com/sk89q/worldedit/cli/CLICommandSender.java index 0c9cb22f8..970c11df5 100644 --- a/worldedit-cli/src/main/java/com/sk89q/worldedit/cli/CLICommandSender.java +++ b/worldedit-cli/src/main/java/com/sk89q/worldedit/cli/CLICommandSender.java @@ -26,6 +26,7 @@ import com.sk89q.worldedit.internal.cui.CUIEvent; import com.sk89q.worldedit.session.SessionKey; import com.sk89q.worldedit.util.FileDialogUtil; import com.sk89q.worldedit.util.auth.AuthorizationException; +import com.sk89q.worldedit.util.formatting.WorldEditText; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.serializer.plain.PlainComponentSerializer; import org.slf4j.Logger; @@ -96,7 +97,7 @@ public class CLICommandSender implements Actor { @Override public void print(Component component) { - print(PlainComponentSerializer.INSTANCE.serialize(component)); + print(PlainComponentSerializer.INSTANCE.serialize(WorldEditText.format(component))); } @Override diff --git a/worldedit-core/doctools/src/main/kotlin/com/sk89q/worldedit/internal/util/DocumentationPrinter.kt b/worldedit-core/doctools/src/main/kotlin/com/sk89q/worldedit/internal/util/DocumentationPrinter.kt index c6b94b86b..931c665ba 100644 --- a/worldedit-core/doctools/src/main/kotlin/com/sk89q/worldedit/internal/util/DocumentationPrinter.kt +++ b/worldedit-core/doctools/src/main/kotlin/com/sk89q/worldedit/internal/util/DocumentationPrinter.kt @@ -24,7 +24,6 @@ import com.sk89q.worldedit.WorldEdit import com.sk89q.worldedit.command.BiomeCommands import com.sk89q.worldedit.command.ChunkCommands import com.sk89q.worldedit.command.ClipboardCommands -import com.sk89q.worldedit.command.ExpandCommands import com.sk89q.worldedit.command.GeneralCommands import com.sk89q.worldedit.command.GenerationCommands import com.sk89q.worldedit.command.HistoryCommands @@ -37,11 +36,10 @@ import com.sk89q.worldedit.command.ToolCommands import com.sk89q.worldedit.command.ToolUtilCommands import com.sk89q.worldedit.command.UtilityCommands import com.sk89q.worldedit.command.util.PermissionCondition +import com.sk89q.worldedit.internal.command.CommandUtil import com.sk89q.worldedit.util.formatting.text.TextComponent -import com.sk89q.worldedit.util.formatting.text.TranslatableComponent -import com.sk89q.worldedit.util.formatting.text.serializer.plain.PlainComponentSerializer import org.enginehub.piston.Command -import org.enginehub.piston.TextConfig +import org.enginehub.piston.config.TextConfig import org.enginehub.piston.part.SubCommandPart import org.enginehub.piston.util.HelpGenerator import java.nio.file.Files @@ -52,7 +50,6 @@ import kotlin.streams.toList class DocumentationPrinter private constructor() { private val nameRegex = Regex("name = \"(.+?)\"") - private val serializer = PlainComponentSerializer({ "" }, TranslatableComponent::key) private val commands = WorldEdit.getInstance().platformManager.platformCommandManager.commandManager.allCommands .map { it.name to it }.toList().toMap() private val cmdOutput = StringBuilder() @@ -111,6 +108,7 @@ class DocumentationPrinter private constructor() { } dumpSection("Tool Commands") { + yield("tool") yieldAllCommandsIn() yieldAllCommandsIn() } @@ -216,7 +214,7 @@ Other Permissions private fun dumpSection(title: String, addCommandNames: suspend SequenceScope.() -> Unit) { cmdOutput.append("\n").append(title).append("\n").append(Strings.repeat("~", title.length)).append("\n") - val prefix = TextConfig.getCommandPrefix() + val prefix = reduceToRst(TextConfig.commandPrefixValue()) val commands = sequence(addCommandNames).map { this.commands.getValue(it) }.toList() matchedCommands.addAll(commands.map { it.name }) @@ -269,14 +267,19 @@ Other Permissions } cmdOutput.appendln() cmdOutput.appendln(" :class: command-topic").appendln() + CommandUtil.deprecationWarning(command).ifPresent { warning -> + cmdOutput.appendln(""" + | .. WARNING:: + | ${reduceToRst(warning).makeRstSafe("\n\n")} + """.trimMargin()) + } cmdOutput.appendln(""" | .. csv-table:: | :widths: 8, 15 """.trimMargin()) cmdOutput.appendln() for ((k, v) in entries) { - val rstSafe = v.trim().replace("\"", "\\\"").replace("\n", "\n" + " ".repeat(2)) - .lineSequence().map { line -> line.ifBlank { "" } }.joinToString(separator = "\n") + val rstSafe = v.makeRstSafe("\n") cmdOutput.append(" ".repeat(2)) .append(k) .append(",") @@ -287,32 +290,39 @@ Other Permissions cmdOutput.appendln() } + private fun String.makeRstSafe(lineJoiner: String) = trim() + .replace("\"", "\\\"").replace("\n", "\n" + " ".repeat(2)) + .lineSequence() + .map { line -> line.ifBlank { "" } } + .joinToString(separator = lineJoiner) + private fun linkSafe(text: String) = text.replace(" ", "-") private fun commandTableEntries(command: Command, parents: Stream): Map { return sequence { val desc = command.description.run { + val footer = CommandUtil.footerWithoutDeprecation(command) when { - command.footer.isPresent -> append( - TextComponent.builder("\n\n").append(command.footer.get()) + footer.isPresent -> append( + TextComponent.builder("\n\n").append(footer.get()) ) else -> this } } - yield("**Description**" to serializer.serialize(desc)) + yield("**Description**" to reduceToRst(desc)) val cond = command.condition if (cond is PermissionCondition && cond.permissions.isNotEmpty()) { val perms = cond.permissions.joinToString(", ") { "``$it``" } yield("**Permissions**" to perms) } - val usage = serializer.serialize(HelpGenerator.create(Stream.concat(parents, Stream.of(command)).toList()).usage) + val usage = reduceToRst(HelpGenerator.create(Stream.concat(parents, Stream.of(command)).toList()).usage) yield("**Usage**" to "``$usage``") // Part descriptions command.parts.filterNot { it is SubCommandPart } .forEach { - val title = "\u2001\u2001``" + serializer.serialize(it.textRepresentation) + "``" - yield(title to serializer.serialize(it.description)) + val title = "\u2001\u2001``" + reduceToRst(it.textRepresentation) + "``" + yield(title to reduceToRst(it.description)) } }.toMap() } @@ -324,13 +334,15 @@ Other Permissions */ @JvmStatic fun main(args: Array) { - val printer = DocumentationPrinter() + try { + val printer = DocumentationPrinter() - printer.writeAllCommands() - writeOutput("commands.rst", printer.cmdOutput.toString()) - writeOutput("permissions.rst", printer.permsOutput.toString()) - - WorldEdit.getInstance().sessionManager.unload() + printer.writeAllCommands() + writeOutput("commands.rst", printer.cmdOutput.toString()) + writeOutput("permissions.rst", printer.permsOutput.toString()) + } finally { + WorldEdit.getInstance().sessionManager.unload() + } } private fun writeOutput(file: String, output: String) { diff --git a/worldedit-core/doctools/src/main/kotlin/com/sk89q/worldedit/internal/util/RstWorldEditText.kt b/worldedit-core/doctools/src/main/kotlin/com/sk89q/worldedit/internal/util/RstWorldEditText.kt new file mode 100644 index 000000000..2b37700f6 --- /dev/null +++ b/worldedit-core/doctools/src/main/kotlin/com/sk89q/worldedit/internal/util/RstWorldEditText.kt @@ -0,0 +1,69 @@ +package com.sk89q.worldedit.internal.util + +import com.sk89q.worldedit.util.formatting.WorldEditText +import com.sk89q.worldedit.util.formatting.text.Component +import com.sk89q.worldedit.util.formatting.text.TextComponent +import com.sk89q.worldedit.util.formatting.text.TranslatableComponent +import com.sk89q.worldedit.util.formatting.text.event.ClickEvent +import com.sk89q.worldedit.util.formatting.text.format.TextDecoration +import org.enginehub.piston.util.TextHelper + +fun reduceToRst(component: Component): String { + val formatted = WorldEditText.format(component) + return formatAsRst(formatted).toString() +} + +private fun formatAsRst(component: Component, currentDeco: String? = null): CharSequence { + return when (component) { + is TextComponent -> { + val content = StringBuilder(component.content()) + + val deco = when { + // Actions that suggest themselves as commands are marked as code + component.isSuggestingAsCommand(content.toString()) -> "``" + component.decorations().any { it == TextDecoration.BOLD } -> "**" + component.decorations().any { it == TextDecoration.ITALIC } -> "*" + else -> null + } + + component.children().joinTo(content, separator = "") { + formatAsRst(it, deco ?: currentDeco) + } + + deco?.let { + require(currentDeco == null) { + "Nested decorations are hell in RST. \n" + + "Existing: $currentDeco; New: $deco\n" + + "Offender: ${TextHelper.reduceToText(component)}" + } + content.rstDeco(deco) + } + + content + } + is TranslatableComponent -> { + val content = StringBuilder(component.key()) + component.children().joinTo(content, separator = "") { formatAsRst(it, currentDeco) } + content + } + else -> component.children().joinToString(separator = "") { formatAsRst(it, currentDeco) } + } +} + +private fun Component.isSuggestingAsCommand(text: String): Boolean { + val ce = clickEvent() + return when (ce?.action()) { + ClickEvent.Action.RUN_COMMAND, + ClickEvent.Action.SUGGEST_COMMAND -> + ce.value() == text + else -> false + } +} + +private fun StringBuilder.rstDeco(deco: String): StringBuilder = apply { + ensureCapacity(length + deco.length * 2) + val insertionPoint = indexOfFirst { !it.isWhitespace() }.coerceAtLeast(0) + insert(insertionPoint, deco) + val insertionPointEnd = (indexOfLast { !it.isWhitespace() } + 1).takeUnless { it < 1 } ?: length + insert(insertionPointEnd, deco) +} diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolCommands.java b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolCommands.java index 29c05676c..9418804b6 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolCommands.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/command/ToolCommands.java @@ -88,7 +88,7 @@ public class ToolCommands { ).build(); } commandManager.register(CommandUtil.deprecate( - command, "Using global tool names is deprecated " + + command, "Global tool names cause conflicts " + "and will be removed in WorldEdit 8", ToolCommands::asNonGlobal )); } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformCommandManager.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformCommandManager.java index 2913a277d..2bcddc7f8 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformCommandManager.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/platform/PlatformCommandManager.java @@ -106,7 +106,8 @@ import com.sk89q.worldedit.util.logging.LogFormat; import com.sk89q.worldedit.world.World; import org.enginehub.piston.Command; import org.enginehub.piston.CommandManager; -import org.enginehub.piston.TextConfig; +import org.enginehub.piston.config.ConfigHolder; +import org.enginehub.piston.config.TextConfig; import org.enginehub.piston.converter.ArgumentConverters; import org.enginehub.piston.exception.CommandException; import org.enginehub.piston.exception.CommandExecutionException; @@ -152,10 +153,6 @@ public final class PlatformCommandManager { private static final java.util.logging.Logger COMMAND_LOG = java.util.logging.Logger.getLogger("com.sk89q.worldedit.CommandLog"); - static { - TextConfig.setCommandPrefix("/"); - } - private final WorldEdit worldEdit; private final PlatformManager platformManager; private final CommandManagerServiceImpl commandManagerService; diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/CommandUtil.java b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/CommandUtil.java index d1690fc24..64c0324a4 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/CommandUtil.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/internal/command/CommandUtil.java @@ -42,6 +42,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.function.Function; +import java.util.function.Predicate; import java.util.stream.Collectors; import static com.google.common.base.Preconditions.checkState; @@ -49,11 +50,16 @@ import static java.util.stream.Collectors.toList; public class CommandUtil { - private static Component makeDeprecatedFooter(Component newCommand) { - return TextComponent.builder("This command is deprecated. Use ", TextColor.GOLD) - .decoration(TextDecoration.ITALIC, true) + private static final Component DEPRECATION_MARKER = TextComponent.of("This command is deprecated."); + + private static Component makeDeprecatedFooter(String reason, Component newCommand) { + return TextComponent.builder() + .append(DEPRECATION_MARKER) + .append(" " + reason + ".") + .append(TextComponent.newline()) + .append(TextComponent.of("Use ", TextColor.GOLD, TextDecoration.ITALIC)) .append(newCommand) - .append(" instead.") + .append(TextComponent.of(" instead.", TextColor.GOLD, TextDecoration.ITALIC)) .build(); } @@ -66,6 +72,7 @@ public class CommandUtil { public static Command deprecate(Command command, String reason, NewCommandGenerator newCommandGenerator) { Component deprecatedWarning = makeDeprecatedFooter( + reason, newCommandSuggestion(newCommandGenerator, NoInputCommandParameters.builder().build(), command) @@ -80,6 +87,54 @@ public class CommandUtil { .build(); } + public static Optional footerWithoutDeprecation(Command command) { + return command.getFooter() + .filter(footer -> anyComponent(footer, Predicate.isEqual(DEPRECATION_MARKER))) + .map(footer -> Optional.of( + replaceDeprecation(footer) + )) + .orElseGet(command::getFooter); + } + + public static Optional deprecationWarning(Command command) { + return command.getFooter() + .map(CommandUtil::extractDeprecation) + .orElseGet(command::getFooter); + } + + public static boolean isDeprecated(Command command) { + return command.getFooter() + .filter(footer -> anyComponent(footer, Predicate.isEqual(DEPRECATION_MARKER))) + .isPresent(); + } + + private static boolean anyComponent(Component component, Predicate test) { + return test.test(component) || component.children().stream() + .anyMatch(x -> anyComponent(x, test)); + } + + private static Component replaceDeprecation(Component component) { + if (component.children().stream().anyMatch(Predicate.isEqual(DEPRECATION_MARKER))) { + return TextComponent.empty(); + } + return component.children( + component.children().stream() + .map(CommandUtil::replaceDeprecation) + .collect(toList()) + ); + } + + private static Optional extractDeprecation(Component component) { + if (component.children().stream().anyMatch(Predicate.isEqual(DEPRECATION_MARKER))) { + return Optional.of(component); + } + return component.children().stream() + .map(CommandUtil::extractDeprecation) + .filter(Optional::isPresent) + .map(Optional::get) + .findAny(); + } + private static int deprecatedCommandWarning( CommandParameters parameters, Command command, diff --git a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitTextAdapter.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/WorldEditText.java similarity index 54% rename from worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitTextAdapter.java rename to worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/WorldEditText.java index fba2c2b1e..897a3fa46 100644 --- a/worldedit-bukkit/src/main/java/com/sk89q/worldedit/bukkit/BukkitTextAdapter.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/WorldEditText.java @@ -17,32 +17,29 @@ * along with this program. If not, see . */ -package com.sk89q.worldedit.bukkit; +package com.sk89q.worldedit.util.formatting; import com.sk89q.worldedit.util.formatting.text.Component; -import com.sk89q.worldedit.util.formatting.text.TextComponent; -import com.sk89q.worldedit.util.formatting.text.TranslatableComponent; +import org.enginehub.piston.config.ConfigHolder; +import org.enginehub.piston.config.TextConfig; +import org.enginehub.piston.util.TextHelper; -public class BukkitTextAdapter { +public class WorldEditText { + public static final ConfigHolder CONFIG_HOLDER = ConfigHolder.create(); + + static { + CONFIG_HOLDER.getConfig(TextConfig.commandPrefix()).setValue("/"); + } + + public static Component format(Component component) { + return CONFIG_HOLDER.replace(component); + } public static String reduceToText(Component component) { - StringBuilder text = new StringBuilder(); - appendTextTo(text, component); - return text.toString(); + return TextHelper.reduceToText(format(component)); } - private static void appendTextTo(StringBuilder builder, Component component) { - if (component instanceof TextComponent) { - builder.append(((TextComponent) component).content()); - } else if (component instanceof TranslatableComponent) { - builder.append(((TranslatableComponent) component).key()); - } - for (Component child : component.children()) { - appendTextTo(builder, child); - } - } - - private BukkitTextAdapter() { + private WorldEditText() { } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/CommandUsageBox.java b/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/CommandUsageBox.java index 579bd44a9..ed5ab2db2 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/CommandUsageBox.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/util/formatting/component/CommandUsageBox.java @@ -24,9 +24,9 @@ import com.sk89q.worldedit.util.formatting.text.TextComponent; import com.sk89q.worldedit.util.formatting.text.event.ClickEvent; import com.sk89q.worldedit.util.formatting.text.event.HoverEvent; import com.sk89q.worldedit.util.formatting.text.format.TextDecoration; -import org.enginehub.piston.ColorConfig; import org.enginehub.piston.Command; import org.enginehub.piston.CommandParameters; +import org.enginehub.piston.config.ColorConfig; import org.enginehub.piston.util.HelpGenerator; import javax.annotation.Nullable; @@ -72,15 +72,13 @@ public class CommandUsageBox extends TextComponentProducer { .append(HelpGenerator.create(commands).getFullHelp()); if (getSubCommands(Iterables.getLast(commands)).size() > 0) { boxContent.append(TextComponent.newline()) - .append(TextComponent.builder("> ") - .color(ColorConfig.getHelpText()) - .append(TextComponent.builder("List Subcommands") - .color(ColorConfig.getMainText()) + .append(ColorConfig.helpText().wrap(TextComponent.builder("> ") + .append(ColorConfig.mainText().wrap(TextComponent.builder("List Subcommands") .decoration(TextDecoration.ITALIC, true) .clickEvent(ClickEvent.runCommand(helpRootCommand + " -s " + commandString)) .hoverEvent(HoverEvent.showText(TextComponent.of("List all subcommands of this command"))) - .build()) - .build()); + .build())) + .build())); } MessageBox box = new MessageBox("Help for " + commandString, boxContent); diff --git a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPlayer.java b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPlayer.java index 6bd1171d7..60003a259 100644 --- a/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPlayer.java +++ b/worldedit-fabric/src/main/java/com/sk89q/worldedit/fabric/FabricPlayer.java @@ -32,6 +32,7 @@ import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.session.SessionKey; import com.sk89q.worldedit.util.HandSide; import com.sk89q.worldedit.util.Location; +import com.sk89q.worldedit.util.formatting.WorldEditText; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.serializer.gson.GsonComponentSerializer; import com.sk89q.worldedit.world.World; @@ -151,7 +152,7 @@ public class FabricPlayer extends AbstractPlayerActor { @Override public void print(Component component) { - this.player.sendMessage(Text.Serializer.fromJson(GsonComponentSerializer.INSTANCE.serialize(component))); + this.player.sendMessage(Text.Serializer.fromJson(GsonComponentSerializer.INSTANCE.serialize(WorldEditText.format(component)))); } private void sendColorized(String msg, Formatting formatting) { diff --git a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlayer.java b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlayer.java index 94dfb8c10..22250e0de 100644 --- a/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlayer.java +++ b/worldedit-forge/src/main/java/com/sk89q/worldedit/forge/ForgePlayer.java @@ -32,6 +32,7 @@ import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.session.SessionKey; import com.sk89q.worldedit.util.HandSide; import com.sk89q.worldedit.util.Location; +import com.sk89q.worldedit.util.formatting.WorldEditText; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.serializer.gson.GsonComponentSerializer; import com.sk89q.worldedit.world.World; @@ -152,7 +153,7 @@ public class ForgePlayer extends AbstractPlayerActor { @Override public void print(Component component) { - this.player.sendMessage(ITextComponent.Serializer.fromJson(GsonComponentSerializer.INSTANCE.serialize(component))); + this.player.sendMessage(ITextComponent.Serializer.fromJson(GsonComponentSerializer.INSTANCE.serialize(WorldEditText.format(component)))); } private void sendColorized(String msg, TextFormatting formatting) { diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeCommandSender.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeCommandSender.java index e6eac1f83..4f8b7fa44 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeCommandSender.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeCommandSender.java @@ -26,6 +26,7 @@ import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.internal.cui.CUIEvent; import com.sk89q.worldedit.session.SessionKey; import com.sk89q.worldedit.util.auth.AuthorizationException; +import com.sk89q.worldedit.util.formatting.WorldEditText; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.adapter.spongeapi.TextAdapter; import org.spongepowered.api.command.CommandSource; @@ -93,7 +94,7 @@ public class SpongeCommandSender implements Actor { @Override public void print(Component component) { - TextAdapter.sendComponent(sender, component); + TextAdapter.sendComponent(sender, WorldEditText.format(component)); } private void sendColorized(String msg, TextColor formatting) { diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongePlayer.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongePlayer.java index 3a5f94933..aa0056710 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongePlayer.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongePlayer.java @@ -31,6 +31,7 @@ import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.session.SessionKey; import com.sk89q.worldedit.util.HandSide; import com.sk89q.worldedit.util.Location; +import com.sk89q.worldedit.util.formatting.WorldEditText; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.adapter.spongeapi.TextAdapter; import com.sk89q.worldedit.world.block.BlockStateHolder; @@ -153,7 +154,7 @@ public class SpongePlayer extends AbstractPlayerActor { @Override public void print(Component component) { - TextAdapter.sendComponent(player, component); + TextAdapter.sendComponent(player, WorldEditText.format(component)); } private void sendColorized(String msg, TextColor formatting) { diff --git a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeTextAdapter.java b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeTextAdapter.java index 836006803..4e7b5c2fb 100644 --- a/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeTextAdapter.java +++ b/worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeTextAdapter.java @@ -19,6 +19,7 @@ package com.sk89q.worldedit.sponge; +import com.sk89q.worldedit.util.formatting.WorldEditText; import com.sk89q.worldedit.util.formatting.text.Component; import com.sk89q.worldedit.util.formatting.text.serializer.gson.GsonComponentSerializer; import org.spongepowered.api.text.Text; @@ -27,6 +28,7 @@ import org.spongepowered.api.text.serializer.TextSerializers; public class SpongeTextAdapter { public static Text convert(Component component) { + component = WorldEditText.format(component); return TextSerializers.JSON.deserialize(GsonComponentSerializer.INSTANCE.serialize(component)); }