From 8665784bb56e185e82aacbaba8c009585edc5511 Mon Sep 17 00:00:00 2001 From: md_5 Date: Sun, 27 Oct 2013 18:23:07 +1100 Subject: [PATCH] Oh right, stage --- .../net/md_5/bungee/util/TextWrapper.java | 110 ++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 proxy/src/main/java/net/md_5/bungee/util/TextWrapper.java diff --git a/proxy/src/main/java/net/md_5/bungee/util/TextWrapper.java b/proxy/src/main/java/net/md_5/bungee/util/TextWrapper.java new file mode 100644 index 00000000..ab770a22 --- /dev/null +++ b/proxy/src/main/java/net/md_5/bungee/util/TextWrapper.java @@ -0,0 +1,110 @@ +package net.md_5.bungee.util; + +public class TextWrapper +{ + + private static final int[] characterWidths = new int[] + { + 1, 9, 9, 8, 8, 8, 8, 7, 9, 8, 9, 9, 8, 9, 9, 9, + 8, 8, 8, 8, 9, 9, 8, 9, 8, 8, 8, 8, 8, 9, 9, 9, + 4, 2, 5, 6, 6, 6, 6, 3, 5, 5, 5, 6, 2, 6, 2, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 5, 6, 5, 6, + 7, 6, 6, 6, 6, 6, 6, 6, 6, 4, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 6, 4, 6, 6, + 3, 6, 6, 6, 6, 6, 5, 6, 6, 2, 6, 5, 3, 6, 6, 6, + 6, 6, 6, 6, 4, 6, 6, 6, 6, 6, 6, 5, 2, 5, 7, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 6, 3, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 4, 6, + 6, 3, 6, 6, 6, 6, 6, 6, 6, 7, 6, 6, 6, 2, 6, 6, + 8, 9, 9, 6, 6, 6, 8, 8, 6, 8, 8, 8, 8, 8, 6, 6, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 6, 9, 9, 9, 5, 9, 9, + 8, 7, 7, 8, 7, 8, 8, 8, 7, 8, 8, 7, 9, 9, 6, 7, + 7, 7, 7, 7, 9, 6, 7, 8, 7, 6, 6, 9, 7, 6, 7, 1 + }; + private static final char COLOR_CHAR = '\u00A7'; + private static final int CHAT_WINDOW_WIDTH = 320; + private static final int CHAT_STRING_LENGTH = 119; + private static final String allowedChars + = " !\"#$%&'()*+,-./\n" + + "0123456789:;<=>?\n" + + "@ABCDEFGHIJKLMNO\n" + + "PQRSTUVWXYZ[\\]^_\n" + + "'abcdefghijklmno\n" + + "pqrstuvwxyz{|}~⌂\n" + + "ÇüéâäàåçêëèïîìÄÅ\n" + + "ÉæÆôöòûùÿÖÜø£Ø׃\n" + + "áíóúñѪº¿®¬½¼¡«»"; + + public static String[] wrapText(final String text) + { + final StringBuilder out = new StringBuilder(); + char colorChar = 'f'; + int lineWidth = 0; + int lineLength = 0; + + // Go over the message char by char. + for ( int i = 0; i < text.length(); i++ ) + { + char ch = text.charAt( i ); + + // Get the color + if ( ch == COLOR_CHAR && i < text.length() - 1 ) + { + // We might need a linebreak ... so ugly ;( + if ( lineLength + 2 > CHAT_STRING_LENGTH ) + { + out.append( '\n' ); + lineLength = 0; + if ( colorChar != 'f' && colorChar != 'F' ) + { + out.append( COLOR_CHAR ).append( colorChar ); + lineLength += 2; + } + } + colorChar = text.charAt( ++i ); + out.append( COLOR_CHAR ).append( colorChar ); + lineLength += 2; + continue; + } + + // Figure out if it's allowed + int index = allowedChars.indexOf( ch ); + if ( index == -1 ) + { + // Invalid character .. skip it. + continue; + } else + { + // Sadly needed as the allowedChars string misses the first + index += 32; + } + + // Find the width + final int width = characterWidths[index]; + + // See if we need a linebreak + if ( lineLength + 1 > CHAT_STRING_LENGTH || lineWidth + width >= CHAT_WINDOW_WIDTH ) + { + out.append( '\n' ); + lineLength = 0; + + // Re-apply the last color if it isn't the default + if ( colorChar != 'f' && colorChar != 'F' ) + { + out.append( COLOR_CHAR ).append( colorChar ); + lineLength += 2; + } + lineWidth = width; + } else + { + lineWidth += width; + } + out.append( ch ); + lineLength++; + } + + // Return it split + return out.toString().split( "\n" ); + } +}