package net.sourceforge.sqlexplorer.util; /** * Text handling utility. * * @author Davy Vanherbergen * @author Rocco Rutte <a href="mailto:pdmef@gmx.net"><pdmef@gmx.net></a>. */ public class TextUtil { public static final int DEFAULT_WRAPLENGTH = 150; private static final String NEWLINE_SEPARATOR = "\n"; private static final String NEWLINE_EXPR = "\\n"; private static final String RETURN_EXPR = "\\r"; private static final String TAB_EXPR = "\\t"; /** * Clear all linebreaks and carriage returns from input text. * @return cleaned string */ public static String removeLineBreaks(String input) { if (input == null) { return null; } String tmp = input.replaceAll(NEWLINE_EXPR, " "); tmp = tmp.replaceAll(TAB_EXPR, " "); return tmp.replaceAll(RETURN_EXPR, ""); } /** * Return the text reformatted to have a max charwidth of maxWidth. * @param maxWidth number of chars that the text can be wide. */ public static String getWrappedText(String input) { return getWrappedText(input, DEFAULT_WRAPLENGTH); } /** * Return the text reformatted to have a max charwidth of maxWidth. * @param maxWidth number of chars that the text can be wide. */ public static String getWrappedText(String input, int maxWidth) { if (input == null) { return ""; } String[] text = input.split(NEWLINE_EXPR); String wrappedText = ""; for (int i = 0; i < text.length; i++) { text[i] = text[i].replaceAll(RETURN_EXPR, ""); if (text[i].length() == 0) { continue; } if (text[i].length() <= maxWidth) { wrappedText += text[i]; if (i < text.length - 1) { wrappedText += NEWLINE_SEPARATOR; } } else { String tmp = text[i]; while (tmp.length() > maxWidth) { for (int j = tmp.length() - 1; j >= 0; j--) { if (j < maxWidth) { char c = text[i].charAt(j); if (c == ',') { wrappedText += tmp.substring(0, j + 1); wrappedText += NEWLINE_SEPARATOR; tmp = tmp.substring(j + 1); break; } if (c == ' ') { wrappedText += tmp.substring(0, j + 1); wrappedText += NEWLINE_SEPARATOR; tmp = tmp.substring(j + 1); break; } } if (j == 0) { wrappedText += tmp.substring(0, maxWidth + 1); tmp = ""; break; } } } wrappedText += tmp; wrappedText += NEWLINE_SEPARATOR; } } return wrappedText; } /** * Trims whitespace from a string and compresses all internal whitespace * down to a single space. * @param source the string to compress * @return the compressed string */ public static String compressWhitespace(CharSequence source) { return compressWhitespace(source, 0); } /** * Trims whitespace from a string and compresses all internal whitespace * down to a single space. Keeps the length of the string to at most * maxLength, but if it truncates then it makes the last 3 characters * an elipsis * @param source the string to compress * @param maxLength maximum length of the result * @return the compressed string */ public static String compressWhitespace(CharSequence source, int maxLength) { StringBuffer sb = new StringBuffer(source); // Trim leading whitespace while (sb.length() > 0 && Character.isWhitespace(sb.charAt(0))) sb.deleteCharAt(0); boolean lastWasWhite = false; for (int i = 0; i < sb.length(); i++) { if (Character.isWhitespace(sb.charAt(i))) { if (lastWasWhite) { // Delete continguous whitespace sb.deleteCharAt(i); i--; } else { lastWasWhite = true; // Force all whitespace to be a space - IE no funny characters for CR etc sb.setCharAt(i, ' '); } } else lastWasWhite = false; } // Optionally trim to size if (maxLength > 0 && sb.length() > maxLength) { if (maxLength > 3) { sb.delete(maxLength - 3, sb.length()); sb.append("..."); } else sb.delete(maxLength, sb.length()); } return sb.toString(); } /** * Replace all occurrences of replaceFrom in inputString with replaceTo. * * @param inputString string to update * @param replaceFrom occurrences to replace * @param replaceTo string that replaces occurrences * @return */ public static String replaceChar(String inputString, char replaceFrom, String replaceTo) { if (inputString == null || inputString.length() == 0) { return inputString; } StringBuffer buffer = new StringBuffer(); char[] input = inputString.toCharArray(); for (int i = 0; i < input.length; i++) { if (input[i] == replaceFrom) { buffer.append(replaceTo); } else { buffer.append(input[i]); } } return buffer.toString(); } /** * Remove trailing spaces from input. * @param input Input string. * @return String without trailing spaces. */ public static String rtrim(String input) { if (input == null) return null; int i = 0; for (i = input.length() - 1; i >= 0 && Character.isWhitespace(input.charAt(i)); i--) ; return input.substring(0, i + 1); } /** * Escape input string suitable for HTML output. * @param input Input string. * @return String with most dangerous characters escaped. */ public static String htmlEscape(String input) { String ret = input.replaceAll("&", "&"); ret = ret.replaceAll("<", "<"); ret = ret.replaceAll(">", ">"); return ret; } }