blob: a5431ac3b1da0258e7c782f9458710262e9639c7 [file] [log] [blame]
/*
* Copyright (C) 2011 The Android Open Source Project
*
* 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 com.android.utils;
public abstract class LineUtil {
/**
* Reformats a line so that it fits in 78 characters max.
* <p/>
* When wrapping the second line and following, prefix the string with a number of
* spaces. This will use the first colon (:) to determine the prefix size
* or use 4 as a minimum if there are no colons in the string.
*
* @param line The line to reflow. Must be non-null.
* @return A new line to print as-is, that contains \n as needed.
*/
public static String reflowLine(String line) {
final int maxLen = 78;
// Most of time the line will fit in the given length and this will be a no-op
int n = line.length();
int cr = line.indexOf('\n');
if (n <= maxLen && (cr == -1 || cr == n - 1)) {
return line;
}
int prefixSize = line.indexOf(':') + 1;
// If there' some spacing after the colon, use the same when wrapping
if (prefixSize > 0 && prefixSize < maxLen) {
while(prefixSize < n && line.charAt(prefixSize) == ' ') {
prefixSize++;
}
} else {
prefixSize = 4;
}
String prefix = String.format(
"%-" + Integer.toString(prefixSize) + "s", //$NON-NLS-1$ //$NON-NLS-2$
" "); //$NON-NLS-1$
StringBuilder output = new StringBuilder(n + prefixSize);
while (n > 0) {
cr = line.indexOf('\n');
if (n <= maxLen && (cr == -1 || cr == n - 1)) {
output.append(line);
break;
}
// Line is longer than the max length, find the first character before and after
// the whitespace where we want to break the line.
int posNext = maxLen;
if (cr != -1 && cr != n - 1 && cr <= posNext) {
posNext = cr + 1;
while (posNext < n && line.charAt(posNext) == '\n') {
posNext++;
}
}
while (posNext < n && line.charAt(posNext) == ' ') {
posNext++;
}
while (posNext > 0) {
char c = line.charAt(posNext - 1);
if (c != ' ' && c != '\n') {
posNext--;
} else {
break;
}
}
if (posNext == 0 || (posNext >= n && maxLen < n)) {
// We found no whitespace separator. This should generally not occur.
posNext = maxLen;
}
int posPrev = posNext;
while (posPrev > 0) {
char c = line.charAt(posPrev - 1);
if (c == ' ' || c == '\n') {
posPrev--;
} else {
break;
}
}
output.append(line.substring(0, posPrev)).append('\n');
line = prefix + line.substring(posNext);
n = line.length();
}
return output.toString();
}
/**
* Formats the string using {@link String#format(String, Object...)}
* and then returns the result of {@link #reflowLine(String)}.
*
* @param format The string format.
* @param params The parameters for the string format.
* @return The result of {@link #reflowLine(String)} on the formatted string.
*/
public static String reformatLine(String format, Object...params) {
return reflowLine(String.format(format, params));
}
}