Mega Code Archive

 
Categories / Java Tutorial / Internationalization
 

Word Wrap

/**  * $Revision: 10205 $  * $Date: 2008-04-11 15:48:27 -0700 (Fri, 11 Apr 2008) $  *  * Copyright (C) 2004-2008 Jive Software. All rights reserved.  *  * This software is published under the terms of the GNU Public License (GPL),  * a copy of which is included in this distribution, or a commercial license  * agreement with Jive.  */ import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.text.BreakIterator; import java.util.*; import java.util.concurrent.ConcurrentHashMap; /**  * Utility class to peform common String manipulation algorithms.  */ public class StringUtils {     // Constants used by escapeHTMLTags     private static final char[] QUOTE_ENCODE = "&quot;".toCharArray();     private static final char[] AMP_ENCODE = "&amp;".toCharArray();     private static final char[] LT_ENCODE = "&lt;".toCharArray();     private static final char[] GT_ENCODE = "&gt;".toCharArray();     private StringUtils() {         // Not instantiable.     }     /**      * Reformats a string where lines that are longer than <tt>width</tt>      * are split apart at the earliest wordbreak or at maxLength, whichever is      * sooner. If the width specified is less than 5 or greater than the input      * Strings length the string will be returned as is.      * <p/>      * Please note that this method can be lossy - trailing spaces on wrapped      * lines may be trimmed.      *      * @param input the String to reformat.      * @param width the maximum length of any one line.      * @return a new String with reformatted as needed.      */     public static String wordWrap(String input, int width, Locale locale) {         // protect ourselves         if (input == null) {             return "";         }         else if (width < 5) {             return input;         }         else if (width >= input.length()) {             return input;         }            StringBuilder buf = new StringBuilder(input);         boolean endOfLine = false;         int lineStart = 0;         for (int i = 0; i < buf.length(); i++) {             if (buf.charAt(i) == '\n') {                 lineStart = i + 1;                 endOfLine = true;             }             // handle splitting at width character             if (i > lineStart + width - 1) {                 if (!endOfLine) {                     int limit = i - lineStart - 1;                     BreakIterator breaks = BreakIterator.getLineInstance(locale);                     breaks.setText(buf.substring(lineStart, i));                     int end = breaks.last();                     // if the last character in the search string isn't a space,                     // we can't split on it (looks bad). Search for a previous                     // break character                     if (end == limit + 1) {                         if (!Character.isWhitespace(buf.charAt(lineStart + end))) {                             end = breaks.preceding(end - 1);                         }                     }                     // if the last character is a space, replace it with a \n                     if (end != BreakIterator.DONE && end == limit + 1) {                         buf.replace(lineStart + end, lineStart + end + 1, "\n");                         lineStart = lineStart + end;                     }                     // otherwise, just insert a \n                     else if (end != BreakIterator.DONE && end != 0) {                         buf.insert(lineStart + end, '\n');                         lineStart = lineStart + end + 1;                     }                     else {                         buf.insert(i, '\n');                         lineStart = i + 1;                     }                 }                 else {                     buf.insert(i, '\n');                     lineStart = i + 1;                     endOfLine = false;                 }             }         }         return buf.toString();     } }