Search code examples
javatextword-wrap

Automatic and manual text wrapping in Java


I need as the title says to wrap a text (a String) in Java in both, automatic and manual mode. For automatic mode I use the "word-wrap" library that wrap the text with a max-length characters, but I need also to add a manual mode, like for example with the key "/". Can someone help me please?

I have tried to have a String like "this is an example string/I need to wrap" and also if I use a for loop to split the strings the word wrap, that is executed before. This is an example:

That is an example I need to fix /a example test.

Say the manual wrap key is "/" and the max characters are 35. The result will be:

That is an example I need to fix
a example test.

But here how is it:

That is an example I need to fix
a
example test

Solution

  • Here's a method that demonstrates what you want.

    public static final String wrap(String toWrap, String wrapKey, int maxLineLength) {
        String string = new String();
        String[] words = toWrap.split(" ");
    
        int currentLineLength = 0;
        for (String word : words) {
    
            // Manual warping
            if(word.contains(wrapKey)) {
                while(word.contains(wrapKey)) 
                    word = word.replaceFirst(wrapKey, "\n");
                
                string += (word + " ");
                currentLineLength = 0;
                    
                continue; // Avoid auto-wrapping
            }
            // Auto warping
            if(currentLineLength + word.length() + 1 <= maxLineLength) {
                string += (word + " ");
                currentLineLength += word.length() + 1;
            }
            else {
                string += ("\n" + word + " ");
                currentLineLength = word.length() + 1;
            }
        }
    
        return string.trim();
    }
    

    And using it like so

    String example = "That is an example I need to fix /a example test.";
            
    System.out.println(wrap(example, "/", 35));
    

    You should get

    That is an example I need to fix 
    a example test.
    

    Alternatively your could use the ApacheCommon's WordUtils#wrap method