cc.kune.core.server.utils.StringW.java Source code

Java tutorial

Introduction

Here is the source code for cc.kune.core.server.utils.StringW.java

Source

/*
 * Copyright 1999,2004,2012 The Apache Software Foundation.
 *
 * 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.
 */
// Copied from GenerationJava Core Library.
//package com.generationjava.lang;
// copied in kune from:
// http://svn.apache.org/repos/asf/jakarta/taglibs/proper/string/trunk/src/org/apache/taglibs/string/util/StringW.java
package cc.kune.core.server.utils;

import org.apache.commons.lang.StringUtils;

// TODO: Auto-generated Javadoc
/**
 * A set of String library static methods. While extending String or
 * StringBuffer would have been the nicest solution, that is not possible, so a
 * simple set of static methods seems the most workable.
 * 
 * Method ideas have so far been taken from the PHP4, Ruby and .NET languages.
 * 
 * @author bayard@generationjava.com
 * @version 0.4 20010812
 */
final public class StringW {

    /**
     * Quote a string so that it may be used in a regular expression without any
     * parts of the string being considered as a part of the regular expression's
     * control characters.
     * 
     * @param str
     *          the str
     * @return the string
     */
    static public String quoteRegularExpression(final String str) {
        // replace ? + * / . ^ $ as long as they're not in character
        // class. so must be done by hand
        final char[] chrs = str.toCharArray();
        final int sz = chrs.length;
        final StringBuffer buffer = new StringBuffer(2 * sz);
        for (int i = 0; i < sz; i++) {
            switch (chrs[i]) {
            case '[':
            case ']':
            case '?':
            case '+':
            case '*':
            case '/':
            case '.':
            case '^':
            case '$':
                buffer.append("\\");
            default:
                buffer.append(chrs[i]);
            }
        }
        return buffer.toString();
    }

    /**
     * Truncates a string nicely. It will search for the first space after the
     * lower limit and truncate the string there. It will also append any string
     * passed as a parameter to the end of the string. The hard limit can be
     * specified to forcibily truncate a string (in the case of an extremely long
     * word or such). All HTML/XML markup will be stripped from the string prior
     * to processing for truncation.
     * 
     * @param str
     *          String the string to be truncated.
     * @param lower
     *          int value of the lower limit.
     * @param upper
     *          int value of the upper limit, -1 if no limit is desired. If the
     *          uppper limit is lower than the lower limit, it will be adjusted to
     *          be same as the lower limit.
     * @param appendToEnd
     *          String to be appended to the end of the truncated string. This is
     *          appended ONLY if the string was indeed truncated. The append is
     *          does not count towards any lower/upper limits.
     * @return the string
     * @author timster@mac.com
     */
    // @PMD:REVIEWED:AvoidReassigningParameters: by vjrj on 21/05/09 14:13
    public static String truncateNicely(String str, final int lower, int upper, final String appendToEnd) {
        // strip markup from the string
        str = XmlW.removeXml(str);

        // unescape temporarily for length handling
        str = XmlW.unescapeXml(str);

        // quickly adjust the upper if it is set lower than 'lower'
        if (upper < lower) {
            upper = lower;
        }

        // now determine if the string fits within the upper limit
        // if it does, go straight to return, do not pass 'go' and collect $200
        if (str.length() > upper) {
            // the magic location int
            int loc;

            // first we determine where the next space appears after lower
            loc = str.lastIndexOf(' ', upper);

            // now we'll see if the location is greater than the lower limit
            if (loc >= lower) {
                // yes it was, so we'll cut it off here
                str = str.substring(0, loc);
            } else {
                // no it wasnt, so we'll cut it off at the upper limit
                str = str.substring(0, upper);
            }

            // the string was truncated, so we append the appendToEnd String
            str = str + appendToEnd;
        }

        // escape after finished processing string
        str = XmlW.escapeXml(str);

        return str;
    }

    /**
     * Create a word-wrapped version of a String. Wrap at 80 characters and use
     * newlines as the delimiter. If a word is over 80 characters long use a -
     * sign to split it.
     * 
     * @param str
     *          the str
     * @return the string
     */
    static public String wordWrap(final String str) {
        return wordWrap(str, 80, "\n", "-", true);
    }

    /**
     * Create a word-wrapped version of a String. Wrap at a specified width and
     * use newlines as the delimiter. If a word is over the width in lenght use a
     * - sign to split it.
     * 
     * @param str
     *          the str
     * @param width
     *          the width
     * @return the string
     */
    static public String wordWrap(final String str, final int width) {
        return wordWrap(str, width, "\n", "-", true);
    }

