X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2FStringUtils.java;h=9e5d654a8252ff3b2b94f4a6b610c016aa526f5c;hb=cc3e72914add9c950f563bf37c6615e8721ad32e;hp=0ceb673104902170a6860294a4aa37b19547a610;hpb=3f8349b761d29cd3d5381f076d706014574eeb43;p=nikiroo-utils.git diff --git a/src/be/nikiroo/utils/StringUtils.java b/src/be/nikiroo/utils/StringUtils.java index 0ceb673..9e5d654 100644 --- a/src/be/nikiroo/utils/StringUtils.java +++ b/src/be/nikiroo/utils/StringUtils.java @@ -10,6 +10,7 @@ import java.text.Normalizer.Form; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.List; import java.util.Scanner; import java.util.regex.Pattern; @@ -25,19 +26,49 @@ import org.unbescape.html.HtmlEscapeType; public class StringUtils { /** * This enum type will decide the alignment of a {@link String} when padding - * is applied or if there is enough horizontal space for it to be aligned. + * or justification is applied (if there is enough horizontal space for it + * to be aligned). */ public enum Alignment { /** Aligned at left. */ - Beginning, + LEFT, /** Centered. */ - Center, + CENTER, /** Aligned at right. */ - End + RIGHT, + /** Full justified (to both left and right). */ + JUSTIFY, + + // Old Deprecated values: + + /** DEPRECATED: please use LEFT. */ + @Deprecated + Beginning, + /** DEPRECATED: please use CENTER. */ + @Deprecated + Center, + /** DEPRECATED: please use RIGHT. */ + @Deprecated + End; + + /** + * Return the non-deprecated version of this enum if needed (or return + * self if not). + * + * @return the non-deprecated value + */ + Alignment undeprecate() { + if (this == Beginning) + return LEFT; + if (this == Center) + return CENTER; + if (this == End) + return RIGHT; + return this; + } } - static private Pattern marks = Pattern - .compile("[\\p{InCombiningDiacriticalMarks}\\p{IsLm}\\p{IsSk}]+"); + static private Pattern marks = getMarks(); /** * Fix the size of the given {@link String} either with space-padding or by @@ -51,7 +82,7 @@ public class StringUtils { * @return the resulting {@link String} of size size */ static public String padString(String text, int width) { - return padString(text, width, true, Alignment.Beginning); + return padString(text, width, true, null); } /** @@ -67,13 +98,19 @@ public class StringUtils { * cut the {@link String} shorter if needed * @param align * align the {@link String} in this position if we have enough - * space + * space (default is Alignment.Beginning) * * @return the resulting {@link String} of size size minimum */ static public String padString(String text, int width, boolean cut, Alignment align) { + if (align == null) { + align = Alignment.LEFT; + } + + align = align.undeprecate(); + if (width >= 0) { if (text == null) text = ""; @@ -84,23 +121,23 @@ public class StringUtils { if (cut) text = text.substring(0, width); } else if (diff > 0) { - if (diff < 2 && align != Alignment.End) - align = Alignment.Beginning; + if (diff < 2 && align != Alignment.RIGHT) + align = Alignment.LEFT; switch (align) { - case Beginning: - text = text + new String(new char[diff]).replace('\0', ' '); - break; - case End: + case RIGHT: text = new String(new char[diff]).replace('\0', ' ') + text; break; - case Center: - default: + case CENTER: int pad1 = (diff) / 2; int pad2 = (diff + 1) / 2; text = new String(new char[pad1]).replace('\0', ' ') + text + new String(new char[pad2]).replace('\0', ' '); break; + case LEFT: + default: + text = text + new String(new char[diff]).replace('\0', ' '); + break; } } } @@ -108,6 +145,54 @@ public class StringUtils { return text; } + /** + * Justify a text into width-sized (at the maximum) lines. + * + * @param text + * the {@link String} to justify + * @param width + * the maximum size of the resulting lines + * + * @return a list of justified text lines + */ + static public List justifyText(String text, int width) { + return justifyText(text, width, null); + } + + /** + * Justify a text into width-sized (at the maximum) lines. + * + * @param text + * the {@link String} to justify + * @param width + * the maximum size of the resulting lines + * @param align + * align the lines in this position (default is + * Alignment.Beginning) + * + * @return a list of justified text lines + */ + static public List justifyText(String text, int width, + Alignment align) { + if (align == null) { + align = Alignment.LEFT; + } + + align = align.undeprecate(); + + switch (align) { + case CENTER: + return StringJustifier.center(text, width); + case RIGHT: + return StringJustifier.right(text, width); + case JUSTIFY: + return StringJustifier.full(text, width); + case LEFT: + default: + return StringJustifier.left(text, width); + } + } + /** * Sanitise the given input to make it more Terminal-friendly by removing * combining characters. @@ -142,7 +227,9 @@ public class StringUtils { if (removeAllAccents) { input = Normalizer.normalize(input, Form.NFKD); - input = marks.matcher(input).replaceAll(""); + if (marks != null) { + input = marks.matcher(input).replaceAll(""); + } } input = Normalizer.normalize(input, Form.NFKC); @@ -164,11 +251,15 @@ public class StringUtils { } /** - * Convert between time in milliseconds to {@link String} in a "static" way - * (to exchange data over the wire, for instance). + * Convert between the time in milliseconds to a {@link String} in a "fixed" + * way (to exchange data over the wire, for instance). + *

+ * Precise to the second. * * @param time - * the time in milliseconds + * the specified number of milliseconds since the standard base + * time known as "the epoch", namely January 1, 1970, 00:00:00 + * GMT * * @return the time as a {@link String} */ @@ -178,21 +269,24 @@ public class StringUtils { } /** - * Convert between time as a {@link String} to milliseconds in a "static" + * Convert between the time as a {@link String} to milliseconds in a "fixed" * way (to exchange data over the wire, for instance). + *

+ * Precise to the second. * * @param displayTime * the time as a {@link String} * - * @return the time in milliseconds + * @return the number of milliseconds since the standard base time known as + * "the epoch", namely January 1, 1970, 00:00:00 GMT, or -1 in case + * of error + * + * @throws ParseException + * in case of parse error */ - static public long toTime(String displayTime) { + static public long toTime(String displayTime) throws ParseException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - try { - return sdf.parse(displayTime).getTime(); - } catch (ParseException e) { - return -1; - } + return sdf.parse(displayTime).getTime(); } /** @@ -289,6 +383,14 @@ public class StringUtils { HtmlEscapeLevel.LEVEL_1_ONLY_MARKUP_SIGNIFICANT); } + /** + * Zip the data and then encode it into Base64. + * + * @param data + * the data + * + * @return the Base64 zipped version + */ public static String zip64(String data) { try { return Base64.encodeBytes(data.getBytes(), Base64.GZIP); @@ -298,6 +400,17 @@ public class StringUtils { } } + /** + * Unconvert from Base64 then unzip the content. + * + * @param data + * the data in Base64 format + * + * @return the raw data + * + * @throws IOException + * in case of I/O error + */ public static String unzip64(String data) throws IOException { ByteArrayInputStream in = new ByteArrayInputStream(Base64.decode(data, Base64.GZIP)); @@ -310,4 +423,19 @@ public class StringUtils { scan.close(); } } + + /** + * The "remove accents" pattern. + * + * @return the pattern, or NULL if a problem happens + */ + private static Pattern getMarks() { + try { + return Pattern + .compile("[\\p{InCombiningDiacriticalMarks}\\p{IsLm}\\p{IsSk}]+"); + } catch (Exception e) { + // Can fail on Android... + return null; + } + } }