/* * Copyright 2013 Serdar. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package de.fub.utilsmodule.text; /** * * @author Serdar */ import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * Globally available utility classes, mostly for string manipulation. * * 19.03.2013: Changed the functions to work without FontMetrics * * @author Jim Menard, <a href="mailto:jimm@io.com">jimm@io.com</a>, Serdar * Tosun */ public class StringUtils { private static final short MAX_LENGTH = 90; public static String StringAsHtmlWrapString(String string) { List<String> wrap = wrap(string, MAX_LENGTH); StringBuilder stringBuilder = new StringBuilder("<html>"); for (String line : wrap) { stringBuilder.append(line).append("<br/>"); } stringBuilder.append("</html>"); return stringBuilder.toString(); } public static String wrapString(String str) { return wrapString(str, MAX_LENGTH); } public static String wrapString(String str, int maxWidth) { List<String> wrap = wrap(str, maxWidth); StringBuilder stringBuilder = new StringBuilder(); for (String line : wrap) { stringBuilder.append(line).append("\n"); } return stringBuilder.toString(); } /** * Returns an array of strings, one for each line in the string after it has * been wrapped to fit lines of <var>maxWidth</var>. Lines end with any of * cr, lf, or cr lf. A line ending at the end of the string will not output * a further, empty string. * <p> * This code assumes <var>str</var> is not <code>null</code>. * * @param str the string to split * @param maxWidth the max line width, in points * @return a non-empty list of strings */ public static List<String> wrap(String str, int maxWidth) { List<String> lines = splitIntoLines(str); if (lines.isEmpty()) { return lines; } ArrayList<String> strings = new ArrayList<String>(); for (Iterator<String> iter = lines.iterator(); iter.hasNext();) { wrapLineInto(iter.next(), strings, maxWidth); } return strings; } /** * Given a line of text and font metrics information, wrap the line and add * the new line(s) to <var>list</var>. * * @param line a line of text * @param list an output list of strings * @param fm font metrics * @param maxWidth maximum width of the line(s) */ public static void wrapLineInto(String line, List<String> list, int maxWidth) { int len = line.length(); while (len > maxWidth) { // Guess where to split the line. Look for the next space before // or after the guess. int pos; if (len > maxWidth) // Too long { pos = findBreakBefore(line, maxWidth); } else { // Too short or possibly just right pos = len; } list.add(line.substring(0, pos).trim()); line = line.substring(pos).trim(); len = line.length(); } if (len > 0) { list.add(line); } } /** * Returns the index of the first whitespace character or '-' in * <var>line</var> * that is at or before <var>start</var>. Returns -1 if no such character is * found. * * @param line a string * @param start where to star looking */ public static int findBreakBefore(String line, int start) { for (int i = start; i >= 0; --i) { char c = line.charAt(i); if (Character.isWhitespace(c) || c == '-') { return i; } } return -1; } /** * Returns the index of the first whitespace character or '-' in * <var>line</var> * that is at or after <var>start</var>. Returns -1 if no such character is * found. * * @param line a string * @param start where to star looking */ public static int findBreakAfter(String line, int start) { int len = line.length(); for (int i = start; i < len; ++i) { char c = line.charAt(i); if (Character.isWhitespace(c) || c == '-') { return i; } } return -1; } /** * Returns an array of strings, one for each line in the string. Lines end * with any of cr, lf, or cr lf. A line ending at the end of the string will * not output a further, empty string. * <p> * This code assumes <var>str</var> is not <code>null</code>. * * @param str the string to split * @return a non-empty list of strings */ public static List<String> splitIntoLines(String str) { ArrayList<String> strings = new ArrayList<String>(); if (str != null) { int len = str.length(); if (len == 0) { strings.add(""); return strings; } int lineStart = 0; for (int i = 0; i < len; ++i) { char c = str.charAt(i); if (c == '\r') { int newlineLength = 1; if ((i + 1) < len && str.charAt(i + 1) == '\n') { newlineLength = 2; } strings.add(str.substring(lineStart, i)); lineStart = i + newlineLength; if (newlineLength == 2) // skip \n next time through loop { ++i; } } else if (c == '\n') { strings.add(str.substring(lineStart, i)); lineStart = i + 1; } } if (lineStart < len) { strings.add(str.substring(lineStart)); } } return strings; } }