    /**
     * Word-wrap a string.
     * 
     * @param str
     *          String to word-wrap
     * @param width
     *          int to wrap at
     * @param delim
     *          String to use to separate lines
     * @param split
     *          String to use to split a word greater than width long
     * 
     * @return String that has been word wrapped (with the delim inside width
     *         boundaries)
     */
    static public String wordWrap(final String str, final int width, final String delim, final String split) {
        return wordWrap(str, width, delim, split, true);
    }

    /**
     * Word-wrap a string.
     * 
     * @param str
     *          String to word-wrap
     * @param width
     *          int to wrap at
     * @param delim
     *          String to use to separate lines
     * @param split
     *          String to use to split a word greater than width long
     * @param delimInside
     *          wheter or not delim should be included in chunk before length
     *          reaches width.
     * 
     * @return String that has been word wrapped
     */
    // @PMD:REVIEWED:AvoidReassigningParameters: by vjrj on 21/05/09 14:13
    static public String wordWrap(final String str, int width, final String delim, final String split,
            final boolean delimInside) {
        final int sz = str.length();

        // System.err.println( ">>>> inside: " + delimInside + " sz : " + sz );

        // / shift width up one. mainly as it makes the logic easier
        width++;

        // our best guess as to an initial size
        final StringBuffer buffer = new StringBuffer(sz / width * delim.length() + sz);

        // every line might include a delim on the end
        // System.err.println( "width before: "+ width );
        if (delimInside) {
            width = width - delim.length();
        } else {
            width--;
        }
        // System.err.println( "width after: "+ width );

        int idx = -1;
        String substr = null;

        // beware: i is rolled-back inside the loop
        for (int i = 0; i < sz; i += width) {

            // on the last line
            if (i > sz - width) {
                buffer.append(str.substring(i));
                // System.err.print("LAST-LINE: "+str.substring(i));
                break;
            }

            // System.err.println("loop[i] is: "+i);
            // the current line
            substr = str.substring(i, i + width);
            // System.err.println( "substr: " + substr );

            // is the delim already on the line
            idx = substr.indexOf(delim);
            // System.err.println( "i: " + i + " idx : " + idx );
            if (idx != -1) {
                buffer.append(substr.substring(0, idx));
                // System.err.println("Substr: '"substr.substring(0,idx)+"'");
                buffer.append(delim);
                i -= width - idx - delim.length();

                // System.err.println("loop[i] is now: "+i);
                // System.err.println("ounfd-whitespace: '"+substr.charAt(idx+1)+"'.");
                // Erase a space after a delim. Is this too obscure?
                if (substr.length() > idx + 1) {
                    if (substr.charAt(idx + 1) != '\n') {
                        if (Character.isWhitespace(substr.charAt(idx + 1))) {
                            i++;
                        }
                    }
                }
                // System.err.println("i -= "+width+"-"+idx);
                continue;
            }

            idx = -1;

            // figure out where the last space is
            final char[] chrs = substr.toCharArray();
            for (int j = width; j > 0; j--) {
                if (Character.isWhitespace(chrs[j - 1])) {
                    idx = j;
                    // System.err.println("Found whitespace: "+idx);
                    break;
                }
            }

            // idx is the last whitespace on the line.
            // System.err.println("idx is "+idx);
            if (idx == -1) {
                for (int j = width; j > 0; j--) {
                    if (chrs[j - 1] == '-') {
                        idx = j;
                        // System.err.println("Found Dash: "+idx);
                        break;
                    }
                }
                if (idx == -1) {
                    buffer.append(substr);
                    buffer.append(delim);
                    // System.err.print(substr);
                    // System.err.print(delim);
                } else {
                    if (idx != width) {
                        idx++;
                    }
                    buffer.append(substr.substring(0, idx));
                    buffer.append(delim);
                    // System.err.print(substr.substring(0,idx));
                    // System.err.print(delim);
                    i -= width - idx;
                }
            } else {
                /*
                 * if(force) { if(idx == width-1) { buffer.append(substr);
                 * buffer.append(delim); } else { // stick a split in. int splitsz =
                 * split.length(); buffer.append(substr.substring(0,width-splitsz));
                 * buffer.append(split); buffer.append(delim); i -= splitsz; } } else {
                 */
                // insert spaces
                buffer.append(substr.substring(0, idx));
                buffer.append(StringUtils.repeat(" ", width - idx));
                // System.err.print(substr.substring(0,idx));
                // System.err.print(StringUtils.repeat(" ",width-idx));
                buffer.append(delim);
                // System.err.print(delim);
                // System.err.println("i -= "+width+"-"+idx);
                i -= width - idx;
                // }
            }
        }
        // System.err.println("\n*************");
        return buffer.toString();
    }
}