Merge pull request #6572 from Abextm/fix-carrot

Fix carrots in ChatboxTextInput
This commit is contained in:
Adam
2018-11-19 17:48:15 -05:00
committed by GitHub
3 changed files with 49 additions and 10 deletions

View File

@@ -51,6 +51,7 @@ import net.runelite.api.widgets.WidgetTextAlignment;
import net.runelite.client.callback.ClientThread; import net.runelite.client.callback.ClientThread;
import net.runelite.client.input.KeyListener; import net.runelite.client.input.KeyListener;
import net.runelite.client.input.MouseListener; import net.runelite.client.input.MouseListener;
import net.runelite.client.util.Text;
@Slf4j @Slf4j
public class ChatboxTextInput extends ChatboxInput implements KeyListener, MouseListener public class ChatboxTextInput extends ChatboxInput implements KeyListener, MouseListener
@@ -233,9 +234,9 @@ public class ChatboxTextInput extends ChatboxInput implements KeyListener, Mouse
{ {
Widget container = chatboxPanelManager.getContainerWidget(); Widget container = chatboxPanelManager.getContainerWidget();
String lt = value.substring(0, this.cursor); String lt = Text.escapeJagex(value.substring(0, this.cursor));
String mt = value.substring(this.cursor, this.cursorEnd); String mt = Text.escapeJagex(value.substring(this.cursor, this.cursorEnd));
String rt = value.substring(this.cursorEnd); String rt = Text.escapeJagex(value.substring(this.cursorEnd));
Widget leftText = container.createChild(-1, WidgetType.TEXT); Widget leftText = container.createChild(-1, WidgetType.TEXT);
Widget cursor = container.createChild(-1, WidgetType.RECTANGLE); Widget cursor = container.createChild(-1, WidgetType.RECTANGLE);
@@ -332,9 +333,9 @@ public class ChatboxTextInput extends ChatboxInput implements KeyListener, Mouse
// `i` is used to track max execution time incase there is a font with ligature width data that causes this to fail // `i` is used to track max execution time incase there is a font with ligature width data that causes this to fail
for (int i = tsValue.length(); i >= 0 && charIndex >= 0 && charIndex <= tsValue.length(); i--) for (int i = tsValue.length(); i >= 0 && charIndex >= 0 && charIndex <= tsValue.length(); i--)
{ {
int lcx = charIndex > 0 ? font.getTextWidth(tsValue.substring(0, charIndex - 1)) : 0; int lcx = charIndex > 0 ? font.getTextWidth(Text.escapeJagex(tsValue.substring(0, charIndex - 1))) : 0;
int mcx = font.getTextWidth(tsValue.substring(0, charIndex)); int mcx = font.getTextWidth(Text.escapeJagex(tsValue.substring(0, charIndex)));
int rcx = charIndex + 1 <= tsValue.length() ? font.getTextWidth(tsValue.substring(0, charIndex + 1)) : mcx; int rcx = charIndex + 1 <= tsValue.length() ? font.getTextWidth(Text.escapeJagex(tsValue.substring(0, charIndex + 1))) : mcx;
int leftBound = (lcx + mcx) / 2; int leftBound = (lcx + mcx) / 2;
int rightBound = (mcx + rcx) / 2; int rightBound = (mcx + rcx) / 2;

View File

@@ -36,10 +36,10 @@ public class Text
private static final Pattern TAG_REGEXP = Pattern.compile("<[^>]*>"); private static final Pattern TAG_REGEXP = Pattern.compile("<[^>]*>");
/** /**
* Removes all tags from the given `str`. * Removes all tags from the given string.
* *
* @param str The string to remove tags from. * @param str The string to remove tags from.
* @return The given `str` with all tags removed from it. * @return The given string with all tags removed from it.
*/ */
public static String removeTags(String str) public static String removeTags(String str)
{ {
@@ -70,7 +70,7 @@ public class Text
} }
/** /**
* In addition to removing all tags, replaces all <br> delimited text with spaces and all multiple continuous * In addition to removing all tags, replaces all &lt;br&gt; delimited text with spaces and all multiple continuous
* spaces with single space * spaces with single space
* *
* @param str The string to sanitize * @param str The string to sanitize
@@ -83,4 +83,35 @@ public class Text
.replaceAll("<br>", " ") .replaceAll("<br>", " ")
.replaceAll("[ ]+", " ")); .replaceAll("[ ]+", " "));
} }
/**
* Escapes a string for widgets, replacing &lt; and &gt; with their escaped counterparts
*/
public static String escapeJagex(String str)
{
StringBuilder out = new StringBuilder(str.length());
for (int i = 0; i < str.length(); i++)
{
char c = str.charAt(i);
if (c == '<')
{
out.append("<lt>");
}
else if (c == '>')
{
out.append("<gt>");
}
else if (c == '\n')
{
out.append("<br>");
}
else if (c != '\r')
{
out.append(c);
}
}
return out.toString();
}
} }

View File

@@ -119,7 +119,14 @@ public abstract class ScriptVMMixin implements RSClient
Object[] arguments = event.getArguments(); Object[] arguments = event.getArguments();
if (arguments != null && arguments.length > 0 && arguments[0] instanceof JavaScriptCallback) if (arguments != null && arguments.length > 0 && arguments[0] instanceof JavaScriptCallback)
{ {
((JavaScriptCallback) arguments[0]).run(event); try
{
((JavaScriptCallback) arguments[0]).run(event);
}
catch (Exception e)
{
client.getLogger().error("Error in JavaScriptCallback", e);
}
return; return;
} }