diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZonePlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZonePlugin.java index 15a5c3cff9..88f8bc620a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZonePlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZonePlugin.java @@ -39,6 +39,7 @@ import net.runelite.client.config.ConfigManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.util.Text; @PluginDescriptor( name = "Nightmare Zone" @@ -110,7 +111,7 @@ public class NightmareZonePlugin extends Plugin return; } - String msg = event.getMessage().replaceAll("<[^>]*>", " "); //remove color and linebreaks + String msg = Text.removeTags(event.getMessage()); //remove color and linebreaks if (msg.contains("The effects of overload have worn off, and you feel normal again.")) { notifier.notify("Your overload has worn off"); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java index 0156805cb2..f5c5283765 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/OpponentInfoOverlay.java @@ -45,6 +45,7 @@ import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; import net.runelite.client.ui.overlay.components.BackgroundComponent; import net.runelite.client.ui.overlay.components.TextComponent; +import net.runelite.client.util.Text; class OpponentInfoOverlay extends Overlay { @@ -120,14 +121,14 @@ class OpponentInfoOverlay extends Overlay { lastTime = Instant.now(); lastRatio = (float) opponent.getHealthRatio() / (float) opponent.getHealth(); - opponentName = opponent.getName().replaceAll("<[^>]*>", ""); + opponentName = Text.removeTags(opponent.getName()); lastMaxHealth = oppInfoHealth.get(opponentName + "_" + opponent.getCombatLevel()); Actor opponentsOpponent = opponent.getInteracting(); if (opponentsOpponent != null && (opponentsOpponent != client.getLocalPlayer() || client.getSetting(Varbits.MULTICOMBAT_AREA) == 1)) { - opponentsOpponentName = opponentsOpponent.getName().replaceAll("<[^>]*>", ""); + opponentsOpponentName = Text.removeTags(opponentsOpponent.getName()); } else { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java index 9a24a294cc..eb1ae3e90b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java @@ -68,6 +68,7 @@ import net.runelite.client.plugins.raids.solver.LayoutSolver; import net.runelite.client.plugins.raids.solver.RotationSolver; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; +import net.runelite.client.util.Text; @PluginDescriptor( name = "Chambers Of Xeric" @@ -252,7 +253,7 @@ public class RaidsPlugin extends Plugin { if (inRaidChambers && event.getType() == ChatMessageType.CLANCHAT_INFO) { - String message = event.getMessage().replaceAll("<[^>]*>", ""); + String message = Text.removeTags(event.getMessage()); if (config.raidsTimer() && message.startsWith(RAID_START_MESSAGE)) { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java index fc74c9b871..981803c119 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java @@ -81,6 +81,7 @@ import net.runelite.client.plugins.screenshot.imgur.ImageUploadResponse; import net.runelite.client.ui.ClientUI; import net.runelite.client.ui.FontManager; import net.runelite.client.ui.overlay.OverlayRenderer; +import net.runelite.client.util.Text; import net.runelite.http.api.RuneLiteAPI; import okhttp3.Call; import okhttp3.Callback; @@ -227,7 +228,7 @@ public class ScreenshotPlugin extends Plugin if (chatMessage.contains("You have completed") && chatMessage.contains("Treasure")) { - Matcher m = NUMBER_PATTERN.matcher(chatMessage.replaceAll("<[^>]*>", "")); + Matcher m = NUMBER_PATTERN.matcher(Text.removeTags(chatMessage)); if (m.find()) { clueNumber = Integer.valueOf(m.group()); @@ -238,7 +239,7 @@ public class ScreenshotPlugin extends Plugin if (chatMessage.startsWith("Your Barrows chest count is")) { - Matcher m = NUMBER_PATTERN.matcher(chatMessage.replaceAll("<[^>]*>", "")); + Matcher m = NUMBER_PATTERN.matcher(Text.removeTags(chatMessage)); if (m.find()) { barrowsNumber = Integer.valueOf(m.group()); @@ -248,7 +249,7 @@ public class ScreenshotPlugin extends Plugin if (chatMessage.startsWith("Your completed Chambers of Xeric count is:")) { - Matcher m = NUMBER_PATTERN.matcher(chatMessage.replaceAll("<[^>]*>", "")); + Matcher m = NUMBER_PATTERN.matcher(Text.removeTags(chatMessage)); if (m.find()) { raidsNumber = Integer.valueOf(m.group()); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java index 4495fd40cb..f492760144 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/SlayerPlugin.java @@ -53,6 +53,7 @@ import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.task.Schedule; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; +import net.runelite.client.util.Text; @PluginDescriptor( name = "Slayer" @@ -155,7 +156,7 @@ public class SlayerPlugin extends Plugin Widget NPCDialog = client.getWidget(WidgetInfo.DIALOG_NPC_TEXT); if (NPCDialog != null) { - String NPCText = NPCDialog.getText().replaceAll("<[^>]*>", " "); //remove color and linebreaks + String NPCText = Text.removeTags(NPCDialog.getText()); //remove color and linebreaks Matcher mAssign = NPC_ASSIGN_MESSAGE.matcher(NPCText); //number, name Matcher mCurrent = NPC_CURRENT_MESSAGE.matcher(NPCText); //name, number boolean found1 = mAssign.find(); @@ -193,7 +194,7 @@ public class SlayerPlugin extends Plugin return; } - String chatMsg = event.getMessage().replaceAll("<[^>]*>", ""); //remove color and linebreaks + String chatMsg = Text.removeTags(event.getMessage()); //remove color and linebreaks if (chatMsg.endsWith("; return to a Slayer master.")) { Matcher mComplete = CHAT_COMPLETE_MESSAGE.matcher(chatMsg); diff --git a/runelite-client/src/main/java/net/runelite/client/util/Text.java b/runelite-client/src/main/java/net/runelite/client/util/Text.java new file mode 100644 index 0000000000..6c6e71a7b7 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/util/Text.java @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2018, Joshua Filby + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.util; + +/** + * A set of utilities to use when dealing with text. + */ +public class Text +{ + + /** + * Removes all tags from the given `str`. + * + * @param str The string to remove tags from. + * @return The given `str` with all tags removed from it. + */ + public static String removeTags(String str) + { + StringBuilder builder = new StringBuilder(str.length()); + boolean inTag = false; + + for (int i = 0; i < str.length(); i++) + { + char currentChar = str.charAt(i); + + if (currentChar == '<') + { + inTag = true; + } + else if (currentChar == '>') + { + inTag = false; + } + else if (!inTag) + { + builder.append(currentChar); + } + } + + return builder.toString(); + } + +} diff --git a/runelite-client/src/test/java/net/runelite/client/util/TextTest.java b/runelite-client/src/test/java/net/runelite/client/util/TextTest.java new file mode 100644 index 0000000000..b8c9fa9511 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/util/TextTest.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018, Joshua Filby + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.util; + +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +public class TextTest +{ + @Test + public void removeTags() + { + assertEquals("Test", Text.removeTags("Test")); + assertEquals("Test", Text.removeTags("Test")); + assertEquals("Zezima (level-126)", Text.removeTags("Zezima (level-126)")); + assertEquals("", Text.removeTags("")); + assertEquals("Not so much.", Text.removeTags("Not so much.")); + assertEquals("Remove no tags", Text.removeTags("Remove no tags")); + } + +}