import java.awt.FontMetrics;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
/**
* Globally available utility classes, mostly for string manipulation.
*
* @author Jim Menard, <a href="mailto:jimm@io.com">jimm@io.com</a>
*/
public class StringUtils {
/**
* Returns a string with HTML special characters replaced by their entity
* equivalents.
*
* @param str
* the string to escape
* @return a new string without HTML special characters
*/
public static String escapeHTML(String str) {
if (str == null || str.length() == 0)
return "";
StringBuffer buf = new StringBuffer();
int len = str.length();
for (int i = 0; i < len; ++i) {
char c = str.charAt(i);
switch (c) {
case '&':
buf.append("&");
break;
case '<':
buf.append("<");
break;
case '>':
buf.append(">");
break;
case '"':
buf.append(""");
break;
case '\'':
buf.append("'");
break;
default:
buf.append(c);
break;
}
}
return buf.toString();
}
/**
* Returns a new string where all newlines ("\n", "\r", or
* "\r\n") have been replaced by "\n" plus XHTML break
* tags ("\n<br />").
* <p>
* We don't call <code>splitIntoLines</code> because that method does not
* tell us if the string ended with a newline or not.
*
* @param str
* any string
* @return a new string with all newlines replaced by "\n<br
* />"
*/
public static String newlinesToXHTMLBreaks(String str) {
if (str == null || str.length() == 0)
return "";
StringBuffer buf = new StringBuffer();
int len = str.length();
for (int i = 0; i < len; ++i) {
char c = str.charAt(i);
switch (c) {
case '\n':
buf.append("\n<br />");
break;
case '\r':
if (i + 1 < len && str.charAt(i + 1) == '\n') // Look for '\n'
++i;
buf.append("\n<br />");
break;
default:
buf.append(c);
break;
}
}
return buf.toString();
}
/**
* Returns a string with XML special characters replaced by their entity
* equivalents.
*
* @param str
* the string to escape
* @return a new string without XML special characters
*/
public static String escapeXML(String str) {
return escapeHTML(str);
}
/**
* Returns a string with XML entities replaced by their normal characters.
*
* @param str
* the string to un-escape
* @return a new normal string
*/
public static String unescapeXML(String str) {
if (str == null || str.length() == 0)
return "";
StringBuffer buf = new StringBuffer();
int len = str.length();
for (int i = 0; i < len; ++i) {
char c = str.charAt(i);
if (c == '&') {
int pos = str.indexOf(";", i);
if (pos == -1) { // Really evil
buf.append('&');
} else if (str.charAt(i + 1) == '#') {
int val = Integer.parseInt(str.substring(i + 2, pos), 16);
buf.append((char) val);
i = pos;
} else {
String substr = str.substring(i, pos + 1);
if (substr.equals("&"))
buf.append('&');
else if (substr.equals("<"))
buf.append('<');
else if (substr.equals(">"))
buf.append('>');
else if (substr.equals("""))
buf.append('"');
else if (substr.equals("'"))
buf.append('\'');
else
// ????
buf.append(substr);
i = pos;
}
} else {
buf.append(c);
}
}
return buf.toString();
}
/**
* Returns <var>str</var> with leading and trailing spaces trimmed or, if
* <var>str</var> is <code>null</code>, returns <code>null</code>.
*
* @return str trimmed or <code>null</code>
*/
public static String nullOrTrimmed(String str) {
return str == null ? str : str.trim();
}
}
|