package org.neo4j.neoclipse.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().trim();
}
/**
* 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 ( char element : input )
{
if ( element == replaceFrom )
{
buffer.append( replaceTo );
}
else
{
buffer.append( element );
}
}
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;
}
/**
* quote the given String using double quotes, replace all double quotes
* within the given String by doubleing them.
*
* @param input
* @return
*/
public static String quote( String input )
{
return '"' + input.replaceAll( "\"", "\"\"" ) + '"';
}
}