package org.ripple.power.utils;
public class JSEscape {
public static String unescape(String escaped) {
int length = escaped.length();
int i = 0;
StringBuilder sb = new StringBuilder(escaped.length() / 2);
while (i < length) {
char n = escaped.charAt(i++);
if (n != '%') {
sb.append(n);
} else {
n = escaped.charAt(i++);
int code;
if (n == 'u') {
String slice = escaped.substring(i, i + 4);
code = Integer.valueOf(slice, 16);
i += 4;
} else {
String slice = escaped.substring(i - 1, ++i);
code = Integer.valueOf(slice, 16);
}
sb.append((char) code);
}
}
return sb.toString();
}
public static String escape(String raw) {
int length = raw.length();
int i = 0;
StringBuilder sb = new StringBuilder(raw.length() / 2);
while (i < length) {
char c = raw.charAt(i++);
if (isLetterOrDigit(c) || isEscapeExempt(c)) {
sb.append(c);
} else {
int i1 = raw.codePointAt(i - 1);
String escape = Integer.toHexString(i1);
sb.append('%');
if (escape.length() > 2) {
sb.append('u');
}
sb.append(escape.toUpperCase());
}
}
return sb.toString();
}
private static boolean isLetterOrDigit(char ch) {
return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')
|| (ch >= '0' && ch <= '9');
}
private static boolean isEscapeExempt(char c) {
switch (c) {
case '*':
case '@':
case '-':
case '_':
case '+':
case '.':
case '/':
return true;
default:
return false;
}
}
}