package edu.brown.utils; import java.util.regex.Pattern; /** * Utility class for printing boxes around text * @author pavlo */ public abstract class StringBoxUtil { private static final Pattern LINE_SPLIT = Pattern.compile("\n"); private static final String DEFAULT_MARKER = "*"; public static final String UNICODE_BOX_CORNERS[] = {"\u250C", "\u2510", "\u2514", "\u2518"}; public static final String UNICODE_BOX_VERTICAL = "\u2502"; public static final String UNICODE_BOX_HORIZONTAL = "\u2500"; public static final String UNICODE_HEAVYBOX_CORNERS[] = {"\u250F", "\u2513", "\u2517", "\u251B"}; public static final String UNICODE_HEAVYBOX_VERTICAL = "\u2503"; public static final String UNICODE_HEAVYBOX_HORIZONTAL = "\u2501"; /** * * @param str * @param horzMark * @param vertMark * @param max_len * @param corners * @return */ public static String box(String str, String horzMark, String vertMark, Integer max_len, String corners[]) { String lines[] = LINE_SPLIT.split(str); if (lines.length == 0) return (""); // CORNERS: // 0: Top-Left // 1: Top-Right // 2: Bottom-Left // 3: Bottom-Right if (corners == null) { corners = new String[]{horzMark, horzMark, horzMark, horzMark}; } if (max_len == null) { for (String line : lines) { if (max_len == null || line.length() > max_len) max_len = line.length(); } // FOR } final String top_line = corners[0] + StringUtil.repeat(horzMark, max_len + 2) + corners[1]; // padding - two corners final String bot_line = corners[2] + StringUtil.repeat(horzMark, max_len + 2) + corners[3]; // padding - two corners final String f = "%s %-" + max_len + "s %s\n"; StringBuilder sb = new StringBuilder(); sb.append(top_line).append("\n"); for (String line : lines) { sb.append(String.format(f, vertMark, line, vertMark)); } // FOR sb.append(bot_line); return (sb.toString()); } /** * Heavy unicode border box * @param str * @return */ public static String heavyBox(String str) { return box(str, StringBoxUtil.UNICODE_HEAVYBOX_HORIZONTAL, StringBoxUtil.UNICODE_HEAVYBOX_VERTICAL, null, StringBoxUtil.UNICODE_HEAVYBOX_CORNERS); } /** * Create a box around some text * * @param str * @param mark * @param max_len * @return */ public static String box(String str, String mark, Integer max_len) { return box(str, mark, mark, max_len, null); } /** * Make a box around some text using the given marker character. * * @param str * @param mark * @return */ public static String box(String str, String mark) { return (box(str, mark, null)); } /** * Make a box around some text. If str has multiple lines, then the box will * be the length of the longest string. * * @param str * @return */ public static String box(String str) { return (box(str, DEFAULT_MARKER, null)); } }