From: Niki Roo Date: Thu, 12 Apr 2018 06:57:23 +0000 (+0200) Subject: Move justify List into StringUtils (tests needed) X-Git-Tag: nikiroo-utils-4.4.0~15 X-Git-Url: http://git.nikiroo.be/?p=nikiroo-utils.git;a=commitdiff_plain;h=dc22eb95c9b74c41e229f48e021a8a0c85992f35 Move justify List into StringUtils (tests needed) --- diff --git a/src/be/nikiroo/utils/StringUtils.java b/src/be/nikiroo/utils/StringUtils.java index 9e5d654..b8468a1 100644 --- a/src/be/nikiroo/utils/StringUtils.java +++ b/src/be/nikiroo/utils/StringUtils.java @@ -9,8 +9,11 @@ import java.text.Normalizer; import java.text.Normalizer.Form; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.AbstractMap; +import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.Map.Entry; import java.util.Scanner; import java.util.regex.Pattern; @@ -193,6 +196,128 @@ public class StringUtils { } } + /** + * 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(List 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(List text, int width, + Alignment align) { + List result = new ArrayList(); + + // Content <-> Bullet spacing (null = no spacing) + List> lines = new ArrayList>(); + StringBuilder previous = null; + StringBuilder tmp = new StringBuilder(); + String previousItemBulletSpacing = null; + String itemBulletSpacing = null; + for (String inputLine : text) { + boolean previousLineComplete = true; + + String current = inputLine.replace("\t", " "); + itemBulletSpacing = getItemSpacing(current); + boolean bullet = isItemLine(current); + if ((previousItemBulletSpacing == null || itemBulletSpacing + .length() <= previousItemBulletSpacing.length()) && !bullet) { + itemBulletSpacing = null; + } + + if (itemBulletSpacing != null) { + current = current.trim(); + if (!current.isEmpty() && bullet) { + current = current.substring(1); + } + current = current.trim(); + previousLineComplete = bullet; + } else { + tmp.setLength(0); + for (String word : current.split(" ")) { + if (word.isEmpty()) { + continue; + } + + if (tmp.length() > 0) { + tmp.append(' '); + } + tmp.append(word.trim()); + } + current = tmp.toString(); + + previousLineComplete = current.isEmpty() + || previousItemBulletSpacing != null + || (previous != null && isFullLine(previous)); + } + + if (previous == null) { + previous = new StringBuilder(); + } else { + if (previousLineComplete) { + lines.add(new AbstractMap.SimpleEntry( + previous.toString(), previousItemBulletSpacing)); + previous.setLength(0); + previousItemBulletSpacing = itemBulletSpacing; + } else { + previous.append(' '); + } + } + + previous.append(current); + + } + + if (previous != null) { + lines.add(new AbstractMap.SimpleEntry(previous + .toString(), previousItemBulletSpacing)); + } + + for (Entry line : lines) { + String content = line.getKey(); + String spacing = line.getValue(); + + String bullet = "- "; + if (spacing == null) { + bullet = ""; + spacing = ""; + } + + if (spacing.length() > width + 3) { + spacing = ""; + } + + for (String subline : StringUtils.justifyText(content, width + - (spacing.length() + bullet.length()), align)) { + result.add(spacing + bullet + subline); + if (!bullet.isEmpty()) { + bullet = " "; + } + } + } + + return result; + } + /** * Sanitise the given input to make it more Terminal-friendly by removing * combining characters. @@ -438,4 +563,29 @@ public class StringUtils { return null; } } + + // justify List related: + + static private boolean isFullLine(StringBuilder line) { + return line.length() == 0 // + || line.charAt(line.length() - 1) == '.' + || line.charAt(line.length() - 1) == '"' + || line.charAt(line.length() - 1) == '»'; + } + + static private boolean isItemLine(String line) { + String spacing = getItemSpacing(line); + return spacing != null && line.charAt(spacing.length()) == '-'; + } + + static private String getItemSpacing(String line) { + int i; + for (i = 0; i < line.length(); i++) { + if (line.charAt(i) != ' ') { + return line.substring(0, i); + } + } + + return ""; + } } diff --git a/src/be/nikiroo/utils/main/justify.java b/src/be/nikiroo/utils/main/justify.java index 68f5358..2a83389 100644 --- a/src/be/nikiroo/utils/main/justify.java +++ b/src/be/nikiroo/utils/main/justify.java @@ -1,9 +1,7 @@ package be.nikiroo.utils.main; -import java.util.AbstractMap; import java.util.ArrayList; import java.util.List; -import java.util.Map.Entry; import java.util.Scanner; import be.nikiroo.utils.StringUtils; @@ -37,123 +35,19 @@ public class justify { width = Integer.parseInt(args[1]); } - // TODO: move to utils? - // Content <-> Bullet spacing (null = no spacing) - List> lines = new ArrayList>(); Scanner scan = new Scanner(System.in); scan.useDelimiter("\r\n|[\r\n]"); try { - StringBuilder previous = null; - StringBuilder tmp = new StringBuilder(); - String previousItemBulletSpacing = null; - String itemBulletSpacing = null; + List lines = new ArrayList(); while (scan.hasNext()) { - boolean previousLineComplete = true; - - String current = scan.next().replace("\t", " "); - itemBulletSpacing = getItemSpacing(current); - boolean bullet = isItemLine(current); - if ((previousItemBulletSpacing == null || itemBulletSpacing - .length() <= previousItemBulletSpacing.length()) - && !bullet) { - itemBulletSpacing = null; - } - - if (itemBulletSpacing != null) { - current = current.trim(); - if (!current.isEmpty() && bullet) { - current = current.substring(1); - } - current = current.trim(); - previousLineComplete = bullet; - } else { - tmp.setLength(0); - for (String word : current.split(" ")) { - if (word.isEmpty()) { - continue; - } - - if (tmp.length() > 0) { - tmp.append(' '); - } - tmp.append(word.trim()); - } - current = tmp.toString(); - - previousLineComplete = current.isEmpty() - || previousItemBulletSpacing != null - || (previous != null && isFullLine(previous)); - } - - if (previous == null) { - previous = new StringBuilder(); - } else { - if (previousLineComplete) { - lines.add(new AbstractMap.SimpleEntry( - previous.toString(), previousItemBulletSpacing)); - previous.setLength(0); - previousItemBulletSpacing = itemBulletSpacing; - } else { - previous.append(' '); - } - } - - previous.append(current); - + lines.add(scan.next()); } - if (previous != null) { - lines.add(new AbstractMap.SimpleEntry(previous - .toString(), previousItemBulletSpacing)); + for (String line : StringUtils.justifyText(lines, width, align)) { + System.out.println(line); } } finally { scan.close(); } - - for (Entry line : lines) { - String content = line.getKey(); - String spacing = line.getValue(); - - String bullet = "- "; - if (spacing == null) { - bullet = ""; - spacing = ""; - } - - if (spacing.length() > width + 3) { - spacing = ""; - } - - for (String subline : StringUtils.justifyText(content, width - - (spacing.length() + bullet.length()), align)) { - System.out.println(spacing + bullet + subline); - if (!bullet.isEmpty()) { - bullet = " "; - } - } - } - } - - static private boolean isFullLine(StringBuilder line) { - return line.length() == 0 // - || line.charAt(line.length() - 1) == '.' - || line.charAt(line.length() - 1) == '"' - || line.charAt(line.length() - 1) == '»'; - } - - static private boolean isItemLine(String line) { - String spacing = getItemSpacing(line); - return spacing != null && line.charAt(spacing.length()) == '-'; - } - - static private String getItemSpacing(String line) { - int i; - for (i = 0; i < line.length(); i++) { - if (line.charAt(i) != ' ') { - return line.substring(0, i); - } - } - - return ""; } }