📄 javascriptutil.java
字号:
* Remove all newline characters from a string.
* @param text The string to strip newline characters from
* @return The stripped reply
*/
public String stripNewlines(String text)
{
if (text == null)
{
return null;
}
try
{
StringBuffer output = new StringBuffer();
BufferedReader in = new BufferedReader(new StringReader(text));
while (true)
{
String line = in.readLine();
if (line == null)
{
break;
}
output.append(line);
output.append(SPACE);
}
output.append('\n');
return output.toString();
}
catch (IOException ex)
{
log.error("IOExecption unexpected.", ex); //$NON-NLS-1$
throw new IllegalArgumentException("IOExecption unexpected."); //$NON-NLS-1$
}
}
/**
* Shrink variable names to a minimum.
* @param text The javascript program to shrink the variable names in.
* @return The shrunk version of the javascript program.
*/
public String shrinkVariableNames(String text)
{
if (text == null)
{
return null;
}
throw new UnsupportedOperationException("Variable name shrinking is not supported"); //$NON-NLS-1$
}
/**
* <p>Escapes the characters in a <code>String</code> using JavaScript String rules.</p>
* <p>Escapes any values it finds into their JavaScript String form.
* Deals correctly with quotes and control-chars (tab, backslash, cr, ff, etc.) </p>
*
* <p>So a tab becomes the characters <code>'\\'</code> and
* <code>'t'</code>.</p>
*
* <p>The only difference between Java strings and JavaScript strings
* is that in JavaScript, a single quote must be escaped.</p>
*
* <p>Example:
* <pre>
* input string: He didn't say, "Stop!"
* output string: He didn\'t say, \"Stop!\"
* </pre>
* </p>
*
* @param str String to escape values in, may be null
* @return String with escaped values, <code>null</code> if null string input
*/
public String escapeJavaScript(String str) {
if (str == null) {
return null;
}
StringBuffer writer = new StringBuffer(str.length() * 2);
int sz;
sz = str.length();
for (int i = 0; i < sz; i++) {
char ch = str.charAt(i);
// handle unicode
if (ch > 0xfff) {
writer.append("\\u" + hex(ch)); //$NON-NLS-1$
} else if (ch > 0xff) {
writer.append("\\u0" + hex(ch)); //$NON-NLS-1$
} else if (ch > 0x7f) {
writer.append("\\u00" + hex(ch)); //$NON-NLS-1$
} else if (ch < 32) {
switch (ch) {
case '\b':
writer.append('\\');
writer.append('b');
break;
case '\n':
writer.append('\\');
writer.append('n');
break;
case '\t':
writer.append('\\');
writer.append('t');
break;
case '\f':
writer.append('\\');
writer.append('f');
break;
case '\r':
writer.append('\\');
writer.append('r');
break;
default :
if (ch > 0xf) {
writer.append("\\u00" + hex(ch)); //$NON-NLS-1$
} else {
writer.append("\\u000" + hex(ch)); //$NON-NLS-1$
}
break;
}
} else {
switch (ch) {
case '\'':
// If we wanted to escape for Java strings then we would
// not need this next line.
writer.append('\\');
writer.append('\'');
break;
case '"':
writer.append('\\');
writer.append('"');
break;
case '\\':
writer.append('\\');
writer.append('\\');
break;
default :
writer.append(ch);
break;
}
}
}
return writer.toString();
}
/**
* <p>Returns an upper case hexadecimal <code>String</code> for the given
* character.</p>
*
* @param ch The character to convert.
* @return An upper case hexadecimal <code>String</code>
*/
private String hex(char ch) {
return Integer.toHexString(ch).toUpperCase();
}
/**
* <p>Unescapes any JavaScript literals found in the <code>String</code>.</p>
* <p>For example, it will turn a sequence of <code>'\'</code> and <code>'n'</code>
* into a newline character, unless the <code>'\'</code> is preceded by another
* <code>'\'</code>.</p>
* @param str the <code>String</code> to unescape, may be null
* @return A new unescaped <code>String</code>, <code>null</code> if null string input
*/
public String unescapeJavaScript(String str) {
if (str == null) {
return null;
}
StringBuffer writer = new StringBuffer(str.length());
int sz = str.length();
StringBuffer unicode = new StringBuffer(4);
boolean hadSlash = false;
boolean inUnicode = false;
for (int i = 0; i < sz; i++) {
char ch = str.charAt(i);
if (inUnicode) {
// if in unicode, then we're reading unicode
// values in somehow
unicode.append(ch);
if (unicode.length() == 4) {
// unicode now contains the four hex digits
// which represents our unicode chacater
try {
int value = Integer.parseInt(unicode.toString(), 16);
writer.append((char) value);
unicode.setLength(0);
inUnicode = false;
hadSlash = false;
} catch (NumberFormatException nfe) {
throw new IllegalArgumentException("Unable to parse unicode value: " + unicode + " cause: " + nfe); //$NON-NLS-1$ //$NON-NLS-2$
}
}
continue;
}
if (hadSlash) {
// handle an escaped value
hadSlash = false;
switch (ch) {
case '\\':
writer.append('\\');
break;
case '\'':
writer.append('\'');
break;
case '\"':
writer.append('"');
break;
case 'r':
writer.append('\r');
break;
case 'f':
writer.append('\f');
break;
case 't':
writer.append('\t');
break;
case 'n':
writer.append('\n');
break;
case 'b':
writer.append('\b');
break;
case 'u':
// uh-oh, we're in unicode country....
inUnicode = true;
break;
default :
writer.append(ch);
break;
}
continue;
} else if (ch == '\\') {
hadSlash = true;
continue;
}
writer.append(ch);
}
if (hadSlash) {
// then we're in the weird case of a \ at the end of the
// string, let's output it anyway.
writer.append('\\');
}
return writer.toString();
}
/**
* Check to see if the given word is reserved or a bad idea in any known
* version of JavaScript.
* @param name The word to check
* @return false if the word is not reserved
*/
public boolean isReservedWord(String name)
{
return reserved.contains(name);
}
/**
* The array of javascript reserved words
*/
private static final String[] RESERVED_ARRAY = new String[]
{
// Reserved and used at ECMAScript 4
"as", //$NON-NLS-1$
"break", //$NON-NLS-1$
"case", //$NON-NLS-1$
"catch", //$NON-NLS-1$
"class", //$NON-NLS-1$
"const", //$NON-NLS-1$
"continue", //$NON-NLS-1$
"default", //$NON-NLS-1$
"delete", //$NON-NLS-1$
"do", //$NON-NLS-1$
"else", //$NON-NLS-1$
"export", //$NON-NLS-1$
"extends", //$NON-NLS-1$
"false", //$NON-NLS-1$
"finally", //$NON-NLS-1$
"for", //$NON-NLS-1$
"function", //$NON-NLS-1$
"if", //$NON-NLS-1$
"import", //$NON-NLS-1$
"in", //$NON-NLS-1$
"instanceof", //$NON-NLS-1$
"is", //$NON-NLS-1$
"namespace", //$NON-NLS-1$
"new", //$NON-NLS-1$
"null", //$NON-NLS-1$
"package", //$NON-NLS-1$
"private", //$NON-NLS-1$
"public", //$NON-NLS-1$
"return", //$NON-NLS-1$
"super", //$NON-NLS-1$
"switch", //$NON-NLS-1$
"this", //$NON-NLS-1$
"throw", //$NON-NLS-1$
"true", //$NON-NLS-1$
"try", //$NON-NLS-1$
"typeof", //$NON-NLS-1$
"use", //$NON-NLS-1$
"var", //$NON-NLS-1$
"void", //$NON-NLS-1$
"while", //$NON-NLS-1$
"with", //$NON-NLS-1$
// Reserved for future use at ECMAScript 4
"abstract", //$NON-NLS-1$
"debugger", //$NON-NLS-1$
"enum", //$NON-NLS-1$
"goto", //$NON-NLS-1$
"implements", //$NON-NLS-1$
"interface", //$NON-NLS-1$
"native", //$NON-NLS-1$
"protected", //$NON-NLS-1$
"synchronized", //$NON-NLS-1$
"throws", //$NON-NLS-1$
"transient", //$NON-NLS-1$
"volatile", //$NON-NLS-1$
// Reserved in ECMAScript 3, unreserved at 4 best to avoid anyway
"boolean", //$NON-NLS-1$
"byte", //$NON-NLS-1$
"char", //$NON-NLS-1$
"double", //$NON-NLS-1$
"final", //$NON-NLS-1$
"float", //$NON-NLS-1$
"int", //$NON-NLS-1$
"long", //$NON-NLS-1$
"short", //$NON-NLS-1$
"static", //$NON-NLS-1$
// I have seen the folowing list as 'best avoided for function names'
// but it seems way to all encompassing, so I'm not going to include it
/*
"alert", "anchor", "area", "arguments", "array", "assign", "blur",
"boolean", "button", "callee", "caller", "captureevents", "checkbox",
"clearinterval", "cleartimeout", "close", "closed", "confirm",
"constructor", "date", "defaultstatus", "document", "element", "escape",
"eval", "fileupload", "find", "focus", "form", "frame", "frames",
"getclass", "hidden", "history", "home", "image", "infinity",
"innerheight", "isfinite", "innerwidth", "isnan", "java", "javaarray",
"javaclass", "javaobject", "javapackage", "length", "link", "location",
"locationbar", "math", "menubar", "mimetype", "moveby", "moveto",
"name", "nan", "navigate", "navigator", "netscape", "number", "object",
"onblur", "onerror", "onfocus", "onload", "onunload", "open", "opener",
"option", "outerheight", "outerwidth", "packages", "pagexoffset",
"pageyoffset", "parent", "parsefloat", "parseint", "password",
"personalbar", "plugin", "print", "prompt", "prototype", "radio", "ref",
"regexp", "releaseevents", "reset", "resizeby", "resizeto",
"routeevent", "scroll", "scrollbars", "scrollby", "scrollto", "select",
"self", "setinterval", "settimeout", "status", "statusbar", "stop",
"string", "submit", "sun", "taint", "text", "textarea", "toolbar",
"top", "tostring", "unescape", "untaint", "unwatch", "valueof", "watch",
"window",
*/
};
private static SortedSet reserved = new TreeSet();
/**
* For easy access ...
*/
static
{
// The Javascript reserved words array so we don't generate illegal javascript
reserved.addAll(Arrays.asList(RESERVED_ARRAY));
}
private static final String SPACE = " "; //$NON-NLS-1$
private static final String COMMENT_ML_START = "/*"; //$NON-NLS-1$
private static final String COMMENT_ML_END = "*/"; //$NON-NLS-1$
private static final String COMMENT_SL_START = "//"; //$NON-NLS-1$
/**
* The log stream
*/
private static final Logger log = Logger.getLogger(JavascriptUtil.class);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -