00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 package com.realtime.crossfire.jxclient.util;
00023
00024 import java.util.ArrayList;
00025 import java.util.Collection;
00026 import org.jetbrains.annotations.NotNull;
00027
00032 public class StringSplitter {
00033
00037 private static final int PREFERRED_LINE_LENGTH = 50;
00038
00042 private static final int MAXIMUM_LINE_LENGTH = 80;
00043
00047 private StringSplitter() {
00048 }
00049
00056 @NotNull
00057 public static String splitAsHtml(@NotNull final String message) {
00058 final StringBuilder sb = new StringBuilder();
00059 for (final String line : split(message)) {
00060 if (sb.length() > 0) {
00061 sb.append("<br>");
00062 }
00063 sb.append(line);
00064 }
00065 return sb.toString();
00066 }
00067
00073 @NotNull
00074 private static Iterable<String> split(@NotNull final String message) {
00075 final String paddedMessage = message.trim()+" ";
00076
00077 final Collection<String> result = new ArrayList<String>();
00078 int start = 0;
00079 while (true) {
00080 while (start < paddedMessage.length() && paddedMessage.charAt(start) == ' ') {
00081 start++;
00082 }
00083 if (start >= paddedMessage.length()) {
00084 break;
00085 }
00086
00087 final int nextSpace = paddedMessage.indexOf(' ', Math.min(start+PREFERRED_LINE_LENGTH, paddedMessage.length()-1));
00088 assert nextSpace != -1;
00089 if (nextSpace-start <= PREFERRED_LINE_LENGTH) {
00090 result.add(paddedMessage.substring(start, nextSpace));
00091 start = nextSpace+1;
00092 } else {
00093 final int prevSpace = paddedMessage.lastIndexOf(' ', nextSpace-1);
00094 if (prevSpace != -1 && prevSpace > start) {
00095 result.add(paddedMessage.substring(start, prevSpace));
00096 start = prevSpace+1;
00097 } else if (nextSpace-start <= MAXIMUM_LINE_LENGTH) {
00098 result.add(paddedMessage.substring(start, nextSpace));
00099 start = nextSpace+1;
00100 } else {
00101 final int end = Math.min(start+MAXIMUM_LINE_LENGTH, paddedMessage.length());
00102 result.add(paddedMessage.substring(start, end));
00103 start = end;
00104 }
00105 }
00106 }
00107 return result;
00108 }
00109
00110 